All of these sets will be disjoint by construction
(see Invariants, below). Hence:
+\item[ $\foreign$ ]
+The set of all commits which are not part of a Topbloke branch. We
+call these foreign commits.
+
\item[ $\set A$, $\set P$, $\ldots$ ]
Arbitrary sets of commits. Maybe $\set P = \p$ i.e.\ some $\py$ or $\pn$, but
maybe not.
\item[ $ \patchof{ C } $ ]
-Either $\p$ s.t. $ C \in \p $, or $\bot$.
+Either $\p$ s.t. $ C \in \p $, or $\foreign$.
A function from commits to patches' sets $\p$.
\item[ $ \pancsof{C}{\set P} $ ]
if the user still cares about the Topbloke patch,
git's merge algorithm will DTRT when trying to re-apply the changes.
-\item[ $\displaystyle \mergeof{C}{L}{M}{R} $ ]
-The contents of a git merge result:
+\item[ $\displaystyle \stmtmergeof{L}{M}{R} $ ]
+The proper results of a merge. Formally,
+where $L$, $M$ and $R$ are statements:
+$$
+ \stmtmergeof{L}{M}{R}
+ \equiv
+ \begin{cases}
+ (L \land R) : & \true \\
+ (\neg L \land \neg R) : & \false \\
+ \text{otherwise} : & \neg M
+ \end{cases}
+$$
+
+May also be used where $L$, $M$ and $R$ are sets, in which case
+$$
+ \setmergeof{L}{M}{R}
+ =
+ \left\{
+ \;
+ D \; \middle| \;
+ \setmergeof{ D \in L }{ D \in M }{ D \in R }
+ \;
+ \right\}
+$$
+
+\item[ $\displaystyle \commitmergeof{C}{L}{M}{R} $ ]
+$C$ has exactly the contents of a git merge result:
$\displaystyle 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
+ D = C : & \true \\
+ D \neq C : & \stmtmergeof{ D \isin L }{ D \isin M }{ D \isin R }
\end{cases}
$
+We will refer to this as \commitmergename.
+
\end{basedescript}