internlm/Lean-Github huggingface dataset:
Theorem: LRAT.DefaultFormula.insertRatUnits_nodup
Proof state before:
case pos
n : Nat
f : DefaultFormula n
hf : f.ratUnits = #[] ∧ f.assignments.size = n
units : List (Literal (PosFin n))
i j : Fin (f.insertRatUnits units).fst.ratUnits.size
i_ne_j : i ≠ j
li : PosFin n
bi : Bool
hi : (f.insertRatUnits units).fst.ratUnits[i] = (li, bi)
hj : (f.insertRatUnits units).fst.ratUnits[j] = (li, bi)
k : Fin (f.insertRatUnits units).fst.ratUnits.size
b : Bool
left✝² : ∃ x, (f.insertRatUnits units).fst.ratUnits[k] = (⟨li.val, ⋯⟩, b)
left✝¹ : (f.insertRatUnits units).fst.assignments[li.val] = addAssignment b f.assignments[li.val]
left✝ : hasAssignment b f.assignments[li.val] = false
h4 :
  ∀ (k_1 : Fin (f.insertRatUnits units).fst.ratUnits.size),
    ¬k_1 = k → ¬(f.insertRatUnits units).fst.ratUnits[k_1].fst.val = li.val
h✝ : i = k
⊢ False
Tactic:
next i_eq_k =>
have j_ne_k : j ≠ k := by rw [← i_eq_k]; exact i_ne_j.symm
specialize h4 j j_ne_k
simp (config := { decide := true }) only [hj] at h4
Proof state after:
no goals
Theorem: LRAT.DefaultFormula.insertRatUnits_nodup
Proof state before:
n : Nat
f : DefaultFormula n
hf : f.ratUnits = #[] ∧ f.assignments.size = n
units : List (Literal (PosFin n))
i j : Fin (f.insertRatUnits units).fst.ratUnits.size
i_ne_j : i ≠ j
li : PosFin n
bi : Bool
hi : (f.insertRatUnits units).fst.ratUnits[i] = (li, bi)
hj : (f.insertRatUnits units).fst.ratUnits[j] = (li, bi)
k : Fin (f.insertRatUnits units).fst.ratUnits.size
b : Bool
left✝² : ∃ x, (f.insertRatUnits units).fst.ratUnits[k] = (⟨li.val, ⋯⟩, b)
left✝¹ : (f.insertRatUnits units).fst.assignments[li.val] = addAssignment b f.assignments[li.val]
left✝ : hasAssignment b f.assignments[li.val] = false
h4 :
  ∀ (k_1 : Fin (f.insertRatUnits units).fst.ratUnits.size),
    ¬k_1 = k → ¬(f.insertRatUnits units).fst.ratUnits[k_1].fst.val = li.val
i_eq_k : i = k
⊢ False
Tactic:
have j_ne_k : j ≠ k := by rw [← i_eq_k]; exact i_ne_j.symm
Proof state after:
n : Nat
f : DefaultFormula n
hf : f.ratUnits = #[] ∧ f.assignments.size = n
units : List (Literal (PosFin n))
i j : Fin (f.insertRatUnits units).fst.ratUnits.size
i_ne_j : i ≠ j
li : PosFin n
bi : Bool
hi : (f.insertRatUnits units).fst.ratUnits[i] = (li, bi)
hj : (f.insertRatUnits units).fst.ratUnits[j] = (li, bi)
k : Fin (f.insertRatUnits units).fst.ratUnits.size
b : Bool
left✝² : ∃ x, (f.insertRatUnits units).fst.ratUnits[k] = (⟨li.val, ⋯⟩, b)
left✝¹ : (f.insertRatUnits units).fst.assignments[li.val] = addAssignment b f.assignments[li.val]
left✝ : hasAssignment b f.assignments[li.val] = false
h4 :
  ∀ (k_1 : Fin (f.insertRatUnits units).fst.ratUnits.size),
    ¬k_1 = k → ¬(f.insertRatUnits units).fst.ratUnits[k_1].fst.val = li.val
i_eq_k : i = k
j_ne_k : j ≠ k
⊢ False
Theorem: LRAT.DefaultFormula.insertRatUnits_nodup
Proof state before:
n : Nat
f : DefaultFormula n
hf : f.ratUnits = #[] ∧ f.assignments.size = n
units : List (Literal (PosFin n))
i j : Fin (f.insertRatUnits units).fst.ratUnits.size
i_ne_j : i ≠ j
li : PosFin n
bi : Bool
hi : (f.insertRatUnits units).fst.ratUnits[i] = (li, bi)
hj : (f.insertRatUnits units).fst.ratUnits[j] = (li, bi)
k : Fin (f.insertRatUnits units).fst.ratUnits.size
b : Bool
left✝² : ∃ x, (f.insertRatUnits units).fst.ratUnits[k] = (⟨li.val, ⋯⟩, b)
left✝¹ : (f.insertRatUnits units).fst.assignments[li.val] = addAssignment b f.assignments[li.val]
left✝ : hasAssignment b f.assignments[li.val] = false
h4 :
  ∀ (k_1 : Fin (f.insertRatUnits units).fst.ratUnits.size),
    ¬k_1 = k → ¬(f.insertRatUnits units).fst.ratUnits[k_1].fst.val = li.val
i_eq_k : i = k
j_ne_k : j ≠ k
⊢ False
Tactic:
specialize h4 j j_ne_k
Proof state after:
n : Nat
f : DefaultFormula n
hf : f.ratUnits = #[] ∧ f.assignments.size = n
units : List (Literal (PosFin n))
i j : Fin (f.insertRatUnits units).fst.ratUnits.size
i_ne_j : i ≠ j
li : PosFin n
bi : Bool
hi : (f.insertRatUnits units).fst.ratUnits[i] = (li, bi)
hj : (f.insertRatUnits units).fst.ratUnits[j] = (li, bi)
k : Fin (f.insertRatUnits units).fst.ratUnits.size
b : Bool
left✝² : ∃ x, (f.insertRatUnits units).fst.ratUnits[k] = (⟨li.val, ⋯⟩, b)
left✝¹ : (f.insertRatUnits units).fst.assignments[li.val] = addAssignment b f.assignments[li.val]
left✝ : hasAssignment b f.assignments[li.val] = false
i_eq_k : i = k
j_ne_k : j ≠ k
h4 : ¬(f.insertRatUnits units).fst.ratUnits[j].fst.val = li.val
⊢ False
Theorem: LRAT.DefaultFormula.insertRatUnits_nodup
Proof state before:
n : Nat
f : DefaultFormula n
hf : f.ratUnits = #[] ∧ f.assignments.size = n
units : List (Literal (PosFin n))
i j : Fin (f.insertRatUnits units).fst.ratUnits.size
i_ne_j : i ≠ j
li : PosFin n
bi : Bool
hi : (f.insertRatUnits units).fst.ratUnits[i] = (li, bi)
hj : (f.insertRatUnits units).fst.ratUnits[j] = (li, bi)
k : Fin (f.insertRatUnits units).fst.ratUnits.size
b : Bool
left✝² : ∃ x, (f.insertRatUnits units).fst.ratUnits[k] = (⟨li.val, ⋯⟩, b)
left✝¹ : (f.insertRatUnits units).fst.assignments[li.val] = addAssignment b f.assignments[li.val]
left✝ : hasAssignment b f.assignments[li.val] = false
i_eq_k : i = k
j_ne_k : j ≠ k
h4 : ¬(f.insertRatUnits units).fst.ratUnits[j].fst.val = li.val
⊢ False
Tactic:
simp (config := { decide := true }) only [hj] at h4
Proof state after:
no goals
Theorem: LRAT.DefaultFormula.insertRatUnits_nodup
Proof state before:
n : Nat
f : DefaultFormula n
hf : f.ratUnits = #[] ∧ f.assignments.size = n
units : List (Literal (PosFin n))
i j : Fin (f.insertRatUnits units).fst.ratUnits.size
i_ne_j : i ≠ j
li : PosFin n
bi : Bool
hi : (f.insertRatUnits units).fst.ratUnits[i] = (li, bi)
hj : (f.insertRatUnits units).fst.ratUnits[j] = (li, bi)
k : Fin (f.insertRatUnits units).fst.ratUnits.size
b : Bool
left✝² : ∃ x, (f.insertRatUnits units).fst.ratUnits[k] = (⟨li.val, ⋯⟩, b)
left✝¹ : (f.insertRatUnits units).fst.assignments[li.val] = addAssignment b f.assignments[li.val]
left✝ : hasAssignment b f.assignments[li.val] = false
h4 :
  ∀ (k_1 : Fin (f.insertRatUnits units).fst.ratUnits.size),
    ¬k_1 = k → ¬(f.insertRatUnits units).fst.ratUnits[k_1].fst.val = li.val
i_eq_k : i = k
⊢ j ≠ k
Tactic:
rw [← i_eq_k]
Proof state after:
n : Nat
f : DefaultFormula n
hf : f.ratUnits = #[] ∧ f.assignments.size = n
units : List (Literal (PosFin n))
i j : Fin (f.insertRatUnits units).fst.ratUnits.size
i_ne_j : i ≠ j
li : PosFin n
bi : Bool
hi : (f.insertRatUnits units).fst.ratUnits[i] = (li, bi)
hj : (f.insertRatUnits units).fst.ratUnits[j] = (li, bi)
k : Fin (f.insertRatUnits units).fst.ratUnits.size
b : Bool
left✝² : ∃ x, (f.insertRatUnits units).fst.ratUnits[k] = (⟨li.val, ⋯⟩, b)
left✝¹ : (f.insertRatUnits units).fst.assignments[li.val] = addAssignment b f.assignments[li.val]
left✝ : hasAssignment b f.assignments[li.val] = false
h4 :
  ∀ (k_1 : Fin (f.insertRatUnits units).fst.ratUnits.size),
    ¬k_1 = k → ¬(f.insertRatUnits units).fst.ratUnits[k_1].fst.val = li.val
i_eq_k : i = k
⊢ j ≠ i
Theorem: LRAT.DefaultFormula.insertRatUnits_nodup
Proof state before:
n : Nat
f : DefaultFormula n
hf : f.ratUnits = #[] ∧ f.assignments.size = n
units : List (Literal (PosFin n))
i j : Fin (f.insertRatUnits units).fst.ratUnits.size
i_ne_j : i ≠ j
li : PosFin n
bi : Bool
hi : (f.insertRatUnits units).fst.ratUnits[i] = (li, bi)
hj : (f.insertRatUnits units).fst.ratUnits[j] = (li, bi)
k : Fin (f.insertRatUnits units).fst.ratUnits.size
b : Bool
left✝² : ∃ x, (f.insertRatUnits units).fst.ratUnits[k] = (⟨li.val, ⋯⟩, b)
left✝¹ : (f.insertRatUnits units).fst.assignments[li.val] = addAssignment b f.assignments[li.val]
left✝ : hasAssignment b f.assignments[li.val] = false
h4 :
  ∀ (k_1 : Fin (f.insertRatUnits units).fst.ratUnits.size),
    ¬k_1 = k → ¬(f.insertRatUnits units).fst.ratUnits[k_1].fst.val = li.val
i_eq_k : i = k
⊢ j ≠ i
Tactic:
exact i_ne_j.symm
Proof state after:
no goals
Theorem: LRAT.DefaultFormula.insertRatUnits_nodup
Proof state before:
case neg
n : Nat
f : DefaultFormula n
hf : f.ratUnits = #[] ∧ f.assignments.size = n
units : List (Literal (PosFin n))
i j : Fin (f.insertRatUnits units).fst.ratUnits.size
i_ne_j : i ≠ j
li : PosFin n
bi : Bool
hi : (f.insertRatUnits units).fst.ratUnits[i] = (li, bi)
hj : (f.insertRatUnits units).fst.ratUnits[j] = (li, bi)
k : Fin (f.insertRatUnits units).fst.ratUnits.size
b : Bool
left✝² : ∃ x, (f.insertRatUnits units).fst.ratUnits[k] = (⟨li.val, ⋯⟩, b)
left✝¹ : (f.insertRatUnits units).fst.assignments[li.val] = addAssignment b f.assignments[li.val]
left✝ : hasAssignment b f.assignments[li.val] = false
h4 :
  ∀ (k_1 : Fin (f.insertRatUnits units).fst.ratUnits.size),
    ¬k_1 = k → ¬(f.insertRatUnits units).fst.ratUnits[k_1].fst.val = li.val
h✝ : ¬i = k
⊢ False
Tactic:
next i_ne_k =>
specialize h4 i i_ne_k
simp (config := { decide := true }) only [hi] at h4
Proof state after:
no goals
Theorem: LRAT.DefaultFormula.insertRatUnits_nodup
Proof state before:
n : Nat
f : DefaultFormula n
hf : f.ratUnits = #[] ∧ f.assignments.size = n
units : List (Literal (PosFin n))
i j : Fin (f.insertRatUnits units).fst.ratUnits.size
i_ne_j : i ≠ j
li : PosFin n
bi : Bool
hi : (f.insertRatUnits units).fst.ratUnits[i] = (li, bi)
hj : (f.insertRatUnits units).fst.ratUnits[j] = (li, bi)
k : Fin (f.insertRatUnits units).fst.ratUnits.size
b : Bool
left✝² : ∃ x, (f.insertRatUnits units).fst.ratUnits[k] = (⟨li.val, ⋯⟩, b)
left✝¹ : (f.insertRatUnits units).fst.assignments[li.val] = addAssignment b f.assignments[li.val]
left✝ : hasAssignment b f.assignments[li.val] = false
h4 :
  ∀ (k_1 : Fin (f.insertRatUnits units).fst.ratUnits.size),
    ¬k_1 = k → ¬(f.insertRatUnits units).fst.ratUnits[k_1].fst.val = li.val
i_ne_k : ¬i = k
⊢ False
Tactic:
specialize h4 i i_ne_k
Proof state after:
n : Nat
f : DefaultFormula n
hf : f.ratUnits = #[] ∧ f.assignments.size = n
units : List (Literal (PosFin n))
i j : Fin (f.insertRatUnits units).fst.ratUnits.size
i_ne_j : i ≠ j
li : PosFin n
bi : Bool
hi : (f.insertRatUnits units).fst.ratUnits[i] = (li, bi)
hj : (f.insertRatUnits units).fst.ratUnits[j] = (li, bi)
k : Fin (f.insertRatUnits units).fst.ratUnits.size
b : Bool
left✝² : ∃ x, (f.insertRatUnits units).fst.ratUnits[k] = (⟨li.val, ⋯⟩, b)
left✝¹ : (f.insertRatUnits units).fst.assignments[li.val] = addAssignment b f.assignments[li.val]
left✝ : hasAssignment b f.assignments[li.val] = false
i_ne_k : ¬i = k
h4 : ¬(f.insertRatUnits units).fst.ratUnits[i].fst.val = li.val
⊢ False
Theorem: LRAT.DefaultFormula.insertRatUnits_nodup
Proof state before:
n : Nat
f : DefaultFormula n
hf : f.ratUnits = #[] ∧ f.assignments.size = n
units : List (Literal (PosFin n))
i j : Fin (f.insertRatUnits units).fst.ratUnits.size
i_ne_j : i ≠ j
li : PosFin n
bi : Bool
hi : (f.insertRatUnits units).fst.ratUnits[i] = (li, bi)
hj : (f.insertRatUnits units).fst.ratUnits[j] = (li, bi)
k : Fin (f.insertRatUnits units).fst.ratUnits.size
b : Bool
left✝² : ∃ x, (f.insertRatUnits units).fst.ratUnits[k] = (⟨li.val, ⋯⟩, b)
left✝¹ : (f.insertRatUnits units).fst.assignments[li.val] = addAssignment b f.assignments[li.val]
left✝ : hasAssignment b f.assignments[li.val] = false
i_ne_k : ¬i = k
h4 : ¬(f.insertRatUnits units).fst.ratUnits[i].fst.val = li.val
⊢ False
Tactic:
simp (config := { decide := true }) only [hi] at h4
Proof state after:
no goals
Theorem: LRAT.DefaultFormula.insertRatUnits_nodup
Proof state before:
case mk.mk.refl.inr.inr.intro.intro.intro.intro.intro.intro.intro
n : Nat
f : DefaultFormula n
hf : f.ratUnits = #[] ∧ f.assignments.size = n
units : List (Literal (PosFin n))
i j : Fin (f.insertRatUnits units).fst.ratUnits.size
i_ne_j : i ≠ j
li : PosFin n
bi : Bool
hi : (f.insertRatUnits units).fst.ratUnits[i] = (li, bi)
hj : (f.insertRatUnits units).fst.ratUnits[j] = (li, bi)
k1 k2 : Fin (f.insertRatUnits units).fst.ratUnits.size
li_gt_zero : li.val > 0
h1 : (f.insertRatUnits units).fst.ratUnits[k1] = (⟨li.val, ⋯⟩, true)
h2 : (f.insertRatUnits units).fst.ratUnits[k2] = (⟨li.val, ⋯⟩, false)
h3 : (f.insertRatUnits units).fst.assignments[li.val] = both
h4 : f.assignments[li.val] = unassigned
h5 :
  ∀ (k : Fin (f.insertRatUnits units).fst.ratUnits.size),
    ¬k = k1 → ¬k = k2 → ¬(f.insertRatUnits units).fst.ratUnits[k].fst.val = li.val
⊢ False
Tactic:
by_cases bi
Proof state after:
case pos
n : Nat
f : DefaultFormula n
hf : f.ratUnits = #[] ∧ f.assignments.size = n
units : List (Literal (PosFin n))
i j : Fin (f.insertRatUnits units).fst.ratUnits.size
i_ne_j : i ≠ j
li : PosFin n
bi : Bool
hi : (f.insertRatUnits units).fst.ratUnits[i] = (li, bi)
hj : (f.insertRatUnits units).fst.ratUnits[j] = (li, bi)
k1 k2 : Fin (f.insertRatUnits units).fst.ratUnits.size
li_gt_zero : li.val > 0
h1 : (f.insertRatUnits units).fst.ratUnits[k1] = (⟨li.val, ⋯⟩, true)
h2 : (f.insertRatUnits units).fst.ratUnits[k2] = (⟨li.val, ⋯⟩, false)
h3 : (f.insertRatUnits units).fst.assignments[li.val] = both
h4 : f.assignments[li.val] = unassigned
h5 :
  ∀ (k : Fin (f.insertRatUnits units).fst.ratUnits.size),
    ¬k = k1 → ¬k = k2 → ¬(f.insertRatUnits units).fst.ratUnits[k].fst.val = li.val
h✝ : bi = true
⊢ False

case neg
n : Nat
f : DefaultFormula n
hf : f.ratUnits = #[] ∧ f.assignments.size = n
units : List (Literal (PosFin n))
i j : Fin (f.insertRatUnits units).fst.ratUnits.size
i_ne_j : i ≠ j
li : PosFin n
bi : Bool
hi : (f.insertRatUnits units).fst.ratUnits[i] = (li, bi)
hj : (f.insertRatUnits units).fst.ratUnits[j] = (li, bi)
k1 k2 : Fin (f.insertRatUnits units).fst.ratUnits.size
li_gt_zero : li.val > 0
h1 : (f.insertRatUnits units).fst.ratUnits[k1] = (⟨li.val, ⋯⟩, true)
h2 : (f.insertRatUnits units).fst.ratUnits[k2] = (⟨li.val, ⋯⟩, false)
h3 : (f.insertRatUnits units).fst.assignments[li.val] = both
h4 : f.assignments[li.val] = unassigned
h5 :
  ∀ (k : Fin (f.insertRatUnits units).fst.ratUnits.size),
    ¬k = k1 → ¬k = k2 → ¬(f.insertRatUnits units).fst.ratUnits[k].fst.val = li.val
h✝ : ¬bi = true
⊢ False
Theorem: LRAT.DefaultFormula.insertRatUnits_nodup
Proof state before:
case pos
n : Nat
f : DefaultFormula n
hf : f.ratUnits = #[] ∧ f.assignments.size = n
units : List (Literal (PosFin n))
i j : Fin (f.insertRatUnits units).fst.ratUnits.size
i_ne_j : i ≠ j
li : PosFin n
bi : Bool
hi : (f.insertRatUnits units).fst.ratUnits[i] = (li, bi)
hj : (f.insertRatUnits units).fst.ratUnits[j] = (li, bi)
k1 k2 : Fin (f.insertRatUnits units).fst.ratUnits.size
li_gt_zero : li.val > 0
h1 : (f.insertRatUnits units).fst.ratUnits[k1] = (⟨li.val, ⋯⟩, true)
h2 : (f.insertRatUnits units).fst.ratUnits[k2] = (⟨li.val, ⋯⟩, false)
h3 : (f.insertRatUnits units).fst.assignments[li.val] = both
h4 : f.assignments[li.val] = unassigned
h5 :
  ∀ (k : Fin (f.insertRatUnits units).fst.ratUnits.size),
    ¬k = k1 → ¬k = k2 → ¬(f.insertRatUnits units).fst.ratUnits[k].fst.val = li.val
h✝ : bi = true
⊢ False

case neg
n : Nat
f : DefaultFormula n
hf : f.ratUnits = #[] ∧ f.assignments.size = n
units : List (Literal (PosFin n))
i j : Fin (f.insertRatUnits units).fst.ratUnits.size
i_ne_j : i ≠ j
li : PosFin n
bi : Bool
hi : (f.insertRatUnits units).fst.ratUnits[i] = (li, bi)
hj : (f.insertRatUnits units).fst.ratUnits[j] = (li, bi)
k1 k2 : Fin (f.insertRatUnits units).fst.ratUnits.size
li_gt_zero : li.val > 0
h1 : (f.insertRatUnits units).fst.ratUnits[k1] = (⟨li.val, ⋯⟩, true)
h2 : (f.insertRatUnits units).fst.ratUnits[k2] = (⟨li.val, ⋯⟩, false)
h3 : (f.insertRatUnits units).fst.assignments[li.val] = both
h4 : f.assignments[li.val] = unassigned
h5 :
  ∀ (k : Fin (f.insertRatUnits units).fst.ratUnits.size),
    ¬k = k1 → ¬k = k2 → ¬(f.insertRatUnits units).fst.ratUnits[k].fst.val = li.val
h✝ : ¬bi = true
⊢ False
Tactic:
. next bi_eq_true =>
  by_cases i = k1
  . next i_eq_k1 =>
    have j_ne_k1 : j ≠ k1 := by rw [← i_eq_k1]; exact i_ne_j.symm
    by_cases j = k2
    . next j_eq_k2 =>
      rw [← j_eq_k2, hj, bi_eq_true] at h2
      simp at h2
    . next j_ne_k2 =>
      specialize h5 j j_ne_k1 j_ne_k2
      simp (config := { decide := true }) only [hj] at h5
  . next i_ne_k1 =>
    by_cases i = k2
    . next i_eq_k2 =>
      rw [← i_eq_k2, hi, bi_eq_true] at h2
      simp at h2
    . next i_ne_k2 =>
      specialize h5 i i_ne_k1 i_ne_k2
      simp only [hi, not_true] at h5
Proof state after:
case neg
n : Nat
f : DefaultFormula n
hf : f.ratUnits = #[] ∧ f.assignments.size = n
units : List (Literal (PosFin n))
i j : Fin (f.insertRatUnits units).fst.ratUnits.size
i_ne_j : i ≠ j
li : PosFin n
bi : Bool
hi : (f.insertRatUnits units).fst.ratUnits[i] = (li, bi)
hj : (f.insertRatUnits units).fst.ratUnits[j] = (li, bi)
k1 k2 : Fin (f.insertRatUnits units).fst.ratUnits.size
li_gt_zero : li.val > 0
h1 : (f.insertRatUnits units).fst.ratUnits[k1] = (⟨li.val, ⋯⟩, true)
h2 : (f.insertRatUnits units).fst.ratUnits[k2] = (⟨li.val, ⋯⟩, false)
h3 : (f.insertRatUnits units).fst.assignments[li.val] = both
h4 : f.assignments[li.val] = unassigned
h5 :
  ∀ (k : Fin (f.insertRatUnits units).fst.ratUnits.size),
    ¬k = k1 → ¬k = k2 → ¬(f.insertRatUnits units).fst.ratUnits[k].fst.val = li.val
h✝ : ¬bi = true
⊢ False
Theorem: LRAT.DefaultFormula.insertRatUnits_nodup
Proof state before:
case neg
n : Nat
f : DefaultFormula n
hf : f.ratUnits = #[] ∧ f.assignments.size = n
units : List (Literal (PosFin n))
i j : Fin (f.insertRatUnits units).fst.ratUnits.size
i_ne_j : i ≠ j
li : PosFin n
bi : Bool
hi : (f.insertRatUnits units).fst.ratUnits[i] = (li, bi)
hj : (f.insertRatUnits units).fst.ratUnits[j] = (li, bi)
k1 k2 : Fin (f.insertRatUnits units).fst.ratUnits.size
li_gt_zero : li.val > 0
h1 : (f.insertRatUnits units).fst.ratUnits[k1] = (⟨li.val, ⋯⟩, true)
h2 : (f.insertRatUnits units).fst.ratUnits[k2] = (⟨li.val, ⋯⟩, false)
h3 : (f.insertRatUnits units).fst.assignments[li.val] = both
h4 : f.assignments[li.val] = unassigned
h5 :
  ∀ (k : Fin (f.insertRatUnits units).fst.ratUnits.size),
    ¬k = k1 → ¬k = k2 → ¬(f.insertRatUnits units).fst.ratUnits[k].fst.val = li.val
h✝ : ¬bi = true
⊢ False
Tactic:
. next bi_eq_false =>
  simp only [Bool.not_eq_true] at bi_eq_false
  by_cases i = k2
  . next i_eq_k2 =>
    have j_ne_k2 : j ≠ k2 := by rw [← i_eq_k2]; exact i_ne_j.symm
    by_cases j = k1
    . next j_eq_k1 =>
      rw [← j_eq_k1, hj, bi_eq_false] at h1
      simp at h1
    . next j_ne_k1 =>
      specialize h5 j j_ne_k1 j_ne_k2
      simp (config := { decide := true }) only [hj] at h5
  . next i_ne_k2 =>
    by_cases i = k1
    . next i_eq_k1 =>
      rw [← i_eq_k1, hi, bi_eq_false] at h1
      simp at h1
    . next i_ne_k1 =>
      specialize h5 i i_ne_k1 i_ne_k2
      simp (config := { decide := true }) only [hi] at h5
Proof state after:
no goals
Theorem: LRAT.DefaultFormula.insertRatUnits_nodup
Proof state before:
case pos
n : Nat
f : DefaultFormula n
hf : f.ratUnits = #[] ∧ f.assignments.size = n
units : List (Literal (PosFin n))
i j : Fin (f.insertRatUnits units).fst.ratUnits.size
i_ne_j : i ≠ j
li : PosFin n
bi : Bool
hi : (f.insertRatUnits units).fst.ratUnits[i] = (li, bi)
hj : (f.insertRatUnits units).fst.ratUnits[j] = (li, bi)
k1 k2 : Fin (f.insertRatUnits units).fst.ratUnits.size
li_gt_zero : li.val > 0
h1 : (f.insertRatUnits units).fst.ratUnits[k1] = (⟨li.val, ⋯⟩, true)
h2 : (f.insertRatUnits units).fst.ratUnits[k2] = (⟨li.val, ⋯⟩, false)
h3 : (f.insertRatUnits units).fst.assignments[li.val] = both
h4 : f.assignments[li.val] = unassigned
h5 :
  ∀ (k : Fin (f.insertRatUnits units).fst.ratUnits.size),
    ¬k = k1 → ¬k = k2 → ¬(f.insertRatUnits units).fst.ratUnits[k].fst.val = li.val
h✝ : bi = true
⊢ False
Tactic:
next bi_eq_true =>
by_cases i = k1
. next i_eq_k1 =>
  have j_ne_k1 : j ≠ k1 := by rw [← i_eq_k1]; exact i_ne_j.symm
  by_cases j = k2
  . next j_eq_k2 =>
    rw [← j_eq_k2, hj, bi_eq_true] at h2
    simp at h2
  . next j_ne_k2 =>
    specialize h5 j j_ne_k1 j_ne_k2
    simp (config := { decide := true }) only [hj] at h5
. next i_ne_k1 =>
  by_cases i = k2
  . next i_eq_k2 =>
    rw [← i_eq_k2, hi, bi_eq_true] at h2
    simp at h2
  . next i_ne_k2 =>
    specialize h5 i i_ne_k1 i_ne_k2
    simp only [hi, not_true] at h5
Proof state after:
no goals
Theorem: LRAT.DefaultFormula.insertRatUnits_nodup
Proof state before:
n : Nat
f : DefaultFormula n
hf : f.ratUnits = #[] ∧ f.assignments.size = n
units : List (Literal (PosFin n))
i j : Fin (f.insertRatUnits units).fst.ratUnits.size
i_ne_j : i ≠ j
li : PosFin n
bi : Bool
hi : (f.insertRatUnits units).fst.ratUnits[i] = (li, bi)
hj : (f.insertRatUnits units).fst.ratUnits[j] = (li, bi)
k1 k2 : Fin (f.insertRatUnits units).fst.ratUnits.size
li_gt_zero : li.val > 0
h1 : (f.insertRatUnits units).fst.ratUnits[k1] = (⟨li.val, ⋯⟩, true)
h2 : (f.insertRatUnits units).fst.ratUnits[k2] = (⟨li.val, ⋯⟩, false)
h3 : (f.insertRatUnits units).fst.assignments[li.val] = both
h4 : f.assignments[li.val] = unassigned
h5 :
  ∀ (k : Fin (f.insertRatUnits units).fst.ratUnits.size),
    ¬k = k1 → ¬k = k2 → ¬(f.insertRatUnits units).fst.ratUnits[k].fst.val = li.val
bi_eq_true : bi = true
⊢ False
Tactic:
by_cases i = k1
Proof state after:
case pos
n : Nat
f : DefaultFormula n
hf : f.ratUnits = #[] ∧ f.assignments.size = n
units : List (Literal (PosFin n))
i j : Fin (f.insertRatUnits units).fst.ratUnits.size
i_ne_j : i ≠ j
li : PosFin n
bi : Bool
hi : (f.insertRatUnits units).fst.ratUnits[i] = (li, bi)
hj : (f.insertRatUnits units).fst.ratUnits[j] = (li, bi)
k1 k2 : Fin (f.insertRatUnits units).fst.ratUnits.size
li_gt_zero : li.val > 0
h1 : (f.insertRatUnits units).fst.ratUnits[k1] = (⟨li.val, ⋯⟩, true)
h2 : (f.insertRatUnits units).fst.ratUnits[k2] = (⟨li.val, ⋯⟩, false)
h3 : (f.insertRatUnits units).fst.assignments[li.val] = both
h4 : f.assignments[li.val] = unassigned
h5 :
  ∀ (k : Fin (f.insertRatUnits units).fst.ratUnits.size),
    ¬k = k1 → ¬k = k2 → ¬(f.insertRatUnits units).fst.ratUnits[k].fst.val = li.val
bi_eq_true : bi = true
h✝ : i = k1
⊢ False

case neg
n : Nat
f : DefaultFormula n
hf : f.ratUnits = #[] ∧ f.assignments.size = n
units : List (Literal (PosFin n))
i j : Fin (f.insertRatUnits units).fst.ratUnits.size
i_ne_j : i ≠ j
li : PosFin n
bi : Bool
hi : (f.insertRatUnits units).fst.ratUnits[i] = (li, bi)
hj : (f.insertRatUnits units).fst.ratUnits[j] = (li, bi)
k1 k2 : Fin (f.insertRatUnits units).fst.ratUnits.size
li_gt_zero : li.val > 0
h1 : (f.insertRatUnits units).fst.ratUnits[k1] = (⟨li.val, ⋯⟩, true)
h2 : (f.insertRatUnits units).fst.ratUnits[k2] = (⟨li.val, ⋯⟩, false)
h3 : (f.insertRatUnits units).fst.assignments[li.val] = both
h4 : f.assignments[li.val] = unassigned
h5 :
  ∀ (k : Fin (f.insertRatUnits units).fst.ratUnits.size),
    ¬k = k1 → ¬k = k2 → ¬(f.insertRatUnits units).fst.ratUnits[k].fst.val = li.val
bi_eq_true : bi = true
h✝ : ¬i = k1
⊢ False