internlm/Lean-Github huggingface dataset:
Theorem: LRAT.DefaultFormula.derivedLits_nodup
Proof state before:
n : Nat
f : DefaultFormula n
f_assignments_size : f.assignments.size = n
rupHints : Array Nat
f'_assignments_size : (f.performRupCheck rupHints).fst.assignments.size = n
derivedLits : List (Literal (PosFin n))
derivedLits_satisfies_invariant :
  f.derivedLits_invariant f_assignments_size (f.performRupCheck rupHints).fst.assignments f'_assignments_size
    derivedLits
derivedLits_arr : Array (Literal (PosFin n))
derivedLits_arr_def : derivedLits_arr = { data := derivedLits }
i j : Fin derivedLits_arr.size
i_ne_j : i ≠ j
li_eq_lj : derivedLits_arr[i] = derivedLits_arr[j]
li : Literal (PosFin n) := derivedLits_arr[i]
li_in_derivedLits : li ∈ derivedLits
i_in_bounds : ↑i < derivedLits.length
j_in_bounds : ↑j < derivedLits.length
k : Fin derivedLits.length
left✝² : (derivedLits.get k).fst.val = ↑⟨li.fst.val, ⋯⟩
left✝¹ :
  (f.performRupCheck rupHints).fst.assignments[↑⟨li.fst.val, ⋯⟩] =
    addAssignment (derivedLits.get k).snd f.assignments[↑⟨li.fst.val, ⋯⟩]
left✝ : ¬hasAssignment (derivedLits.get k).snd f.assignments[↑⟨li.fst.val, ⋯⟩] = true
h3 : ∀ (k_1 : Fin derivedLits.length), k_1 ≠ k → (derivedLits.get k_1).fst.val ≠ ↑⟨li.fst.val, ⋯⟩
k_ne_i : ¬↑k = ↑i
i_eq_k : ⟨↑i, i_in_bounds⟩ = k
⊢ False
Tactic:
simp only [← i_eq_k, not_true] at k_ne_i
Proof state after:
no goals
Theorem: LRAT.DefaultFormula.derivedLits_nodup
Proof state before:
case neg
n : Nat
f : DefaultFormula n
f_assignments_size : f.assignments.size = n
rupHints : Array Nat
f'_assignments_size : (f.performRupCheck rupHints).fst.assignments.size = n
derivedLits : List (Literal (PosFin n))
derivedLits_satisfies_invariant :
  f.derivedLits_invariant f_assignments_size (f.performRupCheck rupHints).fst.assignments f'_assignments_size
    derivedLits
derivedLits_arr : Array (Literal (PosFin n))
derivedLits_arr_def : derivedLits_arr = { data := derivedLits }
i j : Fin derivedLits_arr.size
i_ne_j : i ≠ j
li_eq_lj : derivedLits_arr[i] = derivedLits_arr[j]
li : Literal (PosFin n) := derivedLits_arr[i]
li_in_derivedLits : li ∈ derivedLits
i_in_bounds : ↑i < derivedLits.length
j_in_bounds : ↑j < derivedLits.length
k1 k2 : Fin derivedLits.length
left✝³ : (derivedLits.get k1).fst.val = ↑⟨li.fst.val, ⋯⟩
left✝² : (derivedLits.get k2).fst.val = ↑⟨li.fst.val, ⋯⟩
k1_eq_true : (derivedLits.get k1).snd = true
k2_eq_false : (derivedLits.get k2).snd = false
left✝¹ : (f.performRupCheck rupHints).fst.assignments[↑⟨li.fst.val, ⋯⟩] = both
left✝ : f.assignments[↑⟨li.fst.val, ⋯⟩] = unassigned
h3 : ∀ (k : Fin derivedLits.length), k ≠ k1 → k ≠ k2 → (derivedLits.get k).fst.val ≠ ↑⟨li.fst.val, ⋯⟩
h✝ : ¬li.snd = true
⊢ False
Tactic:
. next li_eq_false =>
  simp only [Bool.not_eq_true] at li_eq_false
  have i_ne_k1 : ⟨i.1, i_in_bounds⟩ ≠ k1 := by
    intro i_eq_k1
    rw [← i_eq_k1] at k1_eq_true
    simp only [derivedLits_arr_def, Fin.getElem_fin, Array.getElem_eq_data_get, k1_eq_true, li] at li_eq_false
  have j_ne_k1 : ⟨j.1, j_in_bounds⟩ ≠ k1 := by
    intro j_eq_k1
    rw [← j_eq_k1] at k1_eq_true
    simp only [derivedLits_arr_def, Fin.getElem_fin, Array.getElem_eq_data_get] at li_eq_lj
    simp only [derivedLits_arr_def, Fin.getElem_fin, Array.getElem_eq_data_get, k1_eq_true, li_eq_lj, li] at li_eq_false
  by_cases ⟨i.1, i_in_bounds⟩ = k2
  . next i_eq_k2 =>
    have j_ne_k2 : ⟨j.1, j_in_bounds⟩ ≠ k2 := by
      intro j_eq_k2
      rw [← j_eq_k2] at i_eq_k2
      simp only [Fin.mk.injEq] at i_eq_k2
      exact i_ne_j (Fin.eq_of_val_eq i_eq_k2)
    specialize h3 ⟨j.1, j_in_bounds⟩ j_ne_k1 j_ne_k2
    simp only [li, li_eq_lj, derivedLits_arr_def, Fin.getElem_fin, Array.getElem_eq_data_get, ne_eq, not_true] at h3
  . next i_ne_k2 =>
    specialize h3 ⟨i.1, i_in_bounds⟩ i_ne_k1 i_ne_k2
    simp (config := { decide := true }) only [Fin.getElem_fin, Array.getElem_eq_data_get, ne_eq, derivedLits_arr_def, li] at h3
Proof state after:
no goals
Theorem: LRAT.DefaultFormula.derivedLits_nodup
Proof state before:
case pos
n : Nat
f : DefaultFormula n
f_assignments_size : f.assignments.size = n
rupHints : Array Nat
f'_assignments_size : (f.performRupCheck rupHints).fst.assignments.size = n
derivedLits : List (Literal (PosFin n))
derivedLits_satisfies_invariant :
  f.derivedLits_invariant f_assignments_size (f.performRupCheck rupHints).fst.assignments f'_assignments_size
    derivedLits
derivedLits_arr : Array (Literal (PosFin n))
derivedLits_arr_def : derivedLits_arr = { data := derivedLits }
i j : Fin derivedLits_arr.size
i_ne_j : i ≠ j
li_eq_lj : derivedLits_arr[i] = derivedLits_arr[j]
li : Literal (PosFin n) := derivedLits_arr[i]
li_in_derivedLits : li ∈ derivedLits
i_in_bounds : ↑i < derivedLits.length
j_in_bounds : ↑j < derivedLits.length
k1 k2 : Fin derivedLits.length
left✝³ : (derivedLits.get k1).fst.val = ↑⟨li.fst.val, ⋯⟩
left✝² : (derivedLits.get k2).fst.val = ↑⟨li.fst.val, ⋯⟩
k1_eq_true : (derivedLits.get k1).snd = true
k2_eq_false : (derivedLits.get k2).snd = false
left✝¹ : (f.performRupCheck rupHints).fst.assignments[↑⟨li.fst.val, ⋯⟩] = both
left✝ : f.assignments[↑⟨li.fst.val, ⋯⟩] = unassigned
h3 : ∀ (k : Fin derivedLits.length), k ≠ k1 → k ≠ k2 → (derivedLits.get k).fst.val ≠ ↑⟨li.fst.val, ⋯⟩
h✝ : li.snd = true
⊢ False
Tactic:
next li_eq_true =>
have i_ne_k2 : ⟨i.1, i_in_bounds⟩ ≠ k2 := by
  intro i_eq_k2
  rw [← i_eq_k2] at k2_eq_false
  simp only [derivedLits_arr_def, Fin.getElem_fin, Array.getElem_eq_data_get, k2_eq_false, li] at li_eq_true
have j_ne_k2 : ⟨j.1, j_in_bounds⟩ ≠ k2 := by
  intro j_eq_k2
  rw [← j_eq_k2] at k2_eq_false
  simp only [derivedLits_arr_def, Fin.getElem_fin, Array.getElem_eq_data_get] at li_eq_lj
  simp only [derivedLits_arr_def, Fin.getElem_fin, Array.getElem_eq_data_get, k2_eq_false, li_eq_lj, li] at li_eq_true
by_cases ⟨i.1, i_in_bounds⟩ = k1
. next i_eq_k1 =>
  have j_ne_k1 : ⟨j.1, j_in_bounds⟩ ≠ k1 := by
    intro j_eq_k1
    rw [← j_eq_k1] at i_eq_k1
    simp only [Fin.mk.injEq] at i_eq_k1
    exact i_ne_j (Fin.eq_of_val_eq i_eq_k1)
  specialize h3 ⟨j.1, j_in_bounds⟩ j_ne_k1 j_ne_k2
  simp only [li, li_eq_lj, derivedLits_arr_def, Fin.getElem_fin, Array.getElem_eq_data_get, ne_eq, not_true] at h3
. next i_ne_k1 =>
  specialize h3 ⟨i.1, i_in_bounds⟩ i_ne_k1 i_ne_k2
  simp (config := { decide := true }) only [Fin.getElem_fin, Array.getElem_eq_data_get, ne_eq, derivedLits_arr_def, li] at h3
Proof state after:
no goals
Theorem: LRAT.DefaultFormula.derivedLits_nodup
Proof state before:
n : Nat
f : DefaultFormula n
f_assignments_size : f.assignments.size = n
rupHints : Array Nat
f'_assignments_size : (f.performRupCheck rupHints).fst.assignments.size = n
derivedLits : List (Literal (PosFin n))
derivedLits_satisfies_invariant :
  f.derivedLits_invariant f_assignments_size (f.performRupCheck rupHints).fst.assignments f'_assignments_size
    derivedLits
derivedLits_arr : Array (Literal (PosFin n))
derivedLits_arr_def : derivedLits_arr = { data := derivedLits }
i j : Fin derivedLits_arr.size
i_ne_j : i ≠ j
li_eq_lj : derivedLits_arr[i] = derivedLits_arr[j]
li : Literal (PosFin n) := derivedLits_arr[i]
li_in_derivedLits : li ∈ derivedLits
i_in_bounds : ↑i < derivedLits.length
j_in_bounds : ↑j < derivedLits.length
k1 k2 : Fin derivedLits.length
left✝³ : (derivedLits.get k1).fst.val = ↑⟨li.fst.val, ⋯⟩
left✝² : (derivedLits.get k2).fst.val = ↑⟨li.fst.val, ⋯⟩
k1_eq_true : (derivedLits.get k1).snd = true
k2_eq_false : (derivedLits.get k2).snd = false
left✝¹ : (f.performRupCheck rupHints).fst.assignments[↑⟨li.fst.val, ⋯⟩] = both
left✝ : f.assignments[↑⟨li.fst.val, ⋯⟩] = unassigned
h3 : ∀ (k : Fin derivedLits.length), k ≠ k1 → k ≠ k2 → (derivedLits.get k).fst.val ≠ ↑⟨li.fst.val, ⋯⟩
li_eq_true : li.snd = true
⊢ False
Tactic:
have i_ne_k2 : ⟨i.1, i_in_bounds⟩ ≠ k2 := by
  intro i_eq_k2
  rw [← i_eq_k2] at k2_eq_false
  simp only [derivedLits_arr_def, Fin.getElem_fin, Array.getElem_eq_data_get, k2_eq_false, li] at li_eq_true
Proof state after:
n : Nat
f : DefaultFormula n
f_assignments_size : f.assignments.size = n
rupHints : Array Nat
f'_assignments_size : (f.performRupCheck rupHints).fst.assignments.size = n
derivedLits : List (Literal (PosFin n))
derivedLits_satisfies_invariant :
  f.derivedLits_invariant f_assignments_size (f.performRupCheck rupHints).fst.assignments f'_assignments_size
    derivedLits
derivedLits_arr : Array (Literal (PosFin n))
derivedLits_arr_def : derivedLits_arr = { data := derivedLits }
i j : Fin derivedLits_arr.size
i_ne_j : i ≠ j
li_eq_lj : derivedLits_arr[i] = derivedLits_arr[j]
li : Literal (PosFin n) := derivedLits_arr[i]
li_in_derivedLits : li ∈ derivedLits
i_in_bounds : ↑i < derivedLits.length
j_in_bounds : ↑j < derivedLits.length
k1 k2 : Fin derivedLits.length
left✝³ : (derivedLits.get k1).fst.val = ↑⟨li.fst.val, ⋯⟩
left✝² : (derivedLits.get k2).fst.val = ↑⟨li.fst.val, ⋯⟩
k1_eq_true : (derivedLits.get k1).snd = true
k2_eq_false : (derivedLits.get k2).snd = false
left✝¹ : (f.performRupCheck rupHints).fst.assignments[↑⟨li.fst.val, ⋯⟩] = both
left✝ : f.assignments[↑⟨li.fst.val, ⋯⟩] = unassigned
h3 : ∀ (k : Fin derivedLits.length), k ≠ k1 → k ≠ k2 → (derivedLits.get k).fst.val ≠ ↑⟨li.fst.val, ⋯⟩
li_eq_true : li.snd = true
i_ne_k2 : ⟨↑i, i_in_bounds⟩ ≠ k2
⊢ False
Theorem: LRAT.DefaultFormula.derivedLits_nodup
Proof state before:
n : Nat
f : DefaultFormula n
f_assignments_size : f.assignments.size = n
rupHints : Array Nat
f'_assignments_size : (f.performRupCheck rupHints).fst.assignments.size = n
derivedLits : List (Literal (PosFin n))
derivedLits_satisfies_invariant :
  f.derivedLits_invariant f_assignments_size (f.performRupCheck rupHints).fst.assignments f'_assignments_size
    derivedLits
derivedLits_arr : Array (Literal (PosFin n))
derivedLits_arr_def : derivedLits_arr = { data := derivedLits }
i j : Fin derivedLits_arr.size
i_ne_j : i ≠ j
li_eq_lj : derivedLits_arr[i] = derivedLits_arr[j]
li : Literal (PosFin n) := derivedLits_arr[i]
li_in_derivedLits : li ∈ derivedLits
i_in_bounds : ↑i < derivedLits.length
j_in_bounds : ↑j < derivedLits.length
k1 k2 : Fin derivedLits.length
left✝³ : (derivedLits.get k1).fst.val = ↑⟨li.fst.val, ⋯⟩
left✝² : (derivedLits.get k2).fst.val = ↑⟨li.fst.val, ⋯⟩
k1_eq_true : (derivedLits.get k1).snd = true
k2_eq_false : (derivedLits.get k2).snd = false
left✝¹ : (f.performRupCheck rupHints).fst.assignments[↑⟨li.fst.val, ⋯⟩] = both
left✝ : f.assignments[↑⟨li.fst.val, ⋯⟩] = unassigned
h3 : ∀ (k : Fin derivedLits.length), k ≠ k1 → k ≠ k2 → (derivedLits.get k).fst.val ≠ ↑⟨li.fst.val, ⋯⟩
li_eq_true : li.snd = true
i_ne_k2 : ⟨↑i, i_in_bounds⟩ ≠ k2
⊢ False
Tactic:
have j_ne_k2 : ⟨j.1, j_in_bounds⟩ ≠ k2 := by
  intro j_eq_k2
  rw [← j_eq_k2] at k2_eq_false
  simp only [derivedLits_arr_def, Fin.getElem_fin, Array.getElem_eq_data_get] at li_eq_lj
  simp only [derivedLits_arr_def, Fin.getElem_fin, Array.getElem_eq_data_get, k2_eq_false, li_eq_lj, li] at li_eq_true
Proof state after:
n : Nat
f : DefaultFormula n
f_assignments_size : f.assignments.size = n
rupHints : Array Nat
f'_assignments_size : (f.performRupCheck rupHints).fst.assignments.size = n
derivedLits : List (Literal (PosFin n))
derivedLits_satisfies_invariant :
  f.derivedLits_invariant f_assignments_size (f.performRupCheck rupHints).fst.assignments f'_assignments_size
    derivedLits
derivedLits_arr : Array (Literal (PosFin n))
derivedLits_arr_def : derivedLits_arr = { data := derivedLits }
i j : Fin derivedLits_arr.size
i_ne_j : i ≠ j
li_eq_lj : derivedLits_arr[i] = derivedLits_arr[j]
li : Literal (PosFin n) := derivedLits_arr[i]
li_in_derivedLits : li ∈ derivedLits
i_in_bounds : ↑i < derivedLits.length
j_in_bounds : ↑j < derivedLits.length
k1 k2 : Fin derivedLits.length
left✝³ : (derivedLits.get k1).fst.val = ↑⟨li.fst.val, ⋯⟩
left✝² : (derivedLits.get k2).fst.val = ↑⟨li.fst.val, ⋯⟩
k1_eq_true : (derivedLits.get k1).snd = true
k2_eq_false : (derivedLits.get k2).snd = false
left✝¹ : (f.performRupCheck rupHints).fst.assignments[↑⟨li.fst.val, ⋯⟩] = both
left✝ : f.assignments[↑⟨li.fst.val, ⋯⟩] = unassigned
h3 : ∀ (k : Fin derivedLits.length), k ≠ k1 → k ≠ k2 → (derivedLits.get k).fst.val ≠ ↑⟨li.fst.val, ⋯⟩
li_eq_true : li.snd = true
i_ne_k2 : ⟨↑i, i_in_bounds⟩ ≠ k2
j_ne_k2 : ⟨↑j, j_in_bounds⟩ ≠ k2
⊢ False
Theorem: LRAT.DefaultFormula.derivedLits_nodup
Proof state before:
case neg
n : Nat
f : DefaultFormula n
f_assignments_size : f.assignments.size = n
rupHints : Array Nat
f'_assignments_size : (f.performRupCheck rupHints).fst.assignments.size = n
derivedLits : List (Literal (PosFin n))
derivedLits_satisfies_invariant :
  f.derivedLits_invariant f_assignments_size (f.performRupCheck rupHints).fst.assignments f'_assignments_size
    derivedLits
derivedLits_arr : Array (Literal (PosFin n))
derivedLits_arr_def : derivedLits_arr = { data := derivedLits }
i j : Fin derivedLits_arr.size
i_ne_j : i ≠ j
li_eq_lj : derivedLits_arr[i] = derivedLits_arr[j]
li : Literal (PosFin n) := derivedLits_arr[i]
li_in_derivedLits : li ∈ derivedLits
i_in_bounds : ↑i < derivedLits.length
j_in_bounds : ↑j < derivedLits.length
k1 k2 : Fin derivedLits.length
left✝³ : (derivedLits.get k1).fst.val = ↑⟨li.fst.val, ⋯⟩
left✝² : (derivedLits.get k2).fst.val = ↑⟨li.fst.val, ⋯⟩
k1_eq_true : (derivedLits.get k1).snd = true
k2_eq_false : (derivedLits.get k2).snd = false
left✝¹ : (f.performRupCheck rupHints).fst.assignments[↑⟨li.fst.val, ⋯⟩] = both
left✝ : f.assignments[↑⟨li.fst.val, ⋯⟩] = unassigned
h3 : ∀ (k : Fin derivedLits.length), k ≠ k1 → k ≠ k2 → (derivedLits.get k).fst.val ≠ ↑⟨li.fst.val, ⋯⟩
li_eq_true : li.snd = true
i_ne_k2 : ⟨↑i, i_in_bounds⟩ ≠ k2
j_ne_k2 : ⟨↑j, j_in_bounds⟩ ≠ k2
h✝ : ¬⟨↑i, i_in_bounds⟩ = k1
⊢ False
Tactic:
. next i_ne_k1 =>
  specialize h3 ⟨i.1, i_in_bounds⟩ i_ne_k1 i_ne_k2
  simp (config := { decide := true }) only [Fin.getElem_fin, Array.getElem_eq_data_get, ne_eq, derivedLits_arr_def, li] at h3
Proof state after:
no goals
Theorem: LRAT.DefaultFormula.derivedLits_nodup
Proof state before:
n : Nat
f : DefaultFormula n
f_assignments_size : f.assignments.size = n
rupHints : Array Nat
f'_assignments_size : (f.performRupCheck rupHints).fst.assignments.size = n
derivedLits : List (Literal (PosFin n))
derivedLits_satisfies_invariant :
  f.derivedLits_invariant f_assignments_size (f.performRupCheck rupHints).fst.assignments f'_assignments_size
    derivedLits
derivedLits_arr : Array (Literal (PosFin n))
derivedLits_arr_def : derivedLits_arr = { data := derivedLits }
i j : Fin derivedLits_arr.size
i_ne_j : i ≠ j
li_eq_lj : derivedLits_arr[i] = derivedLits_arr[j]
li : Literal (PosFin n) := derivedLits_arr[i]
li_in_derivedLits : li ∈ derivedLits
i_in_bounds : ↑i < derivedLits.length
j_in_bounds : ↑j < derivedLits.length
k1 k2 : Fin derivedLits.length
left✝³ : (derivedLits.get k1).fst.val = ↑⟨li.fst.val, ⋯⟩
left✝² : (derivedLits.get k2).fst.val = ↑⟨li.fst.val, ⋯⟩
k1_eq_true : (derivedLits.get k1).snd = true
k2_eq_false : (derivedLits.get k2).snd = false
left✝¹ : (f.performRupCheck rupHints).fst.assignments[↑⟨li.fst.val, ⋯⟩] = both
left✝ : f.assignments[↑⟨li.fst.val, ⋯⟩] = unassigned
h3 : ∀ (k : Fin derivedLits.length), k ≠ k1 → k ≠ k2 → (derivedLits.get k).fst.val ≠ ↑⟨li.fst.val, ⋯⟩
li_eq_true : li.snd = true
⊢ ⟨↑i, i_in_bounds⟩ ≠ k2
Tactic:
intro i_eq_k2
Proof state after:
n : Nat
f : DefaultFormula n
f_assignments_size : f.assignments.size = n
rupHints : Array Nat
f'_assignments_size : (f.performRupCheck rupHints).fst.assignments.size = n
derivedLits : List (Literal (PosFin n))
derivedLits_satisfies_invariant :
  f.derivedLits_invariant f_assignments_size (f.performRupCheck rupHints).fst.assignments f'_assignments_size
    derivedLits
derivedLits_arr : Array (Literal (PosFin n))
derivedLits_arr_def : derivedLits_arr = { data := derivedLits }
i j : Fin derivedLits_arr.size
i_ne_j : i ≠ j
li_eq_lj : derivedLits_arr[i] = derivedLits_arr[j]
li : Literal (PosFin n) := derivedLits_arr[i]
li_in_derivedLits : li ∈ derivedLits
i_in_bounds : ↑i < derivedLits.length
j_in_bounds : ↑j < derivedLits.length
k1 k2 : Fin derivedLits.length
left✝³ : (derivedLits.get k1).fst.val = ↑⟨li.fst.val, ⋯⟩
left✝² : (derivedLits.get k2).fst.val = ↑⟨li.fst.val, ⋯⟩
k1_eq_true : (derivedLits.get k1).snd = true
k2_eq_false : (derivedLits.get k2).snd = false
left✝¹ : (f.performRupCheck rupHints).fst.assignments[↑⟨li.fst.val, ⋯⟩] = both
left✝ : f.assignments[↑⟨li.fst.val, ⋯⟩] = unassigned
h3 : ∀ (k : Fin derivedLits.length), k ≠ k1 → k ≠ k2 → (derivedLits.get k).fst.val ≠ ↑⟨li.fst.val, ⋯⟩
li_eq_true : li.snd = true
i_eq_k2 : ⟨↑i, i_in_bounds⟩ = k2
⊢ False
Theorem: LRAT.DefaultFormula.derivedLits_nodup
Proof state before:
n : Nat
f : DefaultFormula n
f_assignments_size : f.assignments.size = n
rupHints : Array Nat
f'_assignments_size : (f.performRupCheck rupHints).fst.assignments.size = n
derivedLits : List (Literal (PosFin n))
derivedLits_satisfies_invariant :
  f.derivedLits_invariant f_assignments_size (f.performRupCheck rupHints).fst.assignments f'_assignments_size
    derivedLits
derivedLits_arr : Array (Literal (PosFin n))
derivedLits_arr_def : derivedLits_arr = { data := derivedLits }
i j : Fin derivedLits_arr.size
i_ne_j : i ≠ j
li_eq_lj : derivedLits_arr[i] = derivedLits_arr[j]
li : Literal (PosFin n) := derivedLits_arr[i]
li_in_derivedLits : li ∈ derivedLits
i_in_bounds : ↑i < derivedLits.length
j_in_bounds : ↑j < derivedLits.length
k1 k2 : Fin derivedLits.length
left✝³ : (derivedLits.get k1).fst.val = ↑⟨li.fst.val, ⋯⟩
left✝² : (derivedLits.get k2).fst.val = ↑⟨li.fst.val, ⋯⟩
k1_eq_true : (derivedLits.get k1).snd = true
k2_eq_false : (derivedLits.get k2).snd = false
left✝¹ : (f.performRupCheck rupHints).fst.assignments[↑⟨li.fst.val, ⋯⟩] = both
left✝ : f.assignments[↑⟨li.fst.val, ⋯⟩] = unassigned
h3 : ∀ (k : Fin derivedLits.length), k ≠ k1 → k ≠ k2 → (derivedLits.get k).fst.val ≠ ↑⟨li.fst.val, ⋯⟩
li_eq_true : li.snd = true
i_eq_k2 : ⟨↑i, i_in_bounds⟩ = k2
⊢ False
Tactic:
rw [← i_eq_k2] at k2_eq_false
Proof state after:
n : Nat
f : DefaultFormula n
f_assignments_size : f.assignments.size = n
rupHints : Array Nat
f'_assignments_size : (f.performRupCheck rupHints).fst.assignments.size = n
derivedLits : List (Literal (PosFin n))
derivedLits_satisfies_invariant :
  f.derivedLits_invariant f_assignments_size (f.performRupCheck rupHints).fst.assignments f'_assignments_size
    derivedLits
derivedLits_arr : Array (Literal (PosFin n))
derivedLits_arr_def : derivedLits_arr = { data := derivedLits }
i j : Fin derivedLits_arr.size
i_ne_j : i ≠ j
li_eq_lj : derivedLits_arr[i] = derivedLits_arr[j]
li : Literal (PosFin n) := derivedLits_arr[i]
li_in_derivedLits : li ∈ derivedLits
i_in_bounds : ↑i < derivedLits.length
j_in_bounds : ↑j < derivedLits.length
k1 k2 : Fin derivedLits.length
left✝³ : (derivedLits.get k1).fst.val = ↑⟨li.fst.val, ⋯⟩
left✝² : (derivedLits.get k2).fst.val = ↑⟨li.fst.val, ⋯⟩
k1_eq_true : (derivedLits.get k1).snd = true
k2_eq_false : (derivedLits.get ⟨↑i, i_in_bounds⟩).snd = false
left✝¹ : (f.performRupCheck rupHints).fst.assignments[↑⟨li.fst.val, ⋯⟩] = both
left✝ : f.assignments[↑⟨li.fst.val, ⋯⟩] = unassigned
h3 : ∀ (k : Fin derivedLits.length), k ≠ k1 → k ≠ k2 → (derivedLits.get k).fst.val ≠ ↑⟨li.fst.val, ⋯⟩
li_eq_true : li.snd = true
i_eq_k2 : ⟨↑i, i_in_bounds⟩ = k2
⊢ False
Theorem: LRAT.DefaultFormula.derivedLits_nodup
Proof state before:
n : Nat
f : DefaultFormula n
f_assignments_size : f.assignments.size = n
rupHints : Array Nat
f'_assignments_size : (f.performRupCheck rupHints).fst.assignments.size = n
derivedLits : List (Literal (PosFin n))
derivedLits_satisfies_invariant :
  f.derivedLits_invariant f_assignments_size (f.performRupCheck rupHints).fst.assignments f'_assignments_size
    derivedLits
derivedLits_arr : Array (Literal (PosFin n))
derivedLits_arr_def : derivedLits_arr = { data := derivedLits }
i j : Fin derivedLits_arr.size
i_ne_j : i ≠ j
li_eq_lj : derivedLits_arr[i] = derivedLits_arr[j]
li : Literal (PosFin n) := derivedLits_arr[i]
li_in_derivedLits : li ∈ derivedLits
i_in_bounds : ↑i < derivedLits.length
j_in_bounds : ↑j < derivedLits.length
k1 k2 : Fin derivedLits.length
left✝³ : (derivedLits.get k1).fst.val = ↑⟨li.fst.val, ⋯⟩
left✝² : (derivedLits.get k2).fst.val = ↑⟨li.fst.val, ⋯⟩
k1_eq_true : (derivedLits.get k1).snd = true
k2_eq_false : (derivedLits.get ⟨↑i, i_in_bounds⟩).snd = false
left✝¹ : (f.performRupCheck rupHints).fst.assignments[↑⟨li.fst.val, ⋯⟩] = both
left✝ : f.assignments[↑⟨li.fst.val, ⋯⟩] = unassigned
h3 : ∀ (k : Fin derivedLits.length), k ≠ k1 → k ≠ k2 → (derivedLits.get k).fst.val ≠ ↑⟨li.fst.val, ⋯⟩
li_eq_true : li.snd = true
i_eq_k2 : ⟨↑i, i_in_bounds⟩ = k2
⊢ False
Tactic:
simp only [derivedLits_arr_def, Fin.getElem_fin, Array.getElem_eq_data_get, k2_eq_false, li] at li_eq_true
Proof state after:
no goals
Theorem: LRAT.DefaultFormula.derivedLits_nodup
Proof state before:
n : Nat
f : DefaultFormula n
f_assignments_size : f.assignments.size = n
rupHints : Array Nat
f'_assignments_size : (f.performRupCheck rupHints).fst.assignments.size = n
derivedLits : List (Literal (PosFin n))
derivedLits_satisfies_invariant :
  f.derivedLits_invariant f_assignments_size (f.performRupCheck rupHints).fst.assignments f'_assignments_size
    derivedLits
derivedLits_arr : Array (Literal (PosFin n))
derivedLits_arr_def : derivedLits_arr = { data := derivedLits }
i j : Fin derivedLits_arr.size
i_ne_j : i ≠ j
li_eq_lj : derivedLits_arr[i] = derivedLits_arr[j]
li : Literal (PosFin n) := derivedLits_arr[i]
li_in_derivedLits : li ∈ derivedLits
i_in_bounds : ↑i < derivedLits.length
j_in_bounds : ↑j < derivedLits.length
k1 k2 : Fin derivedLits.length
left✝³ : (derivedLits.get k1).fst.val = ↑⟨li.fst.val, ⋯⟩
left✝² : (derivedLits.get k2).fst.val = ↑⟨li.fst.val, ⋯⟩
k1_eq_true : (derivedLits.get k1).snd = true
k2_eq_false : (derivedLits.get k2).snd = false
left✝¹ : (f.performRupCheck rupHints).fst.assignments[↑⟨li.fst.val, ⋯⟩] = both
left✝ : f.assignments[↑⟨li.fst.val, ⋯⟩] = unassigned
h3 : ∀ (k : Fin derivedLits.length), k ≠ k1 → k ≠ k2 → (derivedLits.get k).fst.val ≠ ↑⟨li.fst.val, ⋯⟩
li_eq_true : li.snd = true
i_ne_k2 : ⟨↑i, i_in_bounds⟩ ≠ k2
⊢ ⟨↑j, j_in_bounds⟩ ≠ k2
Tactic:
intro j_eq_k2
Proof state after:
n : Nat
f : DefaultFormula n
f_assignments_size : f.assignments.size = n
rupHints : Array Nat
f'_assignments_size : (f.performRupCheck rupHints).fst.assignments.size = n
derivedLits : List (Literal (PosFin n))
derivedLits_satisfies_invariant :
  f.derivedLits_invariant f_assignments_size (f.performRupCheck rupHints).fst.assignments f'_assignments_size
    derivedLits
derivedLits_arr : Array (Literal (PosFin n))
derivedLits_arr_def : derivedLits_arr = { data := derivedLits }
i j : Fin derivedLits_arr.size
i_ne_j : i ≠ j
li_eq_lj : derivedLits_arr[i] = derivedLits_arr[j]
li : Literal (PosFin n) := derivedLits_arr[i]
li_in_derivedLits : li ∈ derivedLits
i_in_bounds : ↑i < derivedLits.length
j_in_bounds : ↑j < derivedLits.length
k1 k2 : Fin derivedLits.length
left✝³ : (derivedLits.get k1).fst.val = ↑⟨li.fst.val, ⋯⟩
left✝² : (derivedLits.get k2).fst.val = ↑⟨li.fst.val, ⋯⟩
k1_eq_true : (derivedLits.get k1).snd = true
k2_eq_false : (derivedLits.get k2).snd = false
left✝¹ : (f.performRupCheck rupHints).fst.assignments[↑⟨li.fst.val, ⋯⟩] = both
left✝ : f.assignments[↑⟨li.fst.val, ⋯⟩] = unassigned
h3 : ∀ (k : Fin derivedLits.length), k ≠ k1 → k ≠ k2 → (derivedLits.get k).fst.val ≠ ↑⟨li.fst.val, ⋯⟩
li_eq_true : li.snd = true
i_ne_k2 : ⟨↑i, i_in_bounds⟩ ≠ k2
j_eq_k2 : ⟨↑j, j_in_bounds⟩ = k2
⊢ False