Theorem: FirstOrder.Language.Formula.realize_iAlls
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.iAlls f φ).Realize v ↔ ∀ (i : γ → M), φ.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.iAlls f φ).Realize v ↔ ∀ (i : γ → M), φ.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.iAlls f φ).Realize v ↔ ∀ (i : γ → M), φ.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)) φ).alls).Realize
      v ↔
    ∀ (i : γ → M), φ.Realize fun a => Sum.elim v i (f a)
tactic: rw [Formula.iAlls]
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)) φ).alls).Realize
      v ↔
    ∀ (i : γ → M), φ.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 : Fin (Classical.choose ⋯) → M),
      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 : γ → M), φ.Realize fun a => Sum.elim v i (f a)
tactic: simp only [Nat.add_zero, realize_alls, 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 : Fin (Classical.choose ⋯) → M),
      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 : γ → M), φ.Realize fun a => Sum.elim v i (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 ?_ ?_