Theorem: FirstOrder.Language.Formula.realize_iExs
File: Mathlib/ModelTheory/Semantics.lean

Proof steps:
state_before: L : Language
L' : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝³ : L.Structure M
inst✝² : L.Structure N
inst✝¹ : L.Structure P
α : Type u'
β : Type v'
γ : Type u_3
n : ℕ
T : L.Theory
inst✝ : Finite γ
f : α → β ⊕ γ
φ : L.Formula α
v : β → M
⊢ (Formula.iExs f φ).Realize v ↔ ∃ i, φ.Realize fun a => Sum.elim v i (f a)
state_after: L : Language
L' : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝³ : L.Structure M
inst✝² : L.Structure N
inst✝¹ : L.Structure P
α : Type u'
β : Type v'
γ : Type u_3
n : ℕ
T : L.Theory
inst✝ : Finite γ
f : α → β ⊕ γ
φ : L.Formula α
v : β → M
e : γ ≃ Fin (Classical.choose ⋯) := Classical.choice ⋯
⊢ (Formula.iExs f φ).Realize v ↔ ∃ i, φ.Realize fun a => Sum.elim v i (f a)
tactic: let e := Classical.choice (Classical.choose_spec (Finite.exists_equiv_fin γ))
state_before: L : Language
L' : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝³ : L.Structure M
inst✝² : L.Structure N
inst✝¹ : L.Structure P
α : Type u'
β : Type v'
γ : Type u_3
n : ℕ
T : L.Theory
inst✝ : Finite γ
f : α → β ⊕ γ
φ : L.Formula α
v : β → M
e : γ ≃ Fin (Classical.choose ⋯) := Classical.choice ⋯
⊢ (Formula.iExs f φ).Realize v ↔ ∃ i, φ.Realize fun a => Sum.elim v i (f a)
state_after: L : Language
L' : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝³ : L.Structure M
inst✝² : L.Structure N
inst✝¹ : L.Structure P
α : Type u'
β : Type v'
γ : Type u_3
n : ℕ
T : L.Theory
inst✝ : Finite γ
f : α → β ⊕ γ
φ : L.Formula α
v : β → M
e : γ ≃ Fin (Classical.choose ⋯) := Classical.choice ⋯
⊢ (let e := Classical.choice ⋯;
        (relabel (fun a => Sum.map id (⇑e) (f a)) φ).exs).Realize
      v ↔
    ∃ i, φ.Realize fun a => Sum.elim v i (f a)
tactic: rw [Formula.iExs]
state_before: L : Language
L' : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝³ : L.Structure M
inst✝² : L.Structure N
inst✝¹ : L.Structure P
α : Type u'
β : Type v'
γ : Type u_3
n : ℕ
T : L.Theory
inst✝ : Finite γ
f : α → β ⊕ γ
φ : L.Formula α
v : β → M
e : γ ≃ Fin (Classical.choose ⋯) := Classical.choice ⋯
⊢ (let e := Classical.choice ⋯;
        (relabel (fun a => Sum.map id (⇑e) (f a)) φ).exs).Realize
      v ↔
    ∃ i, φ.Realize fun a => Sum.elim v i (f a)
state_after: L : Language
L' : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝³ : L.Structure M
inst✝² : L.Structure N
inst✝¹ : L.Structure P
α : Type u'
β : Type v'
γ : Type u_3
n : ℕ
T : L.Theory
inst✝ : Finite γ
f : α → β ⊕ γ
φ : L.Formula α
v : β → M
e : γ ≃ Fin (Classical.choose ⋯) := Classical.choice ⋯
⊢ (∃ xs,
      Realize φ (fun x => Sum.elim (fun x => v x) (fun x => xs (Fin.cast ⋯ ((Classical.choice ⋯) x))) (f x)) fun x =>
        xs (natAdd (Classical.choose ⋯) x)) ↔
    ∃ i, φ.Realize fun a => Sum.elim v i (f a)
tactic: simp only [Nat.add_zero, realize_exs, realize_relabel, Function.comp,
    castAdd_zero, finCongr_refl, OrderIso.refl_apply, Sum.elim_map, id_eq]
state_before: L : Language
L' : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝³ : L.Structure M
inst✝² : L.Structure N
inst✝¹ : L.Structure P
α : Type u'
β : Type v'
γ : Type u_3
n : ℕ
T : L.Theory
inst✝ : Finite γ
f : α → β ⊕ γ
φ : L.Formula α
v : β → M
e : γ ≃ Fin (Classical.choose ⋯) := Classical.choice ⋯
⊢ (∃ xs,
      Realize φ (fun x => Sum.elim (fun x => v x) (fun x => xs (Fin.cast ⋯ ((Classical.choice ⋯) x))) (f x)) fun x =>
        xs (natAdd (Classical.choose ⋯) x)) ↔
    ∃ i, φ.Realize fun a => Sum.elim v i (f a)
state_after: L : Language
L' : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝³ : L.Structure M
inst✝² : L.Structure N
inst✝¹ : L.Structure P
α : Type u'
β : Type v'
γ : Type u_3
n : ℕ
T : L.Theory
inst✝ : Finite γ
f : α → β ⊕ γ
φ : L.Formula α
v : β → M
e : γ ≃ Fin (Classical.choose ⋯) := Classical.choice ⋯
⊢ (∀ (x : Fin (Classical.choose ⋯) → M),
      ¬Realize φ (fun x_1 => Sum.elim (fun x => v x) (fun x_2 => x (Fin.cast ⋯ ((Classical.choice ⋯) x_2))) (f x_1))
          fun x_1 => x (natAdd (Classical.choose ⋯) x_1)) ↔
    ∀ (x : γ → M), ¬φ.Realize fun a => Sum.elim v x (f a)
tactic: rw [← not_iff_not, not_exists, not_exists]
state_before: L : Language
L' : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝³ : L.Structure M
inst✝² : L.Structure N
inst✝¹ : L.Structure P
α : Type u'
β : Type v'
γ : Type u_3
n : ℕ
T : L.Theory
inst✝ : Finite γ
f : α → β ⊕ γ
φ : L.Formula α
v : β → M
e : γ ≃ Fin (Classical.choose ⋯) := Classical.choice ⋯
⊢ (∀ (x : Fin (Classical.choose ⋯) → M),
      ¬Realize φ (fun x_1 => Sum.elim (fun x => v x) (fun x_2 => x (Fin.cast ⋯ ((Classical.choice ⋯) x_2))) (f x_1))
          fun x_1 => x (natAdd (Classical.choose ⋯) x_1)) ↔
    ∀ (x : γ → M), ¬φ.Realize fun a => Sum.elim v x (f a)
state_after: case refine_1
L : Language
L' : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝³ : L.Structure M
inst✝² : L.Structure N
inst✝¹ : L.Structure P
α : Type u'
β : Type v'
γ : Type u_3
n : ℕ
T : L.Theory
inst✝ : Finite γ
f : α → β ⊕ γ
φ : L.Formula α
v : β → M
e : γ ≃ Fin (Classical.choose ⋯) := Classical.choice ⋯
⊢ (Fin (Classical.choose ⋯) → M) ≃ (γ → M)

case refine_2
L : Language
L' : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝³ : L.Structure M
inst✝² : L.Structure N
inst✝¹ : L.Structure P
α : Type u'
β : Type v'
γ : Type u_3
n : ℕ
T : L.Theory
inst✝ : Finite γ
f : α → β ⊕ γ
φ : L.Formula α
v : β → M
e : γ ≃ Fin (Classical.choose ⋯) := Classical.choice ⋯
⊢ ∀ (a : Fin (Classical.choose ⋯) → M),
    (¬Realize φ (fun x => Sum.elim (fun x => v x) (fun x => a (Fin.cast ⋯ ((Classical.choice ⋯) x))) (f x)) fun x =>
          a (natAdd (Classical.choose ⋯) x)) ↔
      ¬φ.Realize fun a_1 => Sum.elim v (?refine_1 a) (f a_1)
tactic: refine Equiv.forall_congr ?_ ?_