sidekick/dev/sidekick-base/Sidekick_base/Proof/index.html
2021-11-29 00:14:38 +00:00

2 lines
No EOL
29 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Proof (sidekick-base.Sidekick_base.Proof)</title><link rel="stylesheet" href="../../../odoc.css"/><meta charset="utf-8"/><meta name="generator" content="odoc 2.0.0"/><meta name="viewport" content="width=device-width,initial-scale=1.0"/><script src="../../../highlight.pack.js"></script><script>hljs.initHighlightingOnLoad();</script></head><body class="odoc"><nav class="odoc-nav"><a href="../index.html">Up</a> <a href="../../index.html">sidekick-base</a> &#x00BB; <a href="../index.html">Sidekick_base</a> &#x00BB; Proof</nav><header class="odoc-preamble"><h1>Module <code><span>Sidekick_base.Proof</span></code></h1><p>Proof representation</p></header><nav class="odoc-toc"><ul><li><a href="#main-proof-api">Main Proof API</a></li><li><a href="#creation">Creation</a></li><li><a href="#use-the-proof">Use the proof</a></li></ul></nav><div class="odoc-content"><div class="odoc-spec"><div class="spec module" id="module-Config" class="anchored"><a href="#module-Config" class="anchor"></a><code><span><span class="keyword">module</span> </span><span><a href="Config/index.html">Config</a></span><span> : <span class="keyword">sig</span> ... <span class="keyword">end</span></span></code></div><div class="spec-doc"><p>Configuration of proofs</p></div></div><h3 id="main-proof-api"><a href="#main-proof-api" class="anchor"></a>Main Proof API</h3><div class="odoc-spec"><div class="spec type" id="type-t" class="anchored"><a href="#type-t" class="anchor"></a><code><span><span class="keyword">type</span> t</span></code></div><div class="spec-doc"><p>A container for the whole proof</p></div></div><div class="odoc-spec"><div class="spec type" id="type-proof_step" class="anchored"><a href="#type-proof_step" class="anchor"></a><code><span><span class="keyword">type</span> proof_step</span></code></div><div class="spec-doc"><p>A proof step in the trace.</p><p>The proof will store all steps, and at the end when we find the empty clause we can filter them to keep only the relevant ones.</p></div></div><div class="odoc-include"><details open="open"><summary class="spec include"><code><span><span class="keyword">include</span> <a href="../../../sidekick/Sidekick_core/module-type-PROOF/index.html">Sidekick_core.PROOF</a> <span class="keyword">with</span> <span><span class="keyword">type</span> <a href="../../../sidekick/Sidekick_core/module-type-PROOF/index.html#type-t">t</a> := <a href="#type-t">t</a></span> <span class="keyword">and</span> <span><span class="keyword">type</span> <a href="../../../sidekick/Sidekick_core/module-type-PROOF/index.html#type-proof_step">proof_step</a> := <a href="#type-proof_step">proof_step</a></span> <span class="keyword">and</span> <span><span class="keyword">type</span> <a href="../../../sidekick/Sidekick_core/module-type-PROOF/index.html#type-lit">lit</a> = <a href="../Lit/index.html#type-t">Lit.t</a></span> <span class="keyword">and</span> <span><span class="keyword">type</span> <a href="../../../sidekick/Sidekick_core/module-type-PROOF/index.html#type-term">term</a> = <a href="../Base_types/Term/index.html#type-t">Base_types.Term.t</a></span></span></code></summary><div class="odoc-spec"><div class="spec type" id="type-term" class="anchored"><a href="#type-term" class="anchor"></a><code><span><span class="keyword">type</span> term</span><span> = <a href="../Base_types/Term/index.html#type-t">Base_types.Term.t</a></span></code></div></div><div class="odoc-spec"><div class="spec type" id="type-lit" class="anchored"><a href="#type-lit" class="anchor"></a><code><span><span class="keyword">type</span> lit</span><span> = <a href="../Lit/index.html#type-t">Lit.t</a></span></code></div></div><div class="odoc-spec"><div class="spec type" id="type-proof_rule" class="anchored"><a href="#type-proof_rule" class="anchor"></a><code><span><span class="keyword">type</span> proof_rule</span><span> = <span><a href="#type-t">t</a> <span class="arrow">&#45;&gt;</span></span> <a href="#type-proof_step">proof_step</a></span></code></div></div><div class="odoc-include"><details open="open"><summary class="spec include"><code><span><span class="keyword">include</span> <a href="../../../sidekick/Sidekick_core/module-type-CC_PROOF/index.html">Sidekick_core.CC_PROOF</a> <span class="keyword">with</span> <span><span class="keyword">type</span> <a href="../../../sidekick/Sidekick_core/module-type-CC_PROOF/index.html#type-t">t</a> := <a href="#type-t">t</a></span> <span class="keyword">and</span> <span><span class="keyword">type</span> <a href="../../../sidekick/Sidekick_core/module-type-CC_PROOF/index.html#type-lit">lit</a> := <a href="#type-lit">lit</a></span> <span class="keyword">and</span> <span><span class="keyword">type</span> <a href="../../../sidekick/Sidekick_core/module-type-CC_PROOF/index.html#type-proof_step">proof_step</a> := <a href="#type-proof_step">proof_step</a></span></span></code></summary><div class="odoc-spec"><div class="spec value" id="val-lemma_cc" class="anchored"><a href="#val-lemma_cc" class="anchor"></a><code><span><span class="keyword">val</span> lemma_cc : <span><span><a href="#type-lit">lit</a> <span class="xref-unresolved">Iter</span>.t</span> <span class="arrow">&#45;&gt;</span></span> <span><a href="#type-t">t</a> <span class="arrow">&#45;&gt;</span></span> <a href="#type-proof_step">proof_step</a></span></code></div><div class="spec-doc"><p><code>lemma_cc proof lits</code> asserts that <code>lits</code> form a tautology for the theory of uninterpreted functions.</p></div></div></details></div><div class="odoc-include"><details open="open"><summary class="spec include"><code><span><span class="keyword">include</span> <a href="../../../sidekick/Sidekick_core/module-type-SAT_PROOF/index.html">Sidekick_core.SAT_PROOF</a> <span class="keyword">with</span> <span><span class="keyword">type</span> <a href="../../../sidekick/Sidekick_core/module-type-SAT_PROOF/index.html#type-t">t</a> := <a href="#type-t">t</a></span> <span class="keyword">and</span> <span><span class="keyword">type</span> <a href="../../../sidekick/Sidekick_core/module-type-SAT_PROOF/index.html#type-lit">lit</a> := <a href="#type-lit">lit</a></span> <span class="keyword">and</span> <span><span class="keyword">type</span> <a href="../../../sidekick/Sidekick_core/module-type-SAT_PROOF/index.html#type-proof_step">proof_step</a> := <a href="#type-proof_step">proof_step</a></span> <span class="keyword">and</span> <span><span class="keyword">type</span> <a href="../../../sidekick/Sidekick_core/module-type-SAT_PROOF/index.html#type-proof_rule">proof_rule</a> := <a href="#type-proof_rule">proof_rule</a></span></span></code></summary><div class="odoc-spec"><div class="spec module" id="module-Step_vec" class="anchored"><a href="#module-Step_vec" class="anchor"></a><code><span><span class="keyword">module</span> </span><span><a href="Step_vec/index.html">Step_vec</a></span><span> : <a href="../../../sidekick/Sidekick_util/Vec_sig/module-type-S/index.html">Sidekick_util.Vec_sig.S</a> <span class="keyword">with</span> <span><span class="keyword">type</span> <a href="../../../sidekick/Sidekick_util/Vec_sig/module-type-S/index.html#type-elt">elt</a> = <a href="#type-proof_step">proof_step</a></span></span></code></div><div class="spec-doc"><p>A vector of steps</p></div></div><div class="odoc-spec"><div class="spec value" id="val-enabled" class="anchored"><a href="#val-enabled" class="anchor"></a><code><span><span class="keyword">val</span> enabled : <span><a href="#type-t">t</a> <span class="arrow">&#45;&gt;</span></span> bool</span></code></div><div class="spec-doc"><p>Returns true if proof production is enabled</p></div></div><div class="odoc-spec"><div class="spec value" id="val-emit_input_clause" class="anchored"><a href="#val-emit_input_clause" class="anchor"></a><code><span><span class="keyword">val</span> emit_input_clause : <span><span><a href="#type-lit">lit</a> <span class="xref-unresolved">Iter</span>.t</span> <span class="arrow">&#45;&gt;</span></span> <a href="#type-proof_rule">proof_rule</a></span></code></div><div class="spec-doc"><p>Emit an input clause.</p></div></div><div class="odoc-spec"><div class="spec value" id="val-emit_redundant_clause" class="anchored"><a href="#val-emit_redundant_clause" class="anchor"></a><code><span><span class="keyword">val</span> emit_redundant_clause : <span><span><a href="#type-lit">lit</a> <span class="xref-unresolved">Iter</span>.t</span> <span class="arrow">&#45;&gt;</span></span> <span>hyps:<span><a href="#type-proof_step">proof_step</a> <span class="xref-unresolved">Iter</span>.t</span> <span class="arrow">&#45;&gt;</span></span> <a href="#type-proof_rule">proof_rule</a></span></code></div><div class="spec-doc"><p>Emit a clause deduced by the SAT solver, redundant wrt previous clauses. The clause must be RUP wrt <code>hyps</code>.</p></div></div><div class="odoc-spec"><div class="spec value" id="val-emit_unsat_core" class="anchored"><a href="#val-emit_unsat_core" class="anchor"></a><code><span><span class="keyword">val</span> emit_unsat_core : <span><span><a href="#type-lit">lit</a> <span class="xref-unresolved">Iter</span>.t</span> <span class="arrow">&#45;&gt;</span></span> <a href="#type-proof_rule">proof_rule</a></span></code></div><div class="spec-doc"><p>Produce a proof of the empty clause given this subset of the assumptions. FIXME: probably needs the list of proof_step that disprove the lits?</p></div></div><div class="odoc-spec"><div class="spec value" id="val-emit_unsat" class="anchored"><a href="#val-emit_unsat" class="anchor"></a><code><span><span class="keyword">val</span> emit_unsat : <span><a href="#type-proof_step">proof_step</a> <span class="arrow">&#45;&gt;</span></span> <span><a href="#type-t">t</a> <span class="arrow">&#45;&gt;</span></span> unit</span></code></div><div class="spec-doc"><p>Signal &quot;unsat&quot; result at the given proof</p></div></div><div class="odoc-spec"><div class="spec value" id="val-del_clause" class="anchored"><a href="#val-del_clause" class="anchor"></a><code><span><span class="keyword">val</span> del_clause : <span><a href="#type-proof_step">proof_step</a> <span class="arrow">&#45;&gt;</span></span> <span><span><a href="#type-lit">lit</a> <span class="xref-unresolved">Iter</span>.t</span> <span class="arrow">&#45;&gt;</span></span> <span><a href="#type-t">t</a> <span class="arrow">&#45;&gt;</span></span> unit</span></code></div><div class="spec-doc"><p>Forget a clause. Only useful for performance considerations.</p></div></div></details></div><div class="odoc-spec"><div class="spec value" id="val-define_term" class="anchored"><a href="#val-define_term" class="anchor"></a><code><span><span class="keyword">val</span> define_term : <span><a href="#type-term">term</a> <span class="arrow">&#45;&gt;</span></span> <span><a href="#type-term">term</a> <span class="arrow">&#45;&gt;</span></span> <a href="#type-proof_rule">proof_rule</a></span></code></div><div class="spec-doc"><p><code>define_term cst u proof</code> defines the new constant <code>cst</code> as being equal to <code>u</code>. The result is a proof of the clause <code>cst = u</code></p></div></div><div class="odoc-spec"><div class="spec value" id="val-proof_p1" class="anchored"><a href="#val-proof_p1" class="anchor"></a><code><span><span class="keyword">val</span> proof_p1 : <span><a href="#type-proof_step">proof_step</a> <span class="arrow">&#45;&gt;</span></span> <span><a href="#type-proof_step">proof_step</a> <span class="arrow">&#45;&gt;</span></span> <a href="#type-proof_rule">proof_rule</a></span></code></div><div class="spec-doc"><p><code>proof_p1 p1 p2</code>, where <code>p1</code> proves the unit clause <code>t=u</code> (t:bool) and <code>p2</code> proves <code>C \/ t</code>, is the rule that produces <code>C \/ u</code>, i.e unit paramodulation.</p></div></div><div class="odoc-spec"><div class="spec value" id="val-with_defs" class="anchored"><a href="#val-with_defs" class="anchor"></a><code><span><span class="keyword">val</span> with_defs : <span><a href="#type-proof_step">proof_step</a> <span class="arrow">&#45;&gt;</span></span> <span><span><a href="#type-proof_step">proof_step</a> <span class="xref-unresolved">Iter</span>.t</span> <span class="arrow">&#45;&gt;</span></span> <a href="#type-proof_rule">proof_rule</a></span></code></div><div class="spec-doc"><p><code>with_defs pr defs</code> specifies that <code>pr</code> is valid only in a context where the definitions <code>defs</code> are present.</p></div></div><div class="odoc-spec"><div class="spec value" id="val-lemma_true" class="anchored"><a href="#val-lemma_true" class="anchor"></a><code><span><span class="keyword">val</span> lemma_true : <span><a href="#type-term">term</a> <span class="arrow">&#45;&gt;</span></span> <a href="#type-proof_rule">proof_rule</a></span></code></div><div class="spec-doc"><p><code>lemma_true (true) p</code> asserts the clause <code>(true)</code></p></div></div><div class="odoc-spec"><div class="spec value" id="val-lemma_preprocess" class="anchored"><a href="#val-lemma_preprocess" class="anchor"></a><code><span><span class="keyword">val</span> lemma_preprocess : <span><a href="#type-term">term</a> <span class="arrow">&#45;&gt;</span></span> <span><a href="#type-term">term</a> <span class="arrow">&#45;&gt;</span></span> <span>using:<span><a href="#type-proof_step">proof_step</a> <span class="xref-unresolved">Iter</span>.t</span> <span class="arrow">&#45;&gt;</span></span> <a href="#type-proof_rule">proof_rule</a></span></code></div><div class="spec-doc"><p><code>lemma_preprocess t u ~using p</code> asserts that <code>t = u</code> is a tautology and that <code>t</code> has been preprocessed into <code>u</code>.</p><p>The theorem <code>/\_{eqn in using} eqn |- t=u</code> is proved using congruence closure, and then resolved against the clauses <code>using</code> to obtain a unit equality.</p><p>From now on, <code>t</code> and <code>u</code> will be used interchangeably.</p><ul class="at-tags"><li class="returns"><span class="at-tag">returns</span> <p>a proof_rule ID for the clause <code>(t=u)</code>.</p></li></ul></div></div><div class="odoc-spec"><div class="spec value" id="val-lemma_rw_clause" class="anchored"><a href="#val-lemma_rw_clause" class="anchor"></a><code><span><span class="keyword">val</span> lemma_rw_clause : <span><a href="#type-proof_step">proof_step</a> <span class="arrow">&#45;&gt;</span></span> <span>res:<span><a href="#type-lit">lit</a> <span class="xref-unresolved">Iter</span>.t</span> <span class="arrow">&#45;&gt;</span></span> <span>using:<span><a href="#type-proof_step">proof_step</a> <span class="xref-unresolved">Iter</span>.t</span> <span class="arrow">&#45;&gt;</span></span> <a href="#type-proof_rule">proof_rule</a></span></code></div><div class="spec-doc"><p><code>lemma_rw_clause prc ~res ~using</code>, where <code>prc</code> is the proof of <code>|- c</code>, uses the equations <code>|- p_i = q_i</code> from <code>using</code> to rewrite some literals of <code>c</code> into <code>res</code>. This is used to preprocess literals of a clause (using <a href="#val-lemma_preprocess"><code>lemma_preprocess</code></a> individually).</p></div></div></details></div><div class="odoc-spec"><div class="spec value" id="val-lemma_lra" class="anchored"><a href="#val-lemma_lra" class="anchor"></a><code><span><span class="keyword">val</span> lemma_lra : <span><span><a href="../Lit/index.html#type-t">Lit.t</a> <span class="xref-unresolved">Iter</span>.t</span> <span class="arrow">&#45;&gt;</span></span> <a href="#type-proof_rule">proof_rule</a></span></code></div></div><div class="odoc-include"><details open="open"><summary class="spec include"><code><span><span class="keyword">include</span> <a href="../../../sidekick/Sidekick_th_data/module-type-PROOF/index.html">Sidekick_th_data.PROOF</a> <span class="keyword">with</span> <span><span class="keyword">type</span> <a href="../../../sidekick/Sidekick_th_data/module-type-PROOF/index.html#type-proof">proof</a> := <a href="#type-t">t</a></span> <span class="keyword">and</span> <span><span class="keyword">type</span> <a href="../../../sidekick/Sidekick_th_data/module-type-PROOF/index.html#type-proof_step">proof_step</a> := <a href="#type-proof_step">proof_step</a></span> <span class="keyword">and</span> <span><span class="keyword">type</span> <a href="../../../sidekick/Sidekick_th_data/module-type-PROOF/index.html#type-lit">lit</a> := <a href="../Lit/index.html#type-t">Lit.t</a></span> <span class="keyword">and</span> <span><span class="keyword">type</span> <a href="../../../sidekick/Sidekick_th_data/module-type-PROOF/index.html#type-term">term</a> := <a href="../Base_types/Term/index.html#type-t">Base_types.Term.t</a></span></span></code></summary><div class="odoc-spec"><div class="spec value" id="val-lemma_isa_cstor" class="anchored"><a href="#val-lemma_isa_cstor" class="anchor"></a><code><span><span class="keyword">val</span> lemma_isa_cstor : <span>cstor_t:<a href="../Base_types/Term/index.html#type-t">Base_types.Term.t</a> <span class="arrow">&#45;&gt;</span></span> <span><a href="../Base_types/Term/index.html#type-t">Base_types.Term.t</a> <span class="arrow">&#45;&gt;</span></span> <span><a href="#type-t">t</a> <span class="arrow">&#45;&gt;</span></span> <a href="#type-proof_step">proof_step</a></span></code></div><div class="spec-doc"><p><code>lemma_isa_cstor (d …) (is-c t)</code> returns the clause <code>(c …) = t |- is-c t</code> or <code>(d …) = t |- ¬ (is-c t)</code></p></div></div><div class="odoc-spec"><div class="spec value" id="val-lemma_select_cstor" class="anchored"><a href="#val-lemma_select_cstor" class="anchor"></a><code><span><span class="keyword">val</span> lemma_select_cstor : <span>cstor_t:<a href="../Base_types/Term/index.html#type-t">Base_types.Term.t</a> <span class="arrow">&#45;&gt;</span></span> <span><a href="../Base_types/Term/index.html#type-t">Base_types.Term.t</a> <span class="arrow">&#45;&gt;</span></span> <span><a href="#type-t">t</a> <span class="arrow">&#45;&gt;</span></span> <a href="#type-proof_step">proof_step</a></span></code></div><div class="spec-doc"><p><code>lemma_select_cstor (c t1…tn) (sel-c-i t)</code> returns a proof of <code>t = c t1…tn |- (sel-c-i t) = ti</code></p></div></div><div class="odoc-spec"><div class="spec value" id="val-lemma_isa_split" class="anchored"><a href="#val-lemma_isa_split" class="anchor"></a><code><span><span class="keyword">val</span> lemma_isa_split : <span><a href="../Base_types/Term/index.html#type-t">Base_types.Term.t</a> <span class="arrow">&#45;&gt;</span></span> <span><span><a href="../Lit/index.html#type-t">Lit.t</a> <span class="xref-unresolved">Iter</span>.t</span> <span class="arrow">&#45;&gt;</span></span> <span><a href="#type-t">t</a> <span class="arrow">&#45;&gt;</span></span> <a href="#type-proof_step">proof_step</a></span></code></div><div class="spec-doc"><p><code>lemma_isa_split t lits</code> is the proof of <code>is-c1 t \/ is-c2 t \/ … \/ is-c_n t</code></p></div></div><div class="odoc-spec"><div class="spec value" id="val-lemma_isa_sel" class="anchored"><a href="#val-lemma_isa_sel" class="anchor"></a><code><span><span class="keyword">val</span> lemma_isa_sel : <span><a href="../Base_types/Term/index.html#type-t">Base_types.Term.t</a> <span class="arrow">&#45;&gt;</span></span> <span><a href="#type-t">t</a> <span class="arrow">&#45;&gt;</span></span> <a href="#type-proof_step">proof_step</a></span></code></div><div class="spec-doc"><p><code>lemma_isa_sel (is-c t)</code> is the proof of <code>is-c t |- t = c (sel-c-1 t)…(sel-c-n t)</code></p></div></div><div class="odoc-spec"><div class="spec value" id="val-lemma_isa_disj" class="anchored"><a href="#val-lemma_isa_disj" class="anchor"></a><code><span><span class="keyword">val</span> lemma_isa_disj : <span><a href="../Lit/index.html#type-t">Lit.t</a> <span class="arrow">&#45;&gt;</span></span> <span><a href="../Lit/index.html#type-t">Lit.t</a> <span class="arrow">&#45;&gt;</span></span> <span><a href="#type-t">t</a> <span class="arrow">&#45;&gt;</span></span> <a href="#type-proof_step">proof_step</a></span></code></div><div class="spec-doc"><p><code>lemma_isa_disj (is-c t) (is-d t)</code> is the proof of <code>¬ (is-c t) \/ ¬ (is-c t)</code></p></div></div><div class="odoc-spec"><div class="spec value" id="val-lemma_cstor_inj" class="anchored"><a href="#val-lemma_cstor_inj" class="anchor"></a><code><span><span class="keyword">val</span> lemma_cstor_inj : <span><a href="../Base_types/Term/index.html#type-t">Base_types.Term.t</a> <span class="arrow">&#45;&gt;</span></span> <span><a href="../Base_types/Term/index.html#type-t">Base_types.Term.t</a> <span class="arrow">&#45;&gt;</span></span> <span>int <span class="arrow">&#45;&gt;</span></span> <span><a href="#type-t">t</a> <span class="arrow">&#45;&gt;</span></span> <a href="#type-proof_step">proof_step</a></span></code></div><div class="spec-doc"><p><code>lemma_cstor_inj (c t1…tn) (c u1…un) i</code> is the proof of <code>c t1…tn = c u1…un |- ti = ui</code></p></div></div><div class="odoc-spec"><div class="spec value" id="val-lemma_cstor_distinct" class="anchored"><a href="#val-lemma_cstor_distinct" class="anchor"></a><code><span><span class="keyword">val</span> lemma_cstor_distinct : <span><a href="../Base_types/Term/index.html#type-t">Base_types.Term.t</a> <span class="arrow">&#45;&gt;</span></span> <span><a href="../Base_types/Term/index.html#type-t">Base_types.Term.t</a> <span class="arrow">&#45;&gt;</span></span> <span><a href="#type-t">t</a> <span class="arrow">&#45;&gt;</span></span> <a href="#type-proof_step">proof_step</a></span></code></div><div class="spec-doc"><p><code>lemma_isa_distinct (c …) (d …)</code> is the proof of the unit clause <code>|- (c …) ≠ (d …)</code></p></div></div><div class="odoc-spec"><div class="spec value" id="val-lemma_acyclicity" class="anchored"><a href="#val-lemma_acyclicity" class="anchor"></a><code><span><span class="keyword">val</span> lemma_acyclicity : <span><span><span>(<a href="../Base_types/Term/index.html#type-t">Base_types.Term.t</a> * <a href="../Base_types/Term/index.html#type-t">Base_types.Term.t</a>)</span> <span class="xref-unresolved">Iter</span>.t</span> <span class="arrow">&#45;&gt;</span></span> <span><a href="#type-t">t</a> <span class="arrow">&#45;&gt;</span></span> <a href="#type-proof_step">proof_step</a></span></code></div><div class="spec-doc"><p><code>lemma_acyclicity pairs</code> is a proof of <code>t1=u1, …, tn=un |- false</code> by acyclicity.</p></div></div></details></div><div class="odoc-include"><details open="open"><summary class="spec include"><code><span><span class="keyword">include</span> <a href="../../../sidekick/Sidekick_th_bool_static/module-type-PROOF/index.html">Sidekick_th_bool_static.PROOF</a> <span class="keyword">with</span> <span><span class="keyword">type</span> <a href="../../../sidekick/Sidekick_th_bool_static/module-type-PROOF/index.html#type-proof">proof</a> := <a href="#type-t">t</a></span> <span class="keyword">and</span> <span><span class="keyword">type</span> <a href="../../../sidekick/Sidekick_th_bool_static/module-type-PROOF/index.html#type-proof_step">proof_step</a> := <a href="#type-proof_step">proof_step</a></span> <span class="keyword">and</span> <span><span class="keyword">type</span> <a href="../../../sidekick/Sidekick_th_bool_static/module-type-PROOF/index.html#type-lit">lit</a> := <a href="../Lit/index.html#type-t">Lit.t</a></span> <span class="keyword">and</span> <span><span class="keyword">type</span> <a href="../../../sidekick/Sidekick_th_bool_static/module-type-PROOF/index.html#type-term">term</a> := <a href="../Base_types/Term/index.html#type-t">Base_types.Term.t</a></span></span></code></summary><div class="odoc-spec"><div class="spec value" id="val-lemma_bool_tauto" class="anchored"><a href="#val-lemma_bool_tauto" class="anchor"></a><code><span><span class="keyword">val</span> lemma_bool_tauto : <span><span><a href="../Lit/index.html#type-t">Lit.t</a> <span class="xref-unresolved">Iter</span>.t</span> <span class="arrow">&#45;&gt;</span></span> <span><a href="#type-t">t</a> <span class="arrow">&#45;&gt;</span></span> <a href="#type-proof_step">proof_step</a></span></code></div><div class="spec-doc"><p>Boolean tautology lemma (clause)</p></div></div><div class="odoc-spec"><div class="spec value" id="val-lemma_bool_c" class="anchored"><a href="#val-lemma_bool_c" class="anchor"></a><code><span><span class="keyword">val</span> lemma_bool_c : <span>string <span class="arrow">&#45;&gt;</span></span> <span><span><a href="../Base_types/Term/index.html#type-t">Base_types.Term.t</a> list</span> <span class="arrow">&#45;&gt;</span></span> <span><a href="#type-t">t</a> <span class="arrow">&#45;&gt;</span></span> <a href="#type-proof_step">proof_step</a></span></code></div><div class="spec-doc"><p>Basic boolean logic lemma for a clause <code>|- c</code>. <code>proof_bool_c b name cs</code> is the rule designated by <code>name</code>.</p></div></div><div class="odoc-spec"><div class="spec value" id="val-lemma_bool_equiv" class="anchored"><a href="#val-lemma_bool_equiv" class="anchor"></a><code><span><span class="keyword">val</span> lemma_bool_equiv : <span><a href="../Base_types/Term/index.html#type-t">Base_types.Term.t</a> <span class="arrow">&#45;&gt;</span></span> <span><a href="../Base_types/Term/index.html#type-t">Base_types.Term.t</a> <span class="arrow">&#45;&gt;</span></span> <span><a href="#type-t">t</a> <span class="arrow">&#45;&gt;</span></span> <a href="#type-proof_step">proof_step</a></span></code></div><div class="spec-doc"><p>Boolean tautology lemma (equivalence)</p></div></div><div class="odoc-spec"><div class="spec value" id="val-lemma_ite_true" class="anchored"><a href="#val-lemma_ite_true" class="anchor"></a><code><span><span class="keyword">val</span> lemma_ite_true : <span>ite:<a href="../Base_types/Term/index.html#type-t">Base_types.Term.t</a> <span class="arrow">&#45;&gt;</span></span> <span><a href="#type-t">t</a> <span class="arrow">&#45;&gt;</span></span> <a href="#type-proof_step">proof_step</a></span></code></div><div class="spec-doc"><p>lemma <code>a ==&gt; ite a b c = b</code></p></div></div><div class="odoc-spec"><div class="spec value" id="val-lemma_ite_false" class="anchored"><a href="#val-lemma_ite_false" class="anchor"></a><code><span><span class="keyword">val</span> lemma_ite_false : <span>ite:<a href="../Base_types/Term/index.html#type-t">Base_types.Term.t</a> <span class="arrow">&#45;&gt;</span></span> <span><a href="#type-t">t</a> <span class="arrow">&#45;&gt;</span></span> <a href="#type-proof_step">proof_step</a></span></code></div><div class="spec-doc"><p>lemma <code>¬a ==&gt; ite a b c = c</code></p></div></div></details></div><h3 id="creation"><a href="#creation" class="anchor"></a>Creation</h3><div class="odoc-spec"><div class="spec value" id="val-create" class="anchored"><a href="#val-create" class="anchor"></a><code><span><span class="keyword">val</span> create : <span>?config:<a href="Config/index.html#type-t">Config.t</a> <span class="arrow">&#45;&gt;</span></span> <span>unit <span class="arrow">&#45;&gt;</span></span> <a href="#type-t">t</a></span></code></div><div class="spec-doc"><p>Create new proof.</p><ul class="at-tags"><li class="parameter"><span class="at-tag">parameter</span> <span class="value">config</span> <p>modifies the proof behavior</p></li></ul></div></div><div class="odoc-spec"><div class="spec value" id="val-empty" class="anchored"><a href="#val-empty" class="anchor"></a><code><span><span class="keyword">val</span> empty : <a href="#type-t">t</a></span></code></div><div class="spec-doc"><p>Empty proof, stores nothing</p></div></div><div class="odoc-spec"><div class="spec value" id="val-disable" class="anchored"><a href="#val-disable" class="anchor"></a><code><span><span class="keyword">val</span> disable : <span><a href="#type-t">t</a> <span class="arrow">&#45;&gt;</span></span> unit</span></code></div><div class="spec-doc"><p>Disable proof, even if the config would enable it</p></div></div><h3 id="use-the-proof"><a href="#use-the-proof" class="anchor"></a>Use the proof</h3><div class="odoc-spec"><div class="spec value" id="val-iter_steps_backward" class="anchored"><a href="#val-iter_steps_backward" class="anchor"></a><code><span><span class="keyword">val</span> iter_steps_backward : <span><a href="#type-t">t</a> <span class="arrow">&#45;&gt;</span></span> <span><a href="../../Sidekick_base_proof_trace/Proof_ser/Step/index.html#type-t">Base_types.Proof_ser.Step.t</a> <span class="xref-unresolved">Iter</span>.t</span></span></code></div><div class="spec-doc"><p>Iterates on all the steps of the proof, from the end.</p><p>This will yield nothing if the proof was disabled or used a dummy backend.</p></div></div><div class="odoc-spec"><div class="spec module" id="module-Unsafe_" class="anchored"><a href="#module-Unsafe_" class="anchor"></a><code><span><span class="keyword">module</span> </span><span><a href="Unsafe_/index.html">Unsafe_</a></span><span> : <span class="keyword">sig</span> ... <span class="keyword">end</span></span></code></div></div></div></body></html>