Proofs, whichever the layer #
What the two layers' proof APIs share: Proof.View, a proof step taken apart, and the traversals
both layers build fold, foldUp and their ForIn instance on. Nothing here mentions a solver or
a term; the layers instantiate it — Cvc.Untyped.Solver.Proof and Cvc.Typed.Solver.Proof.
A proof is a graph, not a tree. cvc5 shares a sub-proof between the steps that use it, so a step can be reached along many paths, and a traversal that does not remember what it has visited redoes the work every time — exponentially often in the worst case. Both traversals here visit each distinct step once, telling steps apart by identity.
Taking a step apart #
One step of a cvc5 proof: its rule as a constructor, its premises and arguments as fields.
The parameters say what the fields are, so that each layer picks its own, and so that a traversal can hand over a step whose premises are something else entirely:
Pis a premise — a proof, or what a bottom-up traversal computed for one;Fis a formula — a sort-erased term, or a typedTerm Bool;Tis a term of any sort.
The conclusion is not a field: it is the step's own result. Neither is an argument that only
restates it, such as REORDERING's target clause or THEORY_REWRITE's equality.
A rule is decoded only when its step has the layout cvc5 documents; anything else is other,
holding the step's premises and arguments as cvc5 gives them. So no step is lost, and a layout cvc5
changes degrades to other rather than to a wrong reading. Which rules are decoded can grow, and a
rule moving out of other is the change to expect from one version to the next.
Which rules appear at all depends on cvc5's proof-granularity option. Coarse settings leave
MACRO_… steps, which are other here; dsl-rewrite breaks rewriting down into dslRewrite,
theoryRewrite and the equality rules.
- assume
{P F T : Type}
(f : F)
: View P F T
ASSUME, an open leaf: concludesf, unless an enclosingscopedischarges it. - scope
{P F T : Type}
(body : P)
(discharged : Array F)
: View P F T
SCOPE: dischargesdischargedfrombody : F, concludingF₁ ∧ … ∧ Fₙ ⇒ F.When
Fisfalse, the conclusion is¬(F₁ ∧ … ∧ Fₙ)instead. - evaluate
{P F T : Type}
(t : T)
: View P F T
EVALUATE:t = v,vbeing the valuetevaluates to. - dslRewrite
{P F T : Type}
(rule : ProofRewriteRule)
(premises : Array P)
(instantiation : Array T)
: View P F T
DSL_REWRITE: an instance of the RARE rulerule, its variables instantiated in order.The premises are the rule's conditions, instantiated likewise. A variable with list semantics is instantiated with the list of terms it stands for.
- theoryRewrite
{P F T : Type}
(rule : ProofRewriteRule)
: View P F T
THEORY_REWRITE:t = t', the conclusion, by the theory rewrite rulerule. - aciNorm
{P F T : Type}
: View P F T
ACI_NORM:t = s, equal modulo associativity, commutativity, idempotence and identity. - absorb
{P F T : Type}
: View P F T
ABSORB:t = z,zbeing a zero elementtcontains beneath its operator. - trust {P F T : Type} (id : Nat) (premises : Array P) (extra : Array T) : View P F T
- trustTheoryRewrite
{P F T : Type}
(theory method : Nat)
: View P F T
TRUST_THEORY_REWRITE: an unchecked theory rewrite, the equality being the conclusion.theoryidentifies the theory whose rewriter applied andmethodthe kind of rewriting; both are cvc5's internal identifiers, which its API does not name. - satRefutation
{P F T : Type}
(premises : Array P)
: View P F T
SAT_REFUTATION:falsefrom the clausespremises, the SAT solver's unsat core. - resolution
{P F T : Type}
(left right : P)
(polarity : Bool)
(pivot : F)
: View P F T
RESOLUTIONofleftandrightonpivot.The pivot occurs in
leftas is and inrightnegated whenpolarityistrue, the other way round when it isfalse. - chainResolution
{P F T : Type}
(premises : Array P)
(steps : Array (Bool × F))
: View P F T
CHAIN_RESOLUTION: resolvespremisesleft to right, stepionsteps[i]'s pivot.Each step is a polarity and a pivot, as in
resolution, and there is one step fewer than there are premises. - chainMResolution
{P F T : Type}
(premises : Array P)
(steps : Array (Bool × F))
: View P F T
CHAIN_M_RESOLUTION:chainResolutionwith factoring and reordering.The conclusion is the result of the resolution as a set of literals.
- factoring
{P F T : Type}
(premise : P)
: View P F T
FACTORING:premise's clause, every literal's repetitions dropped. - reordering
{P F T : Type}
(premise : P)
: View P F T
REORDERING:premise's clause, its literals in the conclusion's order. - split
{P F T : Type}
(f : F)
: View P F T
SPLIT:f ∨ ¬f. - eqResolve
{P F T : Type}
(premise equiv : P)
: View P F T
EQ_RESOLVE:F₂frompremise : F₁andequiv : F₁ = F₂. - modusPonens
{P F T : Type}
(premise implication : P)
: View P F T
MODUS_PONENS:F₂frompremise : F₁andimplication : F₁ ⇒ F₂. - notNotElim
{P F T : Type}
(premise : P)
: View P F T
NOT_NOT_ELIM:Ffrom¬¬F. - contra
{P F T : Type}
(premise negation : P)
: View P F T
CONTRA:falsefrompremise : Fandnegation : ¬F. - andElim
{P F T : Type}
(premise : P)
(index : Nat)
: View P F T
AND_ELIM: the conjunct atindexofpremise : F₀ ∧ … ∧ Fₙ, counting from zero. - andIntro
{P F T : Type}
(premises : Array P)
: View P F T
AND_INTRO: the conjunction of the premises' conclusions. - notOrElim
{P F T : Type}
(premise : P)
(index : Nat)
: View P F T
NOT_OR_ELIM:¬Fᵢfrompremise : ¬(F₀ ∨ … ∨ Fₙ),ibeingindex, from zero. - impliesElim
{P F T : Type}
(premise : P)
: View P F T
IMPLIES_ELIM:¬F₁ ∨ F₂fromF₁ ⇒ F₂. - notImpliesElim1
{P F T : Type}
(premise : P)
: View P F T
NOT_IMPLIES_ELIM1:F₁from¬(F₁ ⇒ F₂). - notImpliesElim2
{P F T : Type}
(premise : P)
: View P F T
NOT_IMPLIES_ELIM2:¬F₂from¬(F₁ ⇒ F₂). - equivElim1
{P F T : Type}
(premise : P)
: View P F T
EQUIV_ELIM1:¬F₁ ∨ F₂fromF₁ = F₂. - equivElim2
{P F T : Type}
(premise : P)
: View P F T
EQUIV_ELIM2:F₁ ∨ ¬F₂fromF₁ = F₂. - notEquivElim1
{P F T : Type}
(premise : P)
: View P F T
NOT_EQUIV_ELIM1:F₁ ∨ F₂fromF₁ ≠ F₂. - notEquivElim2
{P F T : Type}
(premise : P)
: View P F T
NOT_EQUIV_ELIM2:¬F₁ ∨ ¬F₂fromF₁ ≠ F₂. - xorElim1
{P F T : Type}
(premise : P)
: View P F T
XOR_ELIM1:F₁ ∨ F₂fromF₁ ⊕ F₂. - xorElim2
{P F T : Type}
(premise : P)
: View P F T
XOR_ELIM2:¬F₁ ∨ ¬F₂fromF₁ ⊕ F₂. - notXorElim1
{P F T : Type}
(premise : P)
: View P F T
NOT_XOR_ELIM1:F₁ ∨ ¬F₂from¬(F₁ ⊕ F₂). - notXorElim2
{P F T : Type}
(premise : P)
: View P F T
NOT_XOR_ELIM2:¬F₁ ∨ F₂from¬(F₁ ⊕ F₂). - iteElim1
{P F T : Type}
(premise : P)
: View P F T
ITE_ELIM1:¬C ∨ F₁fromite C F₁ F₂. - iteElim2
{P F T : Type}
(premise : P)
: View P F T
ITE_ELIM2:C ∨ F₂fromite C F₁ F₂. - notIteElim1
{P F T : Type}
(premise : P)
: View P F T
NOT_ITE_ELIM1:¬C ∨ ¬F₁from¬(ite C F₁ F₂). - notIteElim2
{P F T : Type}
(premise : P)
: View P F T
NOT_ITE_ELIM2:C ∨ ¬F₂from¬(ite C F₁ F₂). - notAnd
{P F T : Type}
(premise : P)
: View P F T
NOT_AND:¬F₁ ∨ … ∨ ¬Fₙfrom¬(F₁ ∧ … ∧ Fₙ). - cnfAndPos
{P F T : Type}
(f : F)
(index : Nat)
: View P F T
CNF_AND_POS:¬f ∨ Fᵢ,fbeingF₀ ∧ … ∧ Fₙandiindex, counting from zero. - cnfAndNeg
{P F T : Type}
(f : F)
: View P F T
CNF_AND_NEG:f ∨ ¬F₁ ∨ … ∨ ¬Fₙ,fbeingF₁ ∧ … ∧ Fₙ. - cnfOrPos
{P F T : Type}
(f : F)
: View P F T
CNF_OR_POS:¬f ∨ F₁ ∨ … ∨ Fₙ,fbeingF₁ ∨ … ∨ Fₙ. - cnfOrNeg
{P F T : Type}
(f : F)
(index : Nat)
: View P F T
CNF_OR_NEG:f ∨ ¬Fᵢ,fbeingF₀ ∨ … ∨ Fₙandiindex, counting from zero. - cnfImpliesPos
{P F T : Type}
(f : F)
: View P F T
CNF_IMPLIES_POS:¬f ∨ ¬F₁ ∨ F₂,fbeingF₁ ⇒ F₂. - cnfImpliesNeg1
{P F T : Type}
(f : F)
: View P F T
CNF_IMPLIES_NEG1:f ∨ F₁,fbeingF₁ ⇒ F₂. - cnfImpliesNeg2
{P F T : Type}
(f : F)
: View P F T
CNF_IMPLIES_NEG2:f ∨ ¬F₂,fbeingF₁ ⇒ F₂. - cnfEquivPos1
{P F T : Type}
(f : F)
: View P F T
CNF_EQUIV_POS1:¬f ∨ ¬F₁ ∨ F₂,fbeingF₁ = F₂. - cnfEquivPos2
{P F T : Type}
(f : F)
: View P F T
CNF_EQUIV_POS2:¬f ∨ F₁ ∨ ¬F₂,fbeingF₁ = F₂. - cnfEquivNeg1
{P F T : Type}
(f : F)
: View P F T
CNF_EQUIV_NEG1:f ∨ F₁ ∨ F₂,fbeingF₁ = F₂. - cnfEquivNeg2
{P F T : Type}
(f : F)
: View P F T
CNF_EQUIV_NEG2:f ∨ ¬F₁ ∨ ¬F₂,fbeingF₁ = F₂. - cnfXorPos1
{P F T : Type}
(f : F)
: View P F T
CNF_XOR_POS1:¬f ∨ F₁ ∨ F₂,fbeingF₁ ⊕ F₂. - cnfXorPos2
{P F T : Type}
(f : F)
: View P F T
CNF_XOR_POS2:¬f ∨ ¬F₁ ∨ ¬F₂,fbeingF₁ ⊕ F₂. - cnfXorNeg1
{P F T : Type}
(f : F)
: View P F T
CNF_XOR_NEG1:f ∨ ¬F₁ ∨ F₂,fbeingF₁ ⊕ F₂. - cnfXorNeg2
{P F T : Type}
(f : F)
: View P F T
CNF_XOR_NEG2:f ∨ F₁ ∨ ¬F₂,fbeingF₁ ⊕ F₂. - cnfItePos1
{P F T : Type}
(f : F)
: View P F T
CNF_ITE_POS1:¬f ∨ ¬C ∨ F₁,fbeingite C F₁ F₂. - cnfItePos2
{P F T : Type}
(f : F)
: View P F T
CNF_ITE_POS2:¬f ∨ C ∨ F₂,fbeingite C F₁ F₂. - cnfItePos3
{P F T : Type}
(f : F)
: View P F T
CNF_ITE_POS3:¬f ∨ F₁ ∨ F₂,fbeingite C F₁ F₂. - cnfIteNeg1
{P F T : Type}
(f : F)
: View P F T
CNF_ITE_NEG1:f ∨ ¬C ∨ ¬F₁,fbeingite C F₁ F₂. - cnfIteNeg2
{P F T : Type}
(f : F)
: View P F T
CNF_ITE_NEG2:f ∨ C ∨ ¬F₂,fbeingite C F₁ F₂. - cnfIteNeg3
{P F T : Type}
(f : F)
: View P F T
CNF_ITE_NEG3:f ∨ ¬F₁ ∨ ¬F₂,fbeingite C F₁ F₂. - refl
{P F T : Type}
(t : T)
: View P F T
REFL:t = t. - symm
{P F T : Type}
(premise : P)
: View P F T
SYMM:t₂ = t₁fromt₁ = t₂, ort₂ ≠ t₁fromt₁ ≠ t₂. - trans
{P F T : Type}
(premises : Array P)
: View P F T
TRANS:t₁ = tₙfrom the chaint₁ = t₂, …,tₙ₋₁ = tₙ. - cong
{P F T : Type}
(premises : Array P)
(app : T)
: View P F T
CONG:f(t₁, …, tₙ) = f(s₁, …, sₙ)fromtᵢ = sᵢ,appbeingf(t₁, …, tₙ).Used for operators of fixed arity, indexed ones and uninterpreted functions included.
- naryCong
{P F T : Type}
(premises : Array P)
(app : T)
: View P F T
NARY_CONG:congfor a variadic, associative operator such asandor+. - pairwiseCong
{P F T : Type}
(premises : Array P)
(app : T)
: View P F T
PAIRWISE_CONG:congfor a variadic, pairwise operator, which today meansdistinct. - trueIntro
{P F T : Type}
(premise : P)
: View P F T
TRUE_INTRO:F = truefromF. - trueElim
{P F T : Type}
(premise : P)
: View P F T
TRUE_ELIM:FfromF = true. - falseIntro
{P F T : Type}
(premise : P)
: View P F T
FALSE_INTRO:F = falsefrom¬F. - falseElim
{P F T : Type}
(premise : P)
: View P F T
FALSE_ELIM:¬FfromF = false. - other
{P F T : Type}
(rule : ProofRule)
(premises : Array P)
(args : Array T)
: View P F T
Any other step, as cvc5 gives it: a rule not decoded, or a step whose layout was not expected.
Which rules are decoded grows over time, so a pattern
.other .SOME_RULE …stops matching once that rule is decoded: match on the step's rule instead for a rule not decoded.
Instances For
The rule a step applies.
Equations
- (Cvc.Proof.View.assume f).rule = cvc5.ProofRule.ASSUME
- (Cvc.Proof.View.scope body discharged).rule = cvc5.ProofRule.SCOPE
- (Cvc.Proof.View.evaluate t).rule = cvc5.ProofRule.EVALUATE
- (Cvc.Proof.View.dslRewrite rule premises instantiation).rule = cvc5.ProofRule.DSL_REWRITE
- (Cvc.Proof.View.theoryRewrite rule).rule = cvc5.ProofRule.THEORY_REWRITE
- Cvc.Proof.View.aciNorm.rule = cvc5.ProofRule.ACI_NORM
- Cvc.Proof.View.absorb.rule = cvc5.ProofRule.ABSORB
- (Cvc.Proof.View.trust id premises extra).rule = cvc5.ProofRule.TRUST
- (Cvc.Proof.View.trustTheoryRewrite theory method).rule = cvc5.ProofRule.TRUST_THEORY_REWRITE
- (Cvc.Proof.View.satRefutation premises).rule = cvc5.ProofRule.SAT_REFUTATION
- (Cvc.Proof.View.resolution left right polarity pivot).rule = cvc5.ProofRule.RESOLUTION
- (Cvc.Proof.View.chainResolution premises steps).rule = cvc5.ProofRule.CHAIN_RESOLUTION
- (Cvc.Proof.View.chainMResolution premises steps).rule = cvc5.ProofRule.CHAIN_M_RESOLUTION
- (Cvc.Proof.View.factoring premise).rule = cvc5.ProofRule.FACTORING
- (Cvc.Proof.View.reordering premise).rule = cvc5.ProofRule.REORDERING
- (Cvc.Proof.View.split f).rule = cvc5.ProofRule.SPLIT
- (Cvc.Proof.View.eqResolve premise equiv).rule = cvc5.ProofRule.EQ_RESOLVE
- (Cvc.Proof.View.modusPonens premise implication).rule = cvc5.ProofRule.MODUS_PONENS
- (Cvc.Proof.View.notNotElim premise).rule = cvc5.ProofRule.NOT_NOT_ELIM
- (Cvc.Proof.View.contra premise negation).rule = cvc5.ProofRule.CONTRA
- (Cvc.Proof.View.andElim premise index).rule = cvc5.ProofRule.AND_ELIM
- (Cvc.Proof.View.andIntro premises).rule = cvc5.ProofRule.AND_INTRO
- (Cvc.Proof.View.notOrElim premise index).rule = cvc5.ProofRule.NOT_OR_ELIM
- (Cvc.Proof.View.impliesElim premise).rule = cvc5.ProofRule.IMPLIES_ELIM
- (Cvc.Proof.View.notImpliesElim1 premise).rule = cvc5.ProofRule.NOT_IMPLIES_ELIM1
- (Cvc.Proof.View.notImpliesElim2 premise).rule = cvc5.ProofRule.NOT_IMPLIES_ELIM2
- (Cvc.Proof.View.equivElim1 premise).rule = cvc5.ProofRule.EQUIV_ELIM1
- (Cvc.Proof.View.equivElim2 premise).rule = cvc5.ProofRule.EQUIV_ELIM2
- (Cvc.Proof.View.notEquivElim1 premise).rule = cvc5.ProofRule.NOT_EQUIV_ELIM1
- (Cvc.Proof.View.notEquivElim2 premise).rule = cvc5.ProofRule.NOT_EQUIV_ELIM2
- (Cvc.Proof.View.xorElim1 premise).rule = cvc5.ProofRule.XOR_ELIM1
- (Cvc.Proof.View.xorElim2 premise).rule = cvc5.ProofRule.XOR_ELIM2
- (Cvc.Proof.View.notXorElim1 premise).rule = cvc5.ProofRule.NOT_XOR_ELIM1
- (Cvc.Proof.View.notXorElim2 premise).rule = cvc5.ProofRule.NOT_XOR_ELIM2
- (Cvc.Proof.View.iteElim1 premise).rule = cvc5.ProofRule.ITE_ELIM1
- (Cvc.Proof.View.iteElim2 premise).rule = cvc5.ProofRule.ITE_ELIM2
- (Cvc.Proof.View.notIteElim1 premise).rule = cvc5.ProofRule.NOT_ITE_ELIM1
- (Cvc.Proof.View.notIteElim2 premise).rule = cvc5.ProofRule.NOT_ITE_ELIM2
- (Cvc.Proof.View.notAnd premise).rule = cvc5.ProofRule.NOT_AND
- (Cvc.Proof.View.cnfAndPos f index).rule = cvc5.ProofRule.CNF_AND_POS
- (Cvc.Proof.View.cnfAndNeg f).rule = cvc5.ProofRule.CNF_AND_NEG
- (Cvc.Proof.View.cnfOrPos f).rule = cvc5.ProofRule.CNF_OR_POS
- (Cvc.Proof.View.cnfOrNeg f index).rule = cvc5.ProofRule.CNF_OR_NEG
- (Cvc.Proof.View.cnfImpliesPos f).rule = cvc5.ProofRule.CNF_IMPLIES_POS
- (Cvc.Proof.View.cnfImpliesNeg1 f).rule = cvc5.ProofRule.CNF_IMPLIES_NEG1
- (Cvc.Proof.View.cnfImpliesNeg2 f).rule = cvc5.ProofRule.CNF_IMPLIES_NEG2
- (Cvc.Proof.View.cnfEquivPos1 f).rule = cvc5.ProofRule.CNF_EQUIV_POS1
- (Cvc.Proof.View.cnfEquivPos2 f).rule = cvc5.ProofRule.CNF_EQUIV_POS2
- (Cvc.Proof.View.cnfEquivNeg1 f).rule = cvc5.ProofRule.CNF_EQUIV_NEG1
- (Cvc.Proof.View.cnfEquivNeg2 f).rule = cvc5.ProofRule.CNF_EQUIV_NEG2
- (Cvc.Proof.View.cnfXorPos1 f).rule = cvc5.ProofRule.CNF_XOR_POS1
- (Cvc.Proof.View.cnfXorPos2 f).rule = cvc5.ProofRule.CNF_XOR_POS2
- (Cvc.Proof.View.cnfXorNeg1 f).rule = cvc5.ProofRule.CNF_XOR_NEG1
- (Cvc.Proof.View.cnfXorNeg2 f).rule = cvc5.ProofRule.CNF_XOR_NEG2
- (Cvc.Proof.View.cnfItePos1 f).rule = cvc5.ProofRule.CNF_ITE_POS1
- (Cvc.Proof.View.cnfItePos2 f).rule = cvc5.ProofRule.CNF_ITE_POS2
- (Cvc.Proof.View.cnfItePos3 f).rule = cvc5.ProofRule.CNF_ITE_POS3
- (Cvc.Proof.View.cnfIteNeg1 f).rule = cvc5.ProofRule.CNF_ITE_NEG1
- (Cvc.Proof.View.cnfIteNeg2 f).rule = cvc5.ProofRule.CNF_ITE_NEG2
- (Cvc.Proof.View.cnfIteNeg3 f).rule = cvc5.ProofRule.CNF_ITE_NEG3
- (Cvc.Proof.View.refl t).rule = cvc5.ProofRule.REFL
- (Cvc.Proof.View.symm premise).rule = cvc5.ProofRule.SYMM
- (Cvc.Proof.View.trans premises).rule = cvc5.ProofRule.TRANS
- (Cvc.Proof.View.cong premises app).rule = cvc5.ProofRule.CONG
- (Cvc.Proof.View.naryCong premises app).rule = cvc5.ProofRule.NARY_CONG
- (Cvc.Proof.View.pairwiseCong premises app).rule = cvc5.ProofRule.PAIRWISE_CONG
- (Cvc.Proof.View.trueIntro premise).rule = cvc5.ProofRule.TRUE_INTRO
- (Cvc.Proof.View.trueElim premise).rule = cvc5.ProofRule.TRUE_ELIM
- (Cvc.Proof.View.falseIntro premise).rule = cvc5.ProofRule.FALSE_INTRO
- (Cvc.Proof.View.falseElim premise).rule = cvc5.ProofRule.FALSE_ELIM
- (Cvc.Proof.View.other rule premises args).rule = rule
Instances For
A step's premises, in the order cvc5 gives them.
Equations
- (Cvc.Proof.View.assume f).premises = #[]
- (Cvc.Proof.View.scope body discharged).premises = #[body]
- (Cvc.Proof.View.evaluate t).premises = #[]
- (Cvc.Proof.View.dslRewrite rule premises instantiation).premises = premises
- (Cvc.Proof.View.theoryRewrite rule).premises = #[]
- Cvc.Proof.View.aciNorm.premises = #[]
- Cvc.Proof.View.absorb.premises = #[]
- (Cvc.Proof.View.trust id premises extra).premises = premises
- (Cvc.Proof.View.trustTheoryRewrite theory method).premises = #[]
- (Cvc.Proof.View.satRefutation premises).premises = premises
- (Cvc.Proof.View.resolution left right polarity pivot).premises = #[left] ++ #[right]
- (Cvc.Proof.View.chainResolution premises steps).premises = premises
- (Cvc.Proof.View.chainMResolution premises steps).premises = premises
- (Cvc.Proof.View.factoring premise).premises = #[premise]
- (Cvc.Proof.View.reordering premise).premises = #[premise]
- (Cvc.Proof.View.split f).premises = #[]
- (Cvc.Proof.View.eqResolve premise equiv).premises = #[premise] ++ #[equiv]
- (Cvc.Proof.View.modusPonens premise implication).premises = #[premise] ++ #[implication]
- (Cvc.Proof.View.notNotElim premise).premises = #[premise]
- (Cvc.Proof.View.contra premise negation).premises = #[premise] ++ #[negation]
- (Cvc.Proof.View.andElim premise index).premises = #[premise]
- (Cvc.Proof.View.andIntro premises).premises = premises
- (Cvc.Proof.View.notOrElim premise index).premises = #[premise]
- (Cvc.Proof.View.impliesElim premise).premises = #[premise]
- (Cvc.Proof.View.notImpliesElim1 premise).premises = #[premise]
- (Cvc.Proof.View.notImpliesElim2 premise).premises = #[premise]
- (Cvc.Proof.View.equivElim1 premise).premises = #[premise]
- (Cvc.Proof.View.equivElim2 premise).premises = #[premise]
- (Cvc.Proof.View.notEquivElim1 premise).premises = #[premise]
- (Cvc.Proof.View.notEquivElim2 premise).premises = #[premise]
- (Cvc.Proof.View.xorElim1 premise).premises = #[premise]
- (Cvc.Proof.View.xorElim2 premise).premises = #[premise]
- (Cvc.Proof.View.notXorElim1 premise).premises = #[premise]
- (Cvc.Proof.View.notXorElim2 premise).premises = #[premise]
- (Cvc.Proof.View.iteElim1 premise).premises = #[premise]
- (Cvc.Proof.View.iteElim2 premise).premises = #[premise]
- (Cvc.Proof.View.notIteElim1 premise).premises = #[premise]
- (Cvc.Proof.View.notIteElim2 premise).premises = #[premise]
- (Cvc.Proof.View.notAnd premise).premises = #[premise]
- (Cvc.Proof.View.cnfAndPos f index).premises = #[]
- (Cvc.Proof.View.cnfAndNeg f).premises = #[]
- (Cvc.Proof.View.cnfOrPos f).premises = #[]
- (Cvc.Proof.View.cnfOrNeg f index).premises = #[]
- (Cvc.Proof.View.cnfImpliesPos f).premises = #[]
- (Cvc.Proof.View.cnfImpliesNeg1 f).premises = #[]
- (Cvc.Proof.View.cnfImpliesNeg2 f).premises = #[]
- (Cvc.Proof.View.cnfEquivPos1 f).premises = #[]
- (Cvc.Proof.View.cnfEquivPos2 f).premises = #[]
- (Cvc.Proof.View.cnfEquivNeg1 f).premises = #[]
- (Cvc.Proof.View.cnfEquivNeg2 f).premises = #[]
- (Cvc.Proof.View.cnfXorPos1 f).premises = #[]
- (Cvc.Proof.View.cnfXorPos2 f).premises = #[]
- (Cvc.Proof.View.cnfXorNeg1 f).premises = #[]
- (Cvc.Proof.View.cnfXorNeg2 f).premises = #[]
- (Cvc.Proof.View.cnfItePos1 f).premises = #[]
- (Cvc.Proof.View.cnfItePos2 f).premises = #[]
- (Cvc.Proof.View.cnfItePos3 f).premises = #[]
- (Cvc.Proof.View.cnfIteNeg1 f).premises = #[]
- (Cvc.Proof.View.cnfIteNeg2 f).premises = #[]
- (Cvc.Proof.View.cnfIteNeg3 f).premises = #[]
- (Cvc.Proof.View.refl t).premises = #[]
- (Cvc.Proof.View.symm premise).premises = #[premise]
- (Cvc.Proof.View.trans premises).premises = premises
- (Cvc.Proof.View.cong premises app).premises = premises
- (Cvc.Proof.View.naryCong premises app).premises = premises
- (Cvc.Proof.View.pairwiseCong premises app).premises = premises
- (Cvc.Proof.View.trueIntro premise).premises = #[premise]
- (Cvc.Proof.View.trueElim premise).premises = #[premise]
- (Cvc.Proof.View.falseIntro premise).premises = #[premise]
- (Cvc.Proof.View.falseElim premise).premises = #[premise]
- (Cvc.Proof.View.other rule premises args).premises = premises
Instances For
Maps a step's premises, formulas and terms, in a monad.
Equations
- One or more equations did not get rendered due to their size.
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.assume f) = do let __do_lift ← ff f pure (Cvc.Proof.View.assume __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.scope body discharged) = do let __do_lift ← fp body let __do_lift_1 ← Array.mapM ff discharged pure (Cvc.Proof.View.scope __do_lift __do_lift_1)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.evaluate t) = do let __do_lift ← ft t pure (Cvc.Proof.View.evaluate __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.theoryRewrite rule) = pure (Cvc.Proof.View.theoryRewrite rule)
- Cvc.Proof.View.mapM fp ff ft Cvc.Proof.View.aciNorm = pure Cvc.Proof.View.aciNorm
- Cvc.Proof.View.mapM fp ff ft Cvc.Proof.View.absorb = pure Cvc.Proof.View.absorb
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.trustTheoryRewrite theory method) = pure (Cvc.Proof.View.trustTheoryRewrite theory method)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.satRefutation premises) = do let __do_lift ← Array.mapM fp premises pure (Cvc.Proof.View.satRefutation __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.factoring premise) = do let __do_lift ← fp premise pure (Cvc.Proof.View.factoring __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.reordering premise) = do let __do_lift ← fp premise pure (Cvc.Proof.View.reordering __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.split f) = do let __do_lift ← ff f pure (Cvc.Proof.View.split __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.eqResolve premise equiv) = do let __do_lift ← fp premise let __do_lift_1 ← fp equiv pure (Cvc.Proof.View.eqResolve __do_lift __do_lift_1)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.notNotElim premise) = do let __do_lift ← fp premise pure (Cvc.Proof.View.notNotElim __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.contra premise negation) = do let __do_lift ← fp premise let __do_lift_1 ← fp negation pure (Cvc.Proof.View.contra __do_lift __do_lift_1)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.andElim premise index) = do let __do_lift ← fp premise pure (Cvc.Proof.View.andElim __do_lift index)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.andIntro premises) = do let __do_lift ← Array.mapM fp premises pure (Cvc.Proof.View.andIntro __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.notOrElim premise index) = do let __do_lift ← fp premise pure (Cvc.Proof.View.notOrElim __do_lift index)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.impliesElim premise) = do let __do_lift ← fp premise pure (Cvc.Proof.View.impliesElim __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.notImpliesElim1 premise) = do let __do_lift ← fp premise pure (Cvc.Proof.View.notImpliesElim1 __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.notImpliesElim2 premise) = do let __do_lift ← fp premise pure (Cvc.Proof.View.notImpliesElim2 __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.equivElim1 premise) = do let __do_lift ← fp premise pure (Cvc.Proof.View.equivElim1 __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.equivElim2 premise) = do let __do_lift ← fp premise pure (Cvc.Proof.View.equivElim2 __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.notEquivElim1 premise) = do let __do_lift ← fp premise pure (Cvc.Proof.View.notEquivElim1 __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.notEquivElim2 premise) = do let __do_lift ← fp premise pure (Cvc.Proof.View.notEquivElim2 __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.xorElim1 premise) = do let __do_lift ← fp premise pure (Cvc.Proof.View.xorElim1 __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.xorElim2 premise) = do let __do_lift ← fp premise pure (Cvc.Proof.View.xorElim2 __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.notXorElim1 premise) = do let __do_lift ← fp premise pure (Cvc.Proof.View.notXorElim1 __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.notXorElim2 premise) = do let __do_lift ← fp premise pure (Cvc.Proof.View.notXorElim2 __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.iteElim1 premise) = do let __do_lift ← fp premise pure (Cvc.Proof.View.iteElim1 __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.iteElim2 premise) = do let __do_lift ← fp premise pure (Cvc.Proof.View.iteElim2 __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.notIteElim1 premise) = do let __do_lift ← fp premise pure (Cvc.Proof.View.notIteElim1 __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.notIteElim2 premise) = do let __do_lift ← fp premise pure (Cvc.Proof.View.notIteElim2 __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.notAnd premise) = do let __do_lift ← fp premise pure (Cvc.Proof.View.notAnd __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.cnfAndPos f index) = do let __do_lift ← ff f pure (Cvc.Proof.View.cnfAndPos __do_lift index)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.cnfAndNeg f) = do let __do_lift ← ff f pure (Cvc.Proof.View.cnfAndNeg __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.cnfOrPos f) = do let __do_lift ← ff f pure (Cvc.Proof.View.cnfOrPos __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.cnfOrNeg f index) = do let __do_lift ← ff f pure (Cvc.Proof.View.cnfOrNeg __do_lift index)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.cnfImpliesPos f) = do let __do_lift ← ff f pure (Cvc.Proof.View.cnfImpliesPos __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.cnfImpliesNeg1 f) = do let __do_lift ← ff f pure (Cvc.Proof.View.cnfImpliesNeg1 __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.cnfImpliesNeg2 f) = do let __do_lift ← ff f pure (Cvc.Proof.View.cnfImpliesNeg2 __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.cnfEquivPos1 f) = do let __do_lift ← ff f pure (Cvc.Proof.View.cnfEquivPos1 __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.cnfEquivPos2 f) = do let __do_lift ← ff f pure (Cvc.Proof.View.cnfEquivPos2 __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.cnfEquivNeg1 f) = do let __do_lift ← ff f pure (Cvc.Proof.View.cnfEquivNeg1 __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.cnfEquivNeg2 f) = do let __do_lift ← ff f pure (Cvc.Proof.View.cnfEquivNeg2 __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.cnfXorPos1 f) = do let __do_lift ← ff f pure (Cvc.Proof.View.cnfXorPos1 __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.cnfXorPos2 f) = do let __do_lift ← ff f pure (Cvc.Proof.View.cnfXorPos2 __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.cnfXorNeg1 f) = do let __do_lift ← ff f pure (Cvc.Proof.View.cnfXorNeg1 __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.cnfXorNeg2 f) = do let __do_lift ← ff f pure (Cvc.Proof.View.cnfXorNeg2 __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.cnfItePos1 f) = do let __do_lift ← ff f pure (Cvc.Proof.View.cnfItePos1 __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.cnfItePos2 f) = do let __do_lift ← ff f pure (Cvc.Proof.View.cnfItePos2 __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.cnfItePos3 f) = do let __do_lift ← ff f pure (Cvc.Proof.View.cnfItePos3 __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.cnfIteNeg1 f) = do let __do_lift ← ff f pure (Cvc.Proof.View.cnfIteNeg1 __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.cnfIteNeg2 f) = do let __do_lift ← ff f pure (Cvc.Proof.View.cnfIteNeg2 __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.cnfIteNeg3 f) = do let __do_lift ← ff f pure (Cvc.Proof.View.cnfIteNeg3 __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.refl t) = do let __do_lift ← ft t pure (Cvc.Proof.View.refl __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.symm premise) = do let __do_lift ← fp premise pure (Cvc.Proof.View.symm __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.trans premises) = do let __do_lift ← Array.mapM fp premises pure (Cvc.Proof.View.trans __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.cong premises app) = do let __do_lift ← Array.mapM fp premises let __do_lift_1 ← ft app pure (Cvc.Proof.View.cong __do_lift __do_lift_1)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.naryCong premises app) = do let __do_lift ← Array.mapM fp premises let __do_lift_1 ← ft app pure (Cvc.Proof.View.naryCong __do_lift __do_lift_1)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.trueIntro premise) = do let __do_lift ← fp premise pure (Cvc.Proof.View.trueIntro __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.trueElim premise) = do let __do_lift ← fp premise pure (Cvc.Proof.View.trueElim __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.falseIntro premise) = do let __do_lift ← fp premise pure (Cvc.Proof.View.falseIntro __do_lift)
- Cvc.Proof.View.mapM fp ff ft (Cvc.Proof.View.falseElim premise) = do let __do_lift ← fp premise pure (Cvc.Proof.View.falseElim __do_lift)
Instances For
Maps a step's premises, formulas and terms.
Equations
- Cvc.Proof.View.map fp ff ft v = (Cvc.Proof.View.mapM (fun (p : P) => pure (fp p)) (fun (f : F) => pure (ff f)) (fun (t : T) => pure (ft t)) v).run
Instances For
Traversing #
Folds over the distinct steps reachable from roots, each presented as present builds it.
What both layers' fold are built on. Depth-first: each step is entered — pre — then, unless
that answered skip, its premises (kids) are folded over left to right, and then it is left —
post. A step reached again is passed over entirely unless revisit is set, in which case it is
entered every time it is reached, which can take exponentially long on a proof sharing many
sub-proofs.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Computes a value for every distinct step reachable from roots, bottom-up.
What both layers' foldUp are built on. step is handed a step and the values of its premises
(kids), in order, and is called once per distinct step, so a sub-proof shared by many steps is
computed once. Answers the roots' values, in order. Ending early is the monad's business, by
throwing for instance.
Equations
- One or more equations did not get rendered due to their size.