split
case intro.intro
n : Nat
f : DefaultFormula n
rupHints : Array Nat
idx : Fin rupHints.size
acc : Array Assignment × List (Literal (PosFin n)) × Bool × Bool
hsize : acc.fst.size = n
h1 : limplies (PosFin n) f acc.fst
h2 : acc.snd.snd.fst = true → incompatible (PosFin n) acc.fst f
⊢ f.confirmRupHint_fold_entails_hsat_motive (↑idx + 1)
    (if acc.2.2.snd = true ∨ acc.2.2.fst = true then acc
    else
      match f.clauses[rupHints[↑idx]]? with
      | some (some c) =>
        match c.reduce acc.fst with
        | encounteredBoth => (acc.fst, acc.2.fst, true, false)
        | reducedToEmpty => (acc.fst, acc.2.fst, true, false)
        | reducedToUnit (l, b) =>
          if hasAssignment b acc.fst[l.val]! = true then (acc.fst, acc.2.fst, false, false)
          else (acc.fst.modify l.val (addAssignment b), (l, b) :: acc.2.fst, false, false)
        | reducedToNonunit => (acc.fst, acc.2.fst, false, true)
      | some none => (acc.fst, acc.2.fst, false, true)
      | none => (acc.fst, acc.2.fst, false, true))
case intro.intro.isTrue
n : Nat
f : DefaultFormula n
rupHints : Array Nat
idx : Fin rupHints.size
acc : Array Assignment × List (Literal (PosFin n)) × Bool × Bool
hsize : acc.fst.size = n
h1 : limplies (PosFin n) f acc.fst
h2 : acc.snd.snd.fst = true → incompatible (PosFin n) acc.fst f
h✝ : acc.2.2.snd = true ∨ acc.2.2.fst = true
⊢ f.confirmRupHint_fold_entails_hsat_motive (↑idx + 1) acc

case intro.intro.isFalse
n : Nat
f : DefaultFormula n
rupHints : Array Nat
idx : Fin rupHints.size
acc : Array Assignment × List (Literal (PosFin n)) × Bool × Bool
hsize : acc.fst.size = n
h1 : limplies (PosFin n) f acc.fst
h2 : acc.snd.snd.fst = true → incompatible (PosFin n) acc.fst f
h✝ : ¬(acc.2.2.snd = true ∨ acc.2.2.fst = true)
⊢ f.confirmRupHint_fold_entails_hsat_motive (↑idx + 1)
    (match f.clauses[rupHints[↑idx]]? with
    | some (some c) =>
      match c.reduce acc.fst with
      | encounteredBoth => (acc.fst, acc.2.fst, true, false)
      | reducedToEmpty => (acc.fst, acc.2.fst, true, false)
      | reducedToUnit (l, b) =>
        if hasAssignment b acc.fst[l.val]! = true then (acc.fst, acc.2.fst, false, false)
        else (acc.fst.modify l.val (addAssignment b), (l, b) :: acc.2.fst, false, false)
      | reducedToNonunit => (acc.fst, acc.2.fst, false, true)
    | some none => (acc.fst, acc.2.fst, false, true)
    | none => (acc.fst, acc.2.fst, false, true))