Theorem: LeanSAT.Model.PropForm.exists_flip (LeanSAT/Model/PropVars.lean)

State before:
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁ σ₂ : PropAssignment ν
h₁ : σ₁ ⊨ φ
h₂ : ¬σ₂ ⊨ φ
s : Finset ν := Finset.filter (fun x => σ₁ x ≠ σ₂ x) (vars φ)
hS : ∀ x ∈ s, σ₁ x ≠ σ₂ x
⊢ ∀ x ∈ vars φ \ s, σ₁ x = σ₂ x
Tactic:
simp_all [s]
State after:
no goals

State before:
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₁ σ₂ : PropAssignment ν
h₁ : σ₁ ⊨ φ
h₂ : ¬σ₂ ⊨ φ
s : Finset ν
hS : ∀ x ∈ s, σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ s, σ₁ x = σ₂ x
⊢ ∃ x τ, x ∈ s ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
Tactic:
induction s using Finset.induction generalizing σ₁
State after:
case empty
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ ∅, σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ ∅, σ₁ x = σ₂ x
⊢ ∃ x τ, x ∈ ∅ ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ

case insert
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
a✝² : ν
s✝ : Finset ν
a✝¹ : a✝² ∉ s✝
a✝ :
  ∀ {σ₁ : PropAssignment ν},
    σ₁ ⊨ φ →
      (∀ x ∈ s✝, σ₁ x ≠ σ₂ x) →
        (∀ x ∈ vars φ \ s✝, σ₁ x = σ₂ x) → ∃ x τ, x ∈ s✝ ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ insert a✝² s✝, σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ insert a✝² s✝, σ₁ x = σ₂ x
⊢ ∃ x τ, x ∈ insert a✝² s✝ ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ

State before:
case empty
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ ∅, σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ ∅, σ₁ x = σ₂ x
⊢ ∃ x τ, x ∈ ∅ ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ

case insert
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
a✝² : ν
s✝ : Finset ν
a✝¹ : a✝² ∉ s✝
a✝ :
  ∀ {σ₁ : PropAssignment ν},
    σ₁ ⊨ φ →
      (∀ x ∈ s✝, σ₁ x ≠ σ₂ x) →
        (∀ x ∈ vars φ \ s✝, σ₁ x = σ₂ x) → ∃ x τ, x ∈ s✝ ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ insert a✝² s✝, σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ insert a✝² s✝, σ₁ x = σ₂ x
⊢ ∃ x τ, x ∈ insert a✝² s✝ ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
Tactic:
. have : σ₁.agreeOn φ.vars σ₂ := by rw [Finset.sdiff_empty] at hSC; exact hSC
  have : σ₂ ⊨ φ := (agreeOn_vars this).mp h₁
  exact False.elim (h₂ this)
State after:
case insert
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
a✝² : ν
s✝ : Finset ν
a✝¹ : a✝² ∉ s✝
a✝ :
  ∀ {σ₁ : PropAssignment ν},
    σ₁ ⊨ φ →
      (∀ x ∈ s✝, σ₁ x ≠ σ₂ x) →
        (∀ x ∈ vars φ \ s✝, σ₁ x = σ₂ x) → ∃ x τ, x ∈ s✝ ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ insert a✝² s✝, σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ insert a✝² s✝, σ₁ x = σ₂ x
⊢ ∃ x τ, x ∈ insert a✝² s✝ ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ

State before:
case insert
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
a✝² : ν
s✝ : Finset ν
a✝¹ : a✝² ∉ s✝
a✝ :
  ∀ {σ₁ : PropAssignment ν},
    σ₁ ⊨ φ →
      (∀ x ∈ s✝, σ₁ x ≠ σ₂ x) →
        (∀ x ∈ vars φ \ s✝, σ₁ x = σ₂ x) → ∃ x τ, x ∈ s✝ ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ insert a✝² s✝, σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ insert a✝² s✝, σ₁ x = σ₂ x
⊢ ∃ x τ, x ∈ insert a✝² s✝ ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
Tactic:
next x₀ s' hx₀ ih =>
  let σ₁' := σ₁.set x₀ (!σ₁ x₀)
  by_cases h₁' : σ₁' ⊨ φ
  case neg =>
    use x₀, σ₁
    simp [h₁, h₁']
  case pos =>
    have hS' : ∀ x ∈ s', σ₁' x ≠ σ₂ x := fun x hMem => by
      have hX : x₀ ≠ x := fun h => hx₀ (h ▸ hMem)
      simp only [σ₁', σ₁.set_get_of_ne (!σ₁ x₀) hX]
      exact hS _ (Finset.mem_insert_of_mem hMem)
    have hSC' : ∀ x ∈ φ.vars \ s', σ₁' x = σ₂ x := fun x hMem => by
      by_cases hX : x₀ = x
      case pos =>
        have := hS _ (Finset.mem_insert_self _ _)
        simp only [σ₁', ← hX, PropAssignment.set_get, Bool.bnot_eq,
                    this, not_false_eq_true]
      case neg =>
        simp only [σ₁', σ₁.set_get_of_ne _ hX]
        aesop
    have ⟨x, τ, hx, H⟩ := ih h₁' hS' hSC'
    exact ⟨x, τ, Finset.mem_insert_of_mem hx, H⟩
State after:
no goals

State before:
case empty
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ ∅, σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ ∅, σ₁ x = σ₂ x
⊢ ∃ x τ, x ∈ ∅ ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
Tactic:
have : σ₁.agreeOn φ.vars σ₂ := by rw [Finset.sdiff_empty] at hSC; exact hSC
State after:
case empty
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ ∅, σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ ∅, σ₁ x = σ₂ x
this : PropAssignment.agreeOn (↑(vars φ)) σ₁ σ₂
⊢ ∃ x τ, x ∈ ∅ ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ

State before:
case empty
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ ∅, σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ ∅, σ₁ x = σ₂ x
this : PropAssignment.agreeOn (↑(vars φ)) σ₁ σ₂
⊢ ∃ x τ, x ∈ ∅ ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
Tactic:
have : σ₂ ⊨ φ := (agreeOn_vars this).mp h₁
State after:
case empty
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ ∅, σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ ∅, σ₁ x = σ₂ x
this✝ : PropAssignment.agreeOn (↑(vars φ)) σ₁ σ₂
this : σ₂ ⊨ φ
⊢ ∃ x τ, x ∈ ∅ ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ

State before:
case empty
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ ∅, σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ ∅, σ₁ x = σ₂ x
this✝ : PropAssignment.agreeOn (↑(vars φ)) σ₁ σ₂
this : σ₂ ⊨ φ
⊢ ∃ x τ, x ∈ ∅ ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
Tactic:
exact False.elim (h₂ this)
State after:
no goals

State before:
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ ∅, σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ ∅, σ₁ x = σ₂ x
⊢ PropAssignment.agreeOn (↑(vars φ)) σ₁ σ₂
Tactic:
rw [Finset.sdiff_empty] at hSC
State after:
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ ∅, σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ, σ₁ x = σ₂ x
⊢ PropAssignment.agreeOn (↑(vars φ)) σ₁ σ₂

State before:
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ ∅, σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ, σ₁ x = σ₂ x
⊢ PropAssignment.agreeOn (↑(vars φ)) σ₁ σ₂
Tactic:
exact hSC
State after:
no goals

State before:
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
x₀ : ν
s' : Finset ν
hx₀ : x₀ ∉ s'
ih :
  ∀ {σ₁ : PropAssignment ν},
    σ₁ ⊨ φ →
      (∀ x ∈ s', σ₁ x ≠ σ₂ x) →
        (∀ x ∈ vars φ \ s', σ₁ x = σ₂ x) → ∃ x τ, x ∈ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ insert x₀ s', σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ insert x₀ s', σ₁ x = σ₂ x
⊢ ∃ x τ, x ∈ insert x₀ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
Tactic:
let σ₁' := σ₁.set x₀ (!σ₁ x₀)
State after:
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
x₀ : ν
s' : Finset ν
hx₀ : x₀ ∉ s'
ih :
  ∀ {σ₁ : PropAssignment ν},
    σ₁ ⊨ φ →
      (∀ x ∈ s', σ₁ x ≠ σ₂ x) →
        (∀ x ∈ vars φ \ s', σ₁ x = σ₂ x) → ∃ x τ, x ∈ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ insert x₀ s', σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ insert x₀ s', σ₁ x = σ₂ x
σ₁' : PropAssignment ν := PropAssignment.set σ₁ x₀ !σ₁ x₀
⊢ ∃ x τ, x ∈ insert x₀ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ

State before:
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
x₀ : ν
s' : Finset ν
hx₀ : x₀ ∉ s'
ih :
  ∀ {σ₁ : PropAssignment ν},
    σ₁ ⊨ φ →
      (∀ x ∈ s', σ₁ x ≠ σ₂ x) →
        (∀ x ∈ vars φ \ s', σ₁ x = σ₂ x) → ∃ x τ, x ∈ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ insert x₀ s', σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ insert x₀ s', σ₁ x = σ₂ x
σ₁' : PropAssignment ν := PropAssignment.set σ₁ x₀ !σ₁ x₀
⊢ ∃ x τ, x ∈ insert x₀ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
Tactic:
by_cases h₁' : σ₁' ⊨ φ
State after:
case pos
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
x₀ : ν
s' : Finset ν
hx₀ : x₀ ∉ s'
ih :
  ∀ {σ₁ : PropAssignment ν},
    σ₁ ⊨ φ →
      (∀ x ∈ s', σ₁ x ≠ σ₂ x) →
        (∀ x ∈ vars φ \ s', σ₁ x = σ₂ x) → ∃ x τ, x ∈ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ insert x₀ s', σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ insert x₀ s', σ₁ x = σ₂ x
σ₁' : PropAssignment ν := PropAssignment.set σ₁ x₀ !σ₁ x₀
h₁' : σ₁' ⊨ φ
⊢ ∃ x τ, x ∈ insert x₀ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ

case neg
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
x₀ : ν
s' : Finset ν
hx₀ : x₀ ∉ s'
ih :
  ∀ {σ₁ : PropAssignment ν},
    σ₁ ⊨ φ →
      (∀ x ∈ s', σ₁ x ≠ σ₂ x) →
        (∀ x ∈ vars φ \ s', σ₁ x = σ₂ x) → ∃ x τ, x ∈ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ insert x₀ s', σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ insert x₀ s', σ₁ x = σ₂ x
σ₁' : PropAssignment ν := PropAssignment.set σ₁ x₀ !σ₁ x₀
h₁' : ¬σ₁' ⊨ φ
⊢ ∃ x τ, x ∈ insert x₀ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ

State before:
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
x₀ : ν
s' : Finset ν
hx₀ : x₀ ∉ s'
ih :
  ∀ {σ₁ : PropAssignment ν},
    σ₁ ⊨ φ →
      (∀ x ∈ s', σ₁ x ≠ σ₂ x) →
        (∀ x ∈ vars φ \ s', σ₁ x = σ₂ x) → ∃ x τ, x ∈ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ insert x₀ s', σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ insert x₀ s', σ₁ x = σ₂ x
σ₁' : PropAssignment ν := PropAssignment.set σ₁ x₀ !σ₁ x₀
h₁' : ¬σ₁' ⊨ φ
⊢ ∃ x τ, x ∈ insert x₀ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
Tactic:
case neg =>
  use x₀, σ₁
  simp [h₁, h₁']
State after:
no goals

State before:
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
x₀ : ν
s' : Finset ν
hx₀ : x₀ ∉ s'
ih :
  ∀ {σ₁ : PropAssignment ν},
    σ₁ ⊨ φ →
      (∀ x ∈ s', σ₁ x ≠ σ₂ x) →
        (∀ x ∈ vars φ \ s', σ₁ x = σ₂ x) → ∃ x τ, x ∈ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ insert x₀ s', σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ insert x₀ s', σ₁ x = σ₂ x
σ₁' : PropAssignment ν := PropAssignment.set σ₁ x₀ !σ₁ x₀
h₁' : σ₁' ⊨ φ
⊢ ∃ x τ, x ∈ insert x₀ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
Tactic:
case pos =>
  have hS' : ∀ x ∈ s', σ₁' x ≠ σ₂ x := fun x hMem => by
    have hX : x₀ ≠ x := fun h => hx₀ (h ▸ hMem)
    simp only [σ₁', σ₁.set_get_of_ne (!σ₁ x₀) hX]
    exact hS _ (Finset.mem_insert_of_mem hMem)
  have hSC' : ∀ x ∈ φ.vars \ s', σ₁' x = σ₂ x := fun x hMem => by
    by_cases hX : x₀ = x
    case pos =>
      have := hS _ (Finset.mem_insert_self _ _)
      simp only [σ₁', ← hX, PropAssignment.set_get, Bool.bnot_eq,
                  this, not_false_eq_true]
    case neg =>
      simp only [σ₁', σ₁.set_get_of_ne _ hX]
      aesop
  have ⟨x, τ, hx, H⟩ := ih h₁' hS' hSC'
  exact ⟨x, τ, Finset.mem_insert_of_mem hx, H⟩
State after:
no goals

State before:
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
x₀ : ν
s' : Finset ν
hx₀ : x₀ ∉ s'
ih :
  ∀ {σ₁ : PropAssignment ν},
    σ₁ ⊨ φ →
      (∀ x ∈ s', σ₁ x ≠ σ₂ x) →
        (∀ x ∈ vars φ \ s', σ₁ x = σ₂ x) → ∃ x τ, x ∈ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ insert x₀ s', σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ insert x₀ s', σ₁ x = σ₂ x
σ₁' : PropAssignment ν := PropAssignment.set σ₁ x₀ !σ₁ x₀
h₁' : ¬σ₁' ⊨ φ
⊢ ∃ x τ, x ∈ insert x₀ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
Tactic:
use x₀, σ₁
State after:
case h
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
x₀ : ν
s' : Finset ν
hx₀ : x₀ ∉ s'
ih :
  ∀ {σ₁ : PropAssignment ν},
    σ₁ ⊨ φ →
      (∀ x ∈ s', σ₁ x ≠ σ₂ x) →
        (∀ x ∈ vars φ \ s', σ₁ x = σ₂ x) → ∃ x τ, x ∈ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ insert x₀ s', σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ insert x₀ s', σ₁ x = σ₂ x
σ₁' : PropAssignment ν := PropAssignment.set σ₁ x₀ !σ₁ x₀
h₁' : ¬σ₁' ⊨ φ
⊢ x₀ ∈ insert x₀ s' ∧ σ₁ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set σ₁ x₀ !σ₁ x₀) φ

State before:
case h
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
x₀ : ν
s' : Finset ν
hx₀ : x₀ ∉ s'
ih :
  ∀ {σ₁ : PropAssignment ν},
    σ₁ ⊨ φ →
      (∀ x ∈ s', σ₁ x ≠ σ₂ x) →
        (∀ x ∈ vars φ \ s', σ₁ x = σ₂ x) → ∃ x τ, x ∈ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ insert x₀ s', σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ insert x₀ s', σ₁ x = σ₂ x
σ₁' : PropAssignment ν := PropAssignment.set σ₁ x₀ !σ₁ x₀
h₁' : ¬σ₁' ⊨ φ
⊢ x₀ ∈ insert x₀ s' ∧ σ₁ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set σ₁ x₀ !σ₁ x₀) φ
Tactic:
simp [h₁, h₁']
State after:
no goals

State before:
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
x₀ : ν
s' : Finset ν
hx₀ : x₀ ∉ s'
ih :
  ∀ {σ₁ : PropAssignment ν},
    σ₁ ⊨ φ →
      (∀ x ∈ s', σ₁ x ≠ σ₂ x) →
        (∀ x ∈ vars φ \ s', σ₁ x = σ₂ x) → ∃ x τ, x ∈ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ insert x₀ s', σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ insert x₀ s', σ₁ x = σ₂ x
σ₁' : PropAssignment ν := PropAssignment.set σ₁ x₀ !σ₁ x₀
h₁' : σ₁' ⊨ φ
⊢ ∃ x τ, x ∈ insert x₀ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
Tactic:
have hS' : ∀ x ∈ s', σ₁' x ≠ σ₂ x := fun x hMem => by
  have hX : x₀ ≠ x := fun h => hx₀ (h ▸ hMem)
  simp only [σ₁', σ₁.set_get_of_ne (!σ₁ x₀) hX]
  exact hS _ (Finset.mem_insert_of_mem hMem)
State after:
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
x₀ : ν
s' : Finset ν
hx₀ : x₀ ∉ s'
ih :
  ∀ {σ₁ : PropAssignment ν},
    σ₁ ⊨ φ →
      (∀ x ∈ s', σ₁ x ≠ σ₂ x) →
        (∀ x ∈ vars φ \ s', σ₁ x = σ₂ x) → ∃ x τ, x ∈ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ insert x₀ s', σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ insert x₀ s', σ₁ x = σ₂ x
σ₁' : PropAssignment ν := PropAssignment.set σ₁ x₀ !σ₁ x₀
h₁' : σ₁' ⊨ φ
hS' : ∀ x ∈ s', σ₁' x ≠ σ₂ x
⊢ ∃ x τ, x ∈ insert x₀ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ

State before:
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
x₀ : ν
s' : Finset ν
hx₀ : x₀ ∉ s'
ih :
  ∀ {σ₁ : PropAssignment ν},
    σ₁ ⊨ φ →
      (∀ x ∈ s', σ₁ x ≠ σ₂ x) →
        (∀ x ∈ vars φ \ s', σ₁ x = σ₂ x) → ∃ x τ, x ∈ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ insert x₀ s', σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ insert x₀ s', σ₁ x = σ₂ x
σ₁' : PropAssignment ν := PropAssignment.set σ₁ x₀ !σ₁ x₀
h₁' : σ₁' ⊨ φ
hS' : ∀ x ∈ s', σ₁' x ≠ σ₂ x
⊢ ∃ x τ, x ∈ insert x₀ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
Tactic:
have hSC' : ∀ x ∈ φ.vars \ s', σ₁' x = σ₂ x := fun x hMem => by
  by_cases hX : x₀ = x
  case pos =>
    have := hS _ (Finset.mem_insert_self _ _)
    simp only [σ₁', ← hX, PropAssignment.set_get, Bool.bnot_eq,
                this, not_false_eq_true]
  case neg =>
    simp only [σ₁', σ₁.set_get_of_ne _ hX]
    aesop
State after:
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
x₀ : ν
s' : Finset ν
hx₀ : x₀ ∉ s'
ih :
  ∀ {σ₁ : PropAssignment ν},
    σ₁ ⊨ φ →
      (∀ x ∈ s', σ₁ x ≠ σ₂ x) →
        (∀ x ∈ vars φ \ s', σ₁ x = σ₂ x) → ∃ x τ, x ∈ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ insert x₀ s', σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ insert x₀ s', σ₁ x = σ₂ x
σ₁' : PropAssignment ν := PropAssignment.set σ₁ x₀ !σ₁ x₀
h₁' : σ₁' ⊨ φ
hS' : ∀ x ∈ s', σ₁' x ≠ σ₂ x
hSC' : ∀ x ∈ vars φ \ s', σ₁' x = σ₂ x
⊢ ∃ x τ, x ∈ insert x₀ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ

State before:
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
x₀ : ν
s' : Finset ν
hx₀ : x₀ ∉ s'
ih :
  ∀ {σ₁ : PropAssignment ν},
    σ₁ ⊨ φ →
      (∀ x ∈ s', σ₁ x ≠ σ₂ x) →
        (∀ x ∈ vars φ \ s', σ₁ x = σ₂ x) → ∃ x τ, x ∈ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ insert x₀ s', σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ insert x₀ s', σ₁ x = σ₂ x
σ₁' : PropAssignment ν := PropAssignment.set σ₁ x₀ !σ₁ x₀
h₁' : σ₁' ⊨ φ
hS' : ∀ x ∈ s', σ₁' x ≠ σ₂ x
hSC' : ∀ x ∈ vars φ \ s', σ₁' x = σ₂ x
⊢ ∃ x τ, x ∈ insert x₀ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
Tactic:
have ⟨x, τ, hx, H⟩ := ih h₁' hS' hSC'
State after:
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
x₀ : ν
s' : Finset ν
hx₀ : x₀ ∉ s'
ih :
  ∀ {σ₁ : PropAssignment ν},
    σ₁ ⊨ φ →
      (∀ x ∈ s', σ₁ x ≠ σ₂ x) →
        (∀ x ∈ vars φ \ s', σ₁ x = σ₂ x) → ∃ x τ, x ∈ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ insert x₀ s', σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ insert x₀ s', σ₁ x = σ₂ x
σ₁' : PropAssignment ν := PropAssignment.set σ₁ x₀ !σ₁ x₀
h₁' : σ₁' ⊨ φ
hS' : ∀ x ∈ s', σ₁' x ≠ σ₂ x
hSC' : ∀ x ∈ vars φ \ s', σ₁' x = σ₂ x
x : ν
τ : PropAssignment ν
hx : x ∈ s'
H : τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
⊢ ∃ x τ, x ∈ insert x₀ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ

State before:
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
x₀ : ν
s' : Finset ν
hx₀ : x₀ ∉ s'
ih :
  ∀ {σ₁ : PropAssignment ν},
    σ₁ ⊨ φ →
      (∀ x ∈ s', σ₁ x ≠ σ₂ x) →
        (∀ x ∈ vars φ \ s', σ₁ x = σ₂ x) → ∃ x τ, x ∈ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ insert x₀ s', σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ insert x₀ s', σ₁ x = σ₂ x
σ₁' : PropAssignment ν := PropAssignment.set σ₁ x₀ !σ₁ x₀
h₁' : σ₁' ⊨ φ
hS' : ∀ x ∈ s', σ₁' x ≠ σ₂ x
hSC' : ∀ x ∈ vars φ \ s', σ₁' x = σ₂ x
x : ν
τ : PropAssignment ν
hx : x ∈ s'
H : τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
⊢ ∃ x τ, x ∈ insert x₀ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
Tactic:
exact ⟨x, τ, Finset.mem_insert_of_mem hx, H⟩
State after:
no goals

State before:
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
x₀ : ν
s' : Finset ν
hx₀ : x₀ ∉ s'
ih :
  ∀ {σ₁ : PropAssignment ν},
    σ₁ ⊨ φ →
      (∀ x ∈ s', σ₁ x ≠ σ₂ x) →
        (∀ x ∈ vars φ \ s', σ₁ x = σ₂ x) → ∃ x τ, x ∈ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ insert x₀ s', σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ insert x₀ s', σ₁ x = σ₂ x
σ₁' : PropAssignment ν := PropAssignment.set σ₁ x₀ !σ₁ x₀
h₁' : σ₁' ⊨ φ
x : ν
hMem : x ∈ s'
⊢ σ₁' x ≠ σ₂ x
Tactic:
have hX : x₀ ≠ x := fun h => hx₀ (h ▸ hMem)
State after:
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
x₀ : ν
s' : Finset ν
hx₀ : x₀ ∉ s'
ih :
  ∀ {σ₁ : PropAssignment ν},
    σ₁ ⊨ φ →
      (∀ x ∈ s', σ₁ x ≠ σ₂ x) →
        (∀ x ∈ vars φ \ s', σ₁ x = σ₂ x) → ∃ x τ, x ∈ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ insert x₀ s', σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ insert x₀ s', σ₁ x = σ₂ x
σ₁' : PropAssignment ν := PropAssignment.set σ₁ x₀ !σ₁ x₀
h₁' : σ₁' ⊨ φ
x : ν
hMem : x ∈ s'
hX : x₀ ≠ x
⊢ σ₁' x ≠ σ₂ x

State before:
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
x₀ : ν
s' : Finset ν
hx₀ : x₀ ∉ s'
ih :
  ∀ {σ₁ : PropAssignment ν},
    σ₁ ⊨ φ →
      (∀ x ∈ s', σ₁ x ≠ σ₂ x) →
        (∀ x ∈ vars φ \ s', σ₁ x = σ₂ x) → ∃ x τ, x ∈ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ insert x₀ s', σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ insert x₀ s', σ₁ x = σ₂ x
σ₁' : PropAssignment ν := PropAssignment.set σ₁ x₀ !σ₁ x₀
h₁' : σ₁' ⊨ φ
x : ν
hMem : x ∈ s'
hX : x₀ ≠ x
⊢ σ₁' x ≠ σ₂ x
Tactic:
simp only [σ₁', σ₁.set_get_of_ne (!σ₁ x₀) hX]
State after:
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
x₀ : ν
s' : Finset ν
hx₀ : x₀ ∉ s'
ih :
  ∀ {σ₁ : PropAssignment ν},
    σ₁ ⊨ φ →
      (∀ x ∈ s', σ₁ x ≠ σ₂ x) →
        (∀ x ∈ vars φ \ s', σ₁ x = σ₂ x) → ∃ x τ, x ∈ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ insert x₀ s', σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ insert x₀ s', σ₁ x = σ₂ x
σ₁' : PropAssignment ν := PropAssignment.set σ₁ x₀ !σ₁ x₀
h₁' : σ₁' ⊨ φ
x : ν
hMem : x ∈ s'
hX : x₀ ≠ x
⊢ σ₁ x ≠ σ₂ x

State before:
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
x₀ : ν
s' : Finset ν
hx₀ : x₀ ∉ s'
ih :
  ∀ {σ₁ : PropAssignment ν},
    σ₁ ⊨ φ →
      (∀ x ∈ s', σ₁ x ≠ σ₂ x) →
        (∀ x ∈ vars φ \ s', σ₁ x = σ₂ x) → ∃ x τ, x ∈ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ insert x₀ s', σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ insert x₀ s', σ₁ x = σ₂ x
σ₁' : PropAssignment ν := PropAssignment.set σ₁ x₀ !σ₁ x₀
h₁' : σ₁' ⊨ φ
x : ν
hMem : x ∈ s'
hX : x₀ ≠ x
⊢ σ₁ x ≠ σ₂ x
Tactic:
exact hS _ (Finset.mem_insert_of_mem hMem)
State after:
no goals

State before:
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
x₀ : ν
s' : Finset ν
hx₀ : x₀ ∉ s'
ih :
  ∀ {σ₁ : PropAssignment ν},
    σ₁ ⊨ φ →
      (∀ x ∈ s', σ₁ x ≠ σ₂ x) →
        (∀ x ∈ vars φ \ s', σ₁ x = σ₂ x) → ∃ x τ, x ∈ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ insert x₀ s', σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ insert x₀ s', σ₁ x = σ₂ x
σ₁' : PropAssignment ν := PropAssignment.set σ₁ x₀ !σ₁ x₀
h₁' : σ₁' ⊨ φ
hS' : ∀ x ∈ s', σ₁' x ≠ σ₂ x
x : ν
hMem : x ∈ vars φ \ s'
⊢ σ₁' x = σ₂ x
Tactic:
by_cases hX : x₀ = x
State after:
case pos
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
x₀ : ν
s' : Finset ν
hx₀ : x₀ ∉ s'
ih :
  ∀ {σ₁ : PropAssignment ν},
    σ₁ ⊨ φ →
      (∀ x ∈ s', σ₁ x ≠ σ₂ x) →
        (∀ x ∈ vars φ \ s', σ₁ x = σ₂ x) → ∃ x τ, x ∈ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ insert x₀ s', σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ insert x₀ s', σ₁ x = σ₂ x
σ₁' : PropAssignment ν := PropAssignment.set σ₁ x₀ !σ₁ x₀
h₁' : σ₁' ⊨ φ
hS' : ∀ x ∈ s', σ₁' x ≠ σ₂ x
x : ν
hMem : x ∈ vars φ \ s'
hX : x₀ = x
⊢ σ₁' x = σ₂ x

case neg
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
x₀ : ν
s' : Finset ν
hx₀ : x₀ ∉ s'
ih :
  ∀ {σ₁ : PropAssignment ν},
    σ₁ ⊨ φ →
      (∀ x ∈ s', σ₁ x ≠ σ₂ x) →
        (∀ x ∈ vars φ \ s', σ₁ x = σ₂ x) → ∃ x τ, x ∈ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ insert x₀ s', σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ insert x₀ s', σ₁ x = σ₂ x
σ₁' : PropAssignment ν := PropAssignment.set σ₁ x₀ !σ₁ x₀
h₁' : σ₁' ⊨ φ
hS' : ∀ x ∈ s', σ₁' x ≠ σ₂ x
x : ν
hMem : x ∈ vars φ \ s'
hX : ¬x₀ = x
⊢ σ₁' x = σ₂ x

State before:
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
x₀ : ν
s' : Finset ν
hx₀ : x₀ ∉ s'
ih :
  ∀ {σ₁ : PropAssignment ν},
    σ₁ ⊨ φ →
      (∀ x ∈ s', σ₁ x ≠ σ₂ x) →
        (∀ x ∈ vars φ \ s', σ₁ x = σ₂ x) → ∃ x τ, x ∈ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ insert x₀ s', σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ insert x₀ s', σ₁ x = σ₂ x
σ₁' : PropAssignment ν := PropAssignment.set σ₁ x₀ !σ₁ x₀
h₁' : σ₁' ⊨ φ
hS' : ∀ x ∈ s', σ₁' x ≠ σ₂ x
x : ν
hMem : x ∈ vars φ \ s'
hX : x₀ = x
⊢ σ₁' x = σ₂ x
Tactic:
case pos =>
  have := hS _ (Finset.mem_insert_self _ _)
  simp only [σ₁', ← hX, PropAssignment.set_get, Bool.bnot_eq,
              this, not_false_eq_true]
State after:
no goals

State before:
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
x₀ : ν
s' : Finset ν
hx₀ : x₀ ∉ s'
ih :
  ∀ {σ₁ : PropAssignment ν},
    σ₁ ⊨ φ →
      (∀ x ∈ s', σ₁ x ≠ σ₂ x) →
        (∀ x ∈ vars φ \ s', σ₁ x = σ₂ x) → ∃ x τ, x ∈ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ insert x₀ s', σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ insert x₀ s', σ₁ x = σ₂ x
σ₁' : PropAssignment ν := PropAssignment.set σ₁ x₀ !σ₁ x₀
h₁' : σ₁' ⊨ φ
hS' : ∀ x ∈ s', σ₁' x ≠ σ₂ x
x : ν
hMem : x ∈ vars φ \ s'
hX : ¬x₀ = x
⊢ σ₁' x = σ₂ x
Tactic:
case neg =>
  simp only [σ₁', σ₁.set_get_of_ne _ hX]
  aesop
State after:
no goals

State before:
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
x₀ : ν
s' : Finset ν
hx₀ : x₀ ∉ s'
ih :
  ∀ {σ₁ : PropAssignment ν},
    σ₁ ⊨ φ →
      (∀ x ∈ s', σ₁ x ≠ σ₂ x) →
        (∀ x ∈ vars φ \ s', σ₁ x = σ₂ x) → ∃ x τ, x ∈ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ insert x₀ s', σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ insert x₀ s', σ₁ x = σ₂ x
σ₁' : PropAssignment ν := PropAssignment.set σ₁ x₀ !σ₁ x₀
h₁' : σ₁' ⊨ φ
hS' : ∀ x ∈ s', σ₁' x ≠ σ₂ x
x : ν
hMem : x ∈ vars φ \ s'
hX : x₀ = x
⊢ σ₁' x = σ₂ x
Tactic:
have := hS _ (Finset.mem_insert_self _ _)
State after:
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
x₀ : ν
s' : Finset ν
hx₀ : x₀ ∉ s'
ih :
  ∀ {σ₁ : PropAssignment ν},
    σ₁ ⊨ φ →
      (∀ x ∈ s', σ₁ x ≠ σ₂ x) →
        (∀ x ∈ vars φ \ s', σ₁ x = σ₂ x) → ∃ x τ, x ∈ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ insert x₀ s', σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ insert x₀ s', σ₁ x = σ₂ x
σ₁' : PropAssignment ν := PropAssignment.set σ₁ x₀ !σ₁ x₀
h₁' : σ₁' ⊨ φ
hS' : ∀ x ∈ s', σ₁' x ≠ σ₂ x
x : ν
hMem : x ∈ vars φ \ s'
hX : x₀ = x
this : σ₁ x₀ ≠ σ₂ x₀
⊢ σ₁' x = σ₂ x

State before:
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
x₀ : ν
s' : Finset ν
hx₀ : x₀ ∉ s'
ih :
  ∀ {σ₁ : PropAssignment ν},
    σ₁ ⊨ φ →
      (∀ x ∈ s', σ₁ x ≠ σ₂ x) →
        (∀ x ∈ vars φ \ s', σ₁ x = σ₂ x) → ∃ x τ, x ∈ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ insert x₀ s', σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ insert x₀ s', σ₁ x = σ₂ x
σ₁' : PropAssignment ν := PropAssignment.set σ₁ x₀ !σ₁ x₀
h₁' : σ₁' ⊨ φ
hS' : ∀ x ∈ s', σ₁' x ≠ σ₂ x
x : ν
hMem : x ∈ vars φ \ s'
hX : x₀ = x
this : σ₁ x₀ ≠ σ₂ x₀
⊢ σ₁' x = σ₂ x
Tactic:
simp only [σ₁', ← hX, PropAssignment.set_get, Bool.bnot_eq,
            this, not_false_eq_true]
State after:
no goals

State before:
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
x₀ : ν
s' : Finset ν
hx₀ : x₀ ∉ s'
ih :
  ∀ {σ₁ : PropAssignment ν},
    σ₁ ⊨ φ →
      (∀ x ∈ s', σ₁ x ≠ σ₂ x) →
        (∀ x ∈ vars φ \ s', σ₁ x = σ₂ x) → ∃ x τ, x ∈ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ insert x₀ s', σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ insert x₀ s', σ₁ x = σ₂ x
σ₁' : PropAssignment ν := PropAssignment.set σ₁ x₀ !σ₁ x₀
h₁' : σ₁' ⊨ φ
hS' : ∀ x ∈ s', σ₁' x ≠ σ₂ x
x : ν
hMem : x ∈ vars φ \ s'
hX : ¬x₀ = x
⊢ σ₁' x = σ₂ x
Tactic:
simp only [σ₁', σ₁.set_get_of_ne _ hX]
State after:
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
x₀ : ν
s' : Finset ν
hx₀ : x₀ ∉ s'
ih :
  ∀ {σ₁ : PropAssignment ν},
    σ₁ ⊨ φ →
      (∀ x ∈ s', σ₁ x ≠ σ₂ x) →
        (∀ x ∈ vars φ \ s', σ₁ x = σ₂ x) → ∃ x τ, x ∈ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ insert x₀ s', σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ insert x₀ s', σ₁ x = σ₂ x
σ₁' : PropAssignment ν := PropAssignment.set σ₁ x₀ !σ₁ x₀
h₁' : σ₁' ⊨ φ
hS' : ∀ x ∈ s', σ₁' x ≠ σ₂ x
x : ν
hMem : x ∈ vars φ \ s'
hX : ¬x₀ = x
⊢ σ₁ x = σ₂ x

State before:
ν : Type u_1
inst✝ : DecidableEq ν
φ : PropForm ν
σ₁✝ σ₂✝ : PropAssignment ν
h₁✝ : σ₁✝ ⊨ φ
h₂✝ : ¬σ₂✝ ⊨ φ
σ₂ : PropAssignment ν
h₂ : ¬σ₂ ⊨ φ
x₀ : ν
s' : Finset ν
hx₀ : x₀ ∉ s'
ih :
  ∀ {σ₁ : PropAssignment ν},
    σ₁ ⊨ φ →
      (∀ x ∈ s', σ₁ x ≠ σ₂ x) →
        (∀ x ∈ vars φ \ s', σ₁ x = σ₂ x) → ∃ x τ, x ∈ s' ∧ τ ⊨ φ ∧ (fun M φ => ¬M ⊨ φ) (PropAssignment.set τ x !τ x) φ
σ₁ : PropAssignment ν
h₁ : σ₁ ⊨ φ
hS : ∀ x ∈ insert x₀ s', σ₁ x ≠ σ₂ x
hSC : ∀ x ∈ vars φ \ insert x₀ s', σ₁ x = σ₂ x
σ₁' : PropAssignment ν := PropAssignment.set σ₁ x₀ !σ₁ x₀
h₁' : σ₁' ⊨ φ
hS' : ∀ x ∈ s', σ₁' x ≠ σ₂ x
x : ν
hMem : x ∈ vars φ \ s'
hX : ¬x₀ = x
⊢ σ₁ x = σ₂ x
Tactic:
aesop
State after:
no goals