chiark / gitweb /
fixes: correct suitable tips
[topbloke-formulae.git] / article.tex
index ad68c2ca763c9f9efd2ce59f75301dde9eae624e..1e7adc26461f2083df2e4199726814428a396255 100644 (file)
@@ -1,4 +1,5 @@
 \documentclass[a4paper,leqno]{strayman}
+\errorcontextlines=50
 \let\numberwithin=\notdef
 \usepackage{amsmath}
 \usepackage{mathabx}
@@ -7,8 +8,20 @@
 \usepackage{mdwlist}
 %\usepackage{accents}
 
+\usepackage{fancyhdr}
+\pagestyle{fancy}
+\rhead[\rightmark]{}
+\lhead[]{\rightmark}
+\rfoot[\thepage]{\input{revid.inc}}
+\lfoot[\input{revid.inc}]{\thepage}
+
+\let\stdsection\section
+\renewcommand\section{\newpage\stdsection}
+
 \renewcommand{\ge}{\geqslant}
 \renewcommand{\le}{\leqslant}
+\newcommand{\nge}{\ngeqslant}
+\newcommand{\nle}{\nleqslant}
 
 \newcommand{\has}{\sqsupseteq}
 \newcommand{\isin}{\sqsubseteq}
 \newcommand{\notpatchisin}{\mathrel{\,\not\!\not\relax\patchisin}}
 \newcommand{\haspatch}{\sqSupset}
 \newcommand{\patchisin}{\sqSubset}
+%\newcommand{\zhaspatch}{\mathrel{\underset{\fullmoon}\sqSupset}}
+\newcommand{\zhaspatch}{\mathrel{\sqSupset_\varnothing\mkern-4mu}}
+
+        \newif\ifhidehack\hidehackfalse
+        \DeclareRobustCommand\hidefromedef[2]{%
+          \hidehacktrue\ifhidehack#1\else#2\fi\hidehackfalse}
+        \newcommand{\pa}[1]{\hidefromedef{\varmathbb{#1}}{#1}}
 
-\newcommand{\set}[1]{\mathbb #1}
-\newcommand{\pa}[1]{\varmathbb #1}
+\newcommand{\set}[1]{\mathbb{#1}}
 \newcommand{\pay}[1]{\pa{#1}^+}
 \newcommand{\pan}[1]{\pa{#1}^-}
 
 \newcommand{\py}{\pay{P}}
 \newcommand{\pn}{\pan{P}}
 
+\newcommand{\pc}{\pa{C}}
+\newcommand{\pcy}{\pay{C}}
+\newcommand{\pcn}{\pan{C}}
+
+\newcommand{\pd}{\pa{D}}
+\newcommand{\pdy}{\pay{D}}
+\newcommand{\pdn}{\pan{D}}
+
+\newcommand{\pl}{\pa{L}}
+\newcommand{\ply}{\pay{L}}
+\newcommand{\pln}{\pan{L}}
+
+\newcommand{\pq}{\pa{Q}}
+\newcommand{\pqy}{\pay{Q}}
+\newcommand{\pqn}{\pan{Q}}
+
+\newcommand{\pr}{\pa{R}}
+\newcommand{\pry}{\pay{R}}
+\newcommand{\prn}{\pan{R}}
+
 %\newcommand{\hasparents}{\underaccent{1}{>}}
 %\newcommand{\hasparents}{{%
 %  \declareslashed{}{_{_1}}{0}{-0.8}{>}\slashed{>}}}
-\newcommand{\hasparents}{>_{\mkern-7.0mu _1}}
-\newcommand{\areparents}{<_{\mkern-14.0mu _1\mkern+5.0mu}}
+\newcommand{\hasparents}{>_{\mkern-7.0mu _{1:}}}
+\newcommand{\areparents}{<_{\mkern-14.0mu _{1:}\mkern+5.0mu}}
 
 \renewcommand{\implies}{\Rightarrow}
 \renewcommand{\equiv}{\Leftrightarrow}
+\renewcommand{\nequiv}{\nLeftrightarrow}
 \renewcommand{\land}{\wedge}
 \renewcommand{\lor}{\vee}
 
 \newcommand{\pancsof}[2]{\pancs ( #1 , #2 ) }
 \newcommand{\pendsof}[2]{\pends ( #1 , #2 ) }
 
-\newcommand{\patchof}[1]{{\mathcal P} ( #1 ) }
-\newcommand{\baseof}[1]{{\mathcal B} ( #1 ) }
+\newcommand{\merge}{{\mathcal M}}
+\newcommand{\mergeof}[4]{\merge(#1,#2,#3,#4)}
+%\newcommand{\merge}[4]{{#2 {{\frac{ #1 }{ #3 } #4}}}}
+
+\newcommand{\patch}{{\mathcal P}}
+\newcommand{\base}{{\mathcal B}}
+\newcommand{\depsreq}{{\mathcal G}}
+
+\newcommand{\patchof}[1]{\patch ( #1 ) }
+\newcommand{\baseof}[1]{\base ( #1 ) }
+\newcommand{\depsreqof}[1]{\depsreq ( #1 ) }
 
+\newcommand{\allpatches}{\Upsilon}
+\newcommand{\assign}{\leftarrow}
+\newcommand{\iassign}{\leftarrow}
+%\newcommand{\assign}{' =}
+
+\newcommand{\alg}[1]{\text{\bf #1}}
+\newcommand{\setmerge}{\alg{merge}}
+\newcommand{\setmergeof}[3]{\setmerge\left\langle #1 \;\middle\langle #2 \middle\rangle\; #3 \right\rangle}
+%\newcommand{\setmergeof}[3]{\setmerge\left\lgroup #1 \;\middle\lmoustache\; #2 \;\middle\rmoustache\; #3 \right\rgroup}
+%\newcommand{\setmergeof}[3]{\setmerge\left\rmoustache #1 \middle\rmoustache #2 \middle\lmoustache #3 \right\lmoustache}
+%\newcommand{\setmergeof}[3]{\setmerge\left\lfloor #1 \middle\lfloor #2 \middle\rfloor #3 \right\rfloor}
+
+\newcommand{\eqntag}[2]{ #2 \tag*{\mbox{#1}} }
 \newcommand{\eqn}[2]{ #2 \tag*{\mbox{\bf #1}} }
-\newcommand{\corrolary}[1]{ #1 \tag*{\mbox{\it Corrolary.}} }
+
+\newcommand{\hasdirdep}{\succ_{\mkern-7.0mu _1}}
+\newcommand{\hasdep}{\succ}
+\newcommand{\isdep}{\prec}
+\newcommand{\isdirdep}{\prec_{\mkern-18.0mu _1}{\mkern+10mu}}
+
+\newcommand{\tip}{ T }
+\newcommand{\tipa}[1]{ \tip^{#1} }
+\newcommand{\tipcn}{ \tipa \pcn }
+\newcommand{\tipcy}{ \tipa \pcy }
+\newcommand{\tipdn}{ \tipa \pdn }
+\newcommand{\tipdy}{ \tipa \pdy }
 
 %\newcommand{\bigforall}{\mathop{\hbox{\huge$\forall$}}}
 \newcommand{\bigforall}{%
     {\hbox{\normalsize$\forall$}}%
     {\hbox{\scriptsize$\forall$}}}%
 }
+\newcommand{\bigexists}{%
+  \mathop{\mathchoice%
+    {\hbox{\huge$\exists$}}%
+    {\hbox{\Large$\exists$}}%
+    {\hbox{\normalsize$\exists$}}%
+    {\hbox{\scriptsize$\exists$}}}%
+}
 
+\newcommand{\Largeexists}{\mathop{\hbox{\Large$\exists$}}}
+\newcommand{\Largenexists}{\mathop{\hbox{\Large$\nexists$}}}
 
 \newcommand{\qed}{\square}
-\newcommand{\proof}[1]{{\it Proof.} #1 $\qed$}
+\newcommand{\proofstarts}{{\it Proof:}}
+\newcommand{\proof}[1]{\proofstarts #1 $\qed$}
 
 \newcommand{\gathbegin}{\begin{gather} \tag*{}}
 \newcommand{\gathnext}{\\ \tag*{}}
 
-\begin{document}
-
-\section{Notation}
+\newcommand{\true}{t}
+\newcommand{\false}{f}
 
-\begin{basedescript}{
-\desclabelwidth{5em}
-\desclabelstyle{\nextlinelabel}
-}
-\item[ $ C \hasparents \set X $ ]
-The parents of commit $C$ are exactly the set
-$\set X$.
-
-\item[ $ C \ge D $ ]
-$C$ is a descendant of $D$ in the git commit
-graph.  This is a partial order, namely the transitive closure of 
-$ D \in \set X $ where $ C \hasparents \set X $.
-
-\item[ $ C \has D $ ]
-Informally, the tree at commit $C$ contains the change
-made in commit $D$.  Does not take account of deliberate reversions by
-the user or reversion, rebasing or rewinding in
-non-Topbloke-controlled branches.  For merges and Topbloke-generated
-anticommits or re-commits, the ``change made'' is only to be thought
-of as any conflict resolution.  This is not a partial order because it
-is not transitive.
-
-\item[ $ \p, \py, \pn $ ]
-A patch $\p$ consists of two sets of commits $\pn$ and $\py$, which
-are respectively the base and tip git branches.  $\p$ may be used
-where the context requires a set, in which case the statement
-is to be taken as applying to both $\py$ and $\pn$.
-All these sets are distinct.  Hence:
-
-\item[ $ \patchof{ C } $ ]
-Either $\p$ s.t. $ C \in \p $, or $\bot$.  
-A function from commits to patches' sets $\p$.
-
-\item[ $ \pancsof{C}{\set P} $ ]
-$ \{ A \; | \; A \le C \land A \in \set P \} $ 
-i.e. all the ancestors of $C$
-which are in $\set P$.
-
-\item[ $ \pendsof{C}{\set P} $ ]
-$ \{ E \; | \; E \in \pancsof{C}{\set P}
-  \land \mathop{\not\exists}_{A \in \pancsof{C}{\set P}}
-  A \neq E \land E \le A \} $ 
-i.e. all $\le$-maximal commits in $\pancsof{C}{\set P}$.
-
-\item[ $ \baseof{C} $ ]
-$ \pendsof{C}{\pn} = \{ \baseof{C} \} $ where $ C \in \py $.
-A partial function from commits to commits.
-See Unique Base, below.
-
-\item[ $ C \haspatch \p $ ]
-$\displaystyle \bigforall_{D \in \py} D \isin C \equiv D \le C $.
-~ Informally, $C$ has the contents of $\p$.
-
-\item[ $ C \nothaspatch \p $ ]
-$\displaystyle \bigforall_{D \in \py} D \not\isin C $.
-~ Informally, $C$ has none of the contents of $\p$.  
-
-Non-Topbloke commits are $\nothaspatch \p$ for all $\p$; if a Topbloke
-patch is applied to a non-Topbloke branch and then bubbles back to
-the Topbloke patch itself, we hope that git's merge algorithm will
-DTRT or that the user will no longer care about the Topbloke patch.
-
-\end{basedescript}
-\newpage
-\section{Invariants}
-
-We maintain these each time we construct a new commit. \\
-\[ \eqn{No Replay:}{
-  C \has D \implies C \ge D
-}\]
-\[\eqn{Unique Base:}{
- \bigforall_{C \in \py} \pendsof{C}{\pn} = \{ B \}
-}\]
-\[\eqn{Tip Contents:}{
-  \bigforall_{C \in \py} D \isin C \equiv
-    { D \isin \baseof{C} \lor \atop
-      (D \in \py \land D \le C) }
-}\]
-\[\eqn{Base Acyclic:}{
-  \bigforall_{B \in \pn} D \isin B \implies D \notin \py
-}\]
-\[\eqn{Coherence:}{
-  \bigforall_{C,\p} C \haspatch \p \lor C \nothaspatch \p
-}\]
-\[\eqn{Foreign Inclusion:}{
-  \bigforall_{D \text{ s.t. } \patchof{D} = \bot} D \isin C \equiv D \leq C
-}\]
-
-\section{Some lemmas}
-
-\[ \eqn{Exclusive Tip Contents:}{
-  \bigforall_{C \in \py} 
-    \neg \Bigl[ D \isin \baseof{C} \land ( D \in \py \land D \le C )
-      \Bigr]
-}\]
-Ie, the two limbs of the RHS of Tip Contents are mutually exclusive.
-
-\proof{
-Let $B = \baseof{C}$ in $D \isin \baseof{C}$.  Now $B \in \pn$.
-So by Base Acyclic $D \isin B \implies D \notin \py$.
-}
-\[ \corrolary{
-  \bigforall_{C \in \py} D \isin C \equiv
-  \begin{cases}
-    D \in \py : & D \le C \\
-    D \not\in \py : & D \isin \baseof{C}
-  \end{cases}
-}\]
-
-\[ \eqn{Tip Self Inpatch:}{
-  \bigforall_{C \in \py} C \haspatch \p
-}\]
-Ie, tip commits contain their own patch.
-
-\proof{
-Apply Exclusive Tip Contents to some $D \in \py$:
-$ \bigforall_{C \in \py}\bigforall_{D \in \py}
-  D \isin C \equiv D \le C $
-}
-
-\[ \eqn{Exact Ancestors:}{
-  \bigforall_{ C \hasparents \set{R} }
-  D \le C \equiv
-    ( \mathop{\hbox{\huge{$\vee$}}}_{R \in \set R} D \le R )
-    \lor D = C
-}\]
-
-\[ \eqn{Transitive Ancestors:}{
-  \left[ \bigforall_{ E \in \pendsof{C}{\set P} } E \le M \right] \equiv
-  \left[ \bigforall_{ A \in \pancsof{C}{\set P} } A \le M \right]
-}\]
-
-\proof{
-The implication from right to left is trivial because
-$ \pends() \subset \pancs() $.
-For the implication from left to right: 
-by the definition of $\mathcal E$,
-for every such $A$, either $A \in \pends()$ which implies
-$A \le M$ by the LHS directly,
-or $\exists_{A' \in \pancs()} \; A' \neq A \land A \le A' $
-in which case we repeat for $A'$.  Since there are finitely many
-commits, this terminates with $A'' \in \pends()$, ie $A'' \le M$
-by the LHS.  And $A \le A''$.
-}
-
-\section{Commit annotation}
-
-We annotate each Topbloke commit $C$ with:
-\gathbegin
- \patchof{C}
-\gathnext
- \baseof{C}, \text{ if } C \in \py
-\gathnext
- \bigforall_{\pa{Q}} 
-   \text{ either } C \haspatch \pa{Q} \text{ or } C \nothaspatch \pa{Q}
-\gathnext
- \bigforall_{\pay{Q} \not\ni C} \pendsof{C}{\pay{Q}}
-\end{gather}
-
-We do not annotate $\pendsof{C}{\py}$ for $C \in \py$.  Doing so would
-make it wrong to make plain commits with git because the recorded $\pends$
-would have to be updated.  The annotation is not needed because
-$\forall_{\py \ni C} \; \pendsof{C}{\py} = \{C\}$.
-
-\section{Simple commit}
-
-A simple single-parent forward commit $C$ as made by git-commit.
-\begin{gather}
-\tag*{} C \hasparents \{ A \} \\
-\tag*{} \patchof{C} = \patchof{A} \\
-\tag*{} D \isin C \equiv D \isin A \lor D = C
-\end{gather}
-
-\subsection{No Replay}
-Trivial.
-
-\subsection{Unique Base}
-If $A, C \in \py$ then $\baseof{C} = \baseof{A}$. $\qed$
-
-\subsection{Tip Contents}
-We need to consider only $A, C \in \py$.  From Tip Contents for $A$:
-\[ D \isin A \equiv D \isin \baseof{A} \lor ( D \in \py \land D \le A ) \]
-Substitute into the contents of $C$:
-\[ D \isin C \equiv D \isin \baseof{A} \lor ( D \in \py \land D \le A )
-    \lor D = C \]
-Since $D = C \implies D \in \py$, 
-and substituting in $\baseof{C}$, this gives:
-\[ D \isin C \equiv D \isin \baseof{C} \lor
-    (D \in \py \land D \le A) \lor
-    (D = C \land D \in \py) \]
-\[ \equiv D \isin \baseof{C} \lor
-   [ D \in \py \land ( D \le A \lor D = C ) ] \]
-So by Exact Ancestors:
-\[ D \isin C \equiv D \isin \baseof{C} \lor ( D \in \py \land D \le C
-) \]
-$\qed$
-
-\subsection{Base Acyclic}
-
-Need to consider only $A, C \in \pn$.  
-
-For $D = C$: $D \in \pn$ so $D \not\in \py$. OK.
-
-For $D \neq C$: $D \isin C \equiv D \isin A$, so by Base Acyclic for
-$A$, $D \isin C \implies D \not\in \py$. $\qed$
-
-\subsection{Coherence}
-
-\subsubsection{For $A \haspatch P, D = C$:}
-\[ D \isin C \equiv \ldots \lor t \text{ so } D \haspatch C \]
-\[ D \le C \]
-OK
-
-\section{Test more symbols}
+\begin{document}
 
-$ C \haspatch \p $
+\chapter{Data model}
 
-$ C \nothaspatch \p $
+\input{notation.tex}
+\input{invariants.tex}
+\input{lemmas.tex}
+\input{annotations.tex}
 
-$ \p \patchisin C $
+\input{simple.tex}
+\input{create-base.tex}
+\input{create-tip.tex}
+\input{anticommit.tex}
+\input{merge.tex}
 
-$ \p \notpatchisin C $
+\chapter{Update strategy}
 
-$ \{ B \} \areparents C $
+\input{strategy.tex}
 
 \end{document}