mirror of
https://github.com/c-cube/sidekick.git
synced 2025-12-06 03:05:31 -05:00
2 lines
No EOL
14 KiB
HTML
2 lines
No EOL
14 KiB
HTML
<!DOCTYPE html>
|
||
<html xmlns="http://www.w3.org/1999/xhtml"><head><title>P (sidekick-bin.Sidekick_smtlib.Process.Solver.P)</title><link rel="stylesheet" href="../../../../../odoc.css"/><meta charset="utf-8"/><meta name="generator" content="odoc 2.0.2"/><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-bin</a> » <a href="../../../index.html">Sidekick_smtlib</a> » <a href="../../index.html">Process</a> » <a href="../index.html">Solver</a> » P</nav><header class="odoc-preamble"><h1>Module <code><span>Solver.P</span></code></h1></header><div class="odoc-content"><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><span> = <a href="../index.html#type-proof">proof</a></span></code></div><div class="spec-doc"><p>The abstract representation of a proof. A proof always proves a clause to be <b>valid</b> (true in every possible interpretation of the problem's assertions, and the theories)</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><span> = <a href="../index.html#type-proof_step">proof_step</a></span></code></div><div class="spec-doc"><p>Identifier for a proof proof_rule (like a unique ID for a clause previously added/proved)</p></div></div><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="../T/Term/index.html#type-t">T.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">-></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">-></span></span> <span><a href="#type-t">t</a> <span class="arrow">-></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">-></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">-></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">-></span></span> <span>hyps:<span><a href="#type-proof_step">proof_step</a> <span class="xref-unresolved">Iter</span>.t</span> <span class="arrow">-></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">-></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">-></span></span> <span><a href="#type-t">t</a> <span class="arrow">-></span></span> unit</span></code></div><div class="spec-doc"><p>Signal "unsat" 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">-></span></span> <span><span><a href="#type-lit">lit</a> <span class="xref-unresolved">Iter</span>.t</span> <span class="arrow">-></span></span> <span><a href="#type-t">t</a> <span class="arrow">-></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">-></span></span> <span><a href="#type-term">term</a> <span class="arrow">-></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">-></span></span> <span><a href="#type-proof_step">proof_step</a> <span class="arrow">-></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-proof_r1" class="anchored"><a href="#val-proof_r1" class="anchor"></a><code><span><span class="keyword">val</span> proof_r1 : <span><a href="#type-proof_step">proof_step</a> <span class="arrow">-></span></span> <span><a href="#type-proof_step">proof_step</a> <span class="arrow">-></span></span> <a href="#type-proof_rule">proof_rule</a></span></code></div><div class="spec-doc"><p><code>proof_r1 p1 p2</code>, where <code>p1</code> proves the unit clause <code>|- t</code> (t:bool) and <code>p2</code> proves <code>C \/ ¬t</code>, is the rule that produces <code>C \/ u</code>, i.e unit resolution.</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">-></span></span> <span><span><a href="#type-proof_step">proof_step</a> <span class="xref-unresolved">Iter</span>.t</span> <span class="arrow">-></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">-></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">-></span></span> <span><a href="#type-term">term</a> <span class="arrow">-></span></span> <span>using:<span><a href="#type-proof_step">proof_step</a> <span class="xref-unresolved">Iter</span>.t</span> <span class="arrow">-></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">-></span></span> <span>res:<span><a href="#type-lit">lit</a> <span class="xref-unresolved">Iter</span>.t</span> <span class="arrow">-></span></span> <span>using:<span><a href="#type-proof_step">proof_step</a> <span class="xref-unresolved">Iter</span>.t</span> <span class="arrow">-></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></div></body></html> |