Quip for the Proof Checker
Quip's design favors the production of proofs, not their checking. However, proof checking should still be implementable in an efficient way.
A proof checker must implement a few core algorithms to be able to verify proofs (not to mention the particular set of theories it might support). These are:
-
Congruence Closure: equality is central to Quip, and most equality proofs will be of the shape \( t_1=u_1, \ldots, t_n = u_n \vdash t=u \). These can be checked in \( O(n ~ log(n)) \) time using Congruence Closure (See for example the [EGG paper]).
-
Resolution: clause-level reasoning is done via multiple steps of resolution and boolean paramodulation.
The core rules are resolution:
\[ \cfrac{C_1 \lor l \qquad C_2 \lor \lnot l}{ C_1 \lor C_2 } \]
and boolean paramodulation (where \(t\) is a boolean term):
\[ \cfrac{C_1 \lor (t = u) \qquad C_2 \lor t}{ C1 \lor C_2 \lor u } \]
In practice, in the proof format, "hres" is the rule used to perform a series of such steps from an initial clause.
-
Instantiation: A clause \( C \) contains free variables \( \{ x_1, \ldots, x_n \} \). Given a substitution \( \sigma \triangleq \{ x_1 \mapsto t_1, \ldots, x_n \mapsto t_n \} \), we can deduce \( C\sigma \).