Theorem: BVDecide.verifyCert_correct
Proof state before:
c : CNF Nat
b : LratCert
x✝¹ : Option (Array LRAT.IntAction)
lratProof✝ : Array LRAT.IntAction
heq✝ : LRAT.parseLRATProof (String.toUTF8 b) = some lratProof✝
h1 :
  LRAT.lratChecker (LratFormula.ofCnf c).formula
      (List.map Subtype.val
        (List.filterMap
          (fun actOpt =>
            match actOpt with
            | none => none
            | some (LRAT.Action.addEmpty id rupHints) => some ⟨LRAT.Action.addEmpty id rupHints, True.intro⟩
            | some (LRAT.Action.addRup id c_1 rupHints) => some ⟨LRAT.Action.addRup id c_1 rupHints, True.intro⟩
            | some (LRAT.Action.del ids) => some ⟨LRAT.Action.del ids, True.intro⟩
            | some (LRAT.Action.addRat id c_1 pivot rupHints ratHints) =>
              if h : pivot ∈ LRAT.Clause.toList c_1 then some ⟨LRAT.Action.addRat id c_1 pivot rupHints ratHints, ⋯⟩
              else none)
          (List.map (LRAT.intActionToDefaultClauseAction ((LratFormula.ofCnf c).numVars + 1)) lratProof✝.toList))) =
    LRAT.Result.success
h2✝ : unsatisfiable (PosFin ((LratFormula.ofCnf c).numVars + 1)) (LratFormula.ofCnf c).formula
assignment : PosFin (c.numLiterals + 1) → Bool
h2 : ¬(assignment ⊨ LRAT.DefaultFormula.ofArray (List.toArray c.lift.convertLRAT'))
lratClause : LRAT.DefaultClause ((LratFormula.ofCnf c).numVars + 1)
reflectClause : CNF.Clause (PosFin (c.numLiterals + 1))
hrclause1 : reflectClause ∈ c.lift
h3 : ∀ (x : CNF.Clause (PosFin (c.numLiterals + 1))), x ∈ c.lift → CNF.Clause.eval assignment x = true
x✝ : Option (LRAT.DefaultClause (c.numLiterals + 1))
foo✝ : LRAT.DefaultClause (c.numLiterals + 1)
heq : reflectClause.convertLRAT' = some foo✝
hrclause2 : some (some foo✝) = some (some lratClause)
⊢ assignment ⊨ lratClause
Tactic:
rw [← heq] at hrclause2
Proof state after:
c : CNF Nat
b : LratCert
x✝¹ : Option (Array LRAT.IntAction)
lratProof✝ : Array LRAT.IntAction
heq✝ : LRAT.parseLRATProof (String.toUTF8 b) = some lratProof✝
h1 :
  LRAT.lratChecker (LratFormula.ofCnf c).formula
      (List.map Subtype.val
        (List.filterMap
          (fun actOpt =>
            match actOpt with
            | none => none
            | some (LRAT.Action.addEmpty id rupHints) => some ⟨LRAT.Action.addEmpty id rupHints, True.intro⟩
            | some (LRAT.Action.addRup id c_1 rupHints) => some ⟨LRAT.Action.addRup id c_1 rupHints, True.intro⟩
            | some (LRAT.Action.del ids) => some ⟨LRAT.Action.del ids, True.intro⟩
            | some (LRAT.Action.addRat id c_1 pivot rupHints ratHints) =>
              if h : pivot ∈ LRAT.Clause.toList c_1 then some ⟨LRAT.Action.addRat id c_1 pivot rupHints ratHints, ⋯⟩
              else none)
          (List.map (LRAT.intActionToDefaultClauseAction ((LratFormula.ofCnf c).numVars + 1)) lratProof✝.toList))) =
    LRAT.Result.success
h2✝ : unsatisfiable (PosFin ((LratFormula.ofCnf c).numVars + 1)) (LratFormula.ofCnf c).formula
assignment : PosFin (c.numLiterals + 1) → Bool
h2 : ¬(assignment ⊨ LRAT.DefaultFormula.ofArray (List.toArray c.lift.convertLRAT'))
lratClause : LRAT.DefaultClause ((LratFormula.ofCnf c).numVars + 1)
reflectClause : CNF.Clause (PosFin (c.numLiterals + 1))
hrclause1 : reflectClause ∈ c.lift
h3 : ∀ (x : CNF.Clause (PosFin (c.numLiterals + 1))), x ∈ c.lift → CNF.Clause.eval assignment x = true
x✝ : Option (LRAT.DefaultClause (c.numLiterals + 1))
foo✝ : LRAT.DefaultClause (c.numLiterals + 1)
heq : reflectClause.convertLRAT' = some foo✝
hrclause2 : some reflectClause.convertLRAT' = some (some lratClause)
⊢ assignment ⊨ lratClause