X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=topbloke-formulae.git;a=blobdiff_plain;f=article.tex;h=d85a022ff8fb8388f380325f4ffd4ed9e4330d5d;hp=32164de0f7c0c4ab51f14c0b99a2965ddf355fd5;hb=400772c417bd54383994df5a227df88adc769171;hpb=53f9c060d6ef0257657fe8aa9ddb2bb11f18d3bc diff --git a/article.tex b/article.tex index 32164de..d85a022 100644 --- a/article.tex +++ b/article.tex @@ -63,6 +63,12 @@ \newcommand{\qed}{\square} \newcommand{\proof}[1]{{\it Proof.} #1 $\qed$} +\newcommand{\gathbegin}{\begin{gather} \tag*{}} +\newcommand{\gathnext}{\\ \tag*{}} + +\newcommand{\true}{t} +\newcommand{\false}{f} + \begin{document} \section{Notation} @@ -215,12 +221,15 @@ 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 @@ -270,23 +279,70 @@ 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} +\subsection{Coherence and patch inclusion} + +Need to consider $D \in \py$ \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} +Ancestors of $C$: +$ D \le C $. + +Contents of $C$: +$ D \isin C \equiv \ldots \lor \true \text{ so } D \haspatch C $. + +\subsubsection{For $A \haspatch P, D \neq C$:} +Ancestors: $ D \le C \equiv D \le A $. + +Contents: $ D \isin C \equiv D \isin A \lor f $ +so $ D \isin C \equiv D \isin A $. + +So: +\[ A \haspatch P \implies C \haspatch P \] + +\subsubsection{For $A \nothaspatch P$:} + +Firstly, $C \not\in \py$ since if it were, $A \in \py$. +Thus $D \neq C$. -$ C \haspatch \p $ +Now by contents of $A$, $D \notin A$, so $D \notin C$. -$ C \nothaspatch \p $ +So: +\[ A \nothaspatch P \implies C \nothaspatch P \] +$\qed$ + +\subsection{Foreign inclusion:} + +If $D = C$, trivial. For $D \neq C$: +$D \isin C \equiv D \isin A \equiv D \le A \equiv D \le C$. $\qed$ -$ \p \patchisin C $ +\section{Merge} + +Merge commits $L$ and $R$ using merge base $M$ ($M < L, M < R$): +\gathbegin + C \hasparents \{ L, R \} +\gathnext + \patchof{C} = \patchof{L} +\gathnext + D \isin C \equiv + \begin{cases} + (D \isin L \land D \isin R) \lor D = C : & \true \\ + (D \not\isin L \land D \not\isin R) \land D \neq C : & \false \\ + \text{otherwise} : & D \not\isin M + \end{cases} +\end{gather} -$ \p \notpatchisin C $ +\subsection{Conditions} -$ \{ B \} \areparents C $ +\[ \eqn{ Merges Exhaustive }{ + L \in \py => \Bigl[ R \in \py \lor R \in \pn \Bigr] +}\] +\[ \eqn{ Tip Merge }{ + L \in \py \land R \in \py \implies \Bigl[ \text{TBD} \Bigr] +}\] +\[ \eqn{ Base Merge }{ + L \in \py \land R \in \pn \implies \Bigl[ R \ge \baseof{L} \land M = + \baseof{L} \Bigr] +}\] \end{document}