chiark / gitweb /
a wrapper for gather
[topbloke-formulae.git] / article.tex
index 992f0d46204d5007e96878b888bf084b01d57dbc..ad68c2ca763c9f9efd2ce59f75301dde9eae624e 100644 (file)
     {\hbox{\scriptsize$\forall$}}}%
 }
 
-\newcommand{\proof}[1]{{\it Proof.} #1 $\square$}
+
+\newcommand{\qed}{\square}
+\newcommand{\proof}[1]{{\it Proof.} #1 $\qed$}
+
+\newcommand{\gathbegin}{\begin{gather} \tag*{}}
+\newcommand{\gathnext}{\\ \tag*{}}
 
 \begin{document}
 
@@ -81,11 +86,11 @@ $ 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 in non-Topbloke-controlled branches; these are considered
-normal, forward, commits.  For merges and Topbloke-generated
-anticommits, the ``change made'' is only to be thought of as any
-conflict resolution.  This is not a partial order because it is not
-transitive.
+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
@@ -112,7 +117,7 @@ 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.
+See Unique Base, below.
 
 \item[ $ C \haspatch \p $ ]
 $\displaystyle \bigforall_{D \in \py} D \isin C \equiv D \le C $.
@@ -122,14 +127,16 @@ $\displaystyle \bigforall_{D \in \py} D \isin C \equiv D \le C $.
 $\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 patch is merged into a non-Topbloke branch and we inherit
-it, we hope that git's merge algorithm will DTRT.
+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
 }\]
@@ -147,13 +154,16 @@ it, we hope that git's merge algorithm will DTRT.
 \[\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 \left[ D \isin \baseof{C} \land (D \in \py \land D \le C
-      \right )]
+    \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.
 
@@ -198,7 +208,8 @@ $ \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 C$, or $\exists_{A' \in \pancs()} \; A' \neq A \land A \le A' $
+$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''$.
@@ -207,18 +218,70 @@ by the LHS.  And $A \le A''$.
 \section{Commit annotation}
 
 We annotate each Topbloke commit $C$ with:
-\begin{gather}
-\tag*{} \patchof{C} \\
-\tag*{} \baseof{C}, \text{ if } C \in \py \\
-\tag*{} \bigforall_{\pa{Q}} 
-        \text{ either } C \haspatch \pa{Q} \text{ or } C \nothaspatch \pa{Q} \\
-\tag*{} \bigforall_{\pay{Q} \not\ni C} \pendsof{C}{\pay{Q}}
+\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
-break making plain commits with git because the recorded $\pends$
+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\}$.
+$\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}