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

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
⊢ (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: 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 ⋯
⊢ (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: 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 ⋯
⊢ (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: refine Equiv.forall_congr ?_ ?_
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: exact ⟨fun v => v ∘ e, fun v => v ∘ e.symm,
  fun _ => by simp [Function.comp],
  fun _ => by simp [Function.comp]⟩
state_before: 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)
state_after: no goals

tactic: simp [Function.comp]
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
⊢ (fun v => v ∘ ⇑e.symm) ((fun v => v ∘ ⇑e) x✝) = x✝
state_after: no goals

tactic: simp [Function.comp]
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✝ : γ → M
⊢ (fun v => v ∘ ⇑e) ((fun v => v ∘ ⇑e.symm) x✝) = x✝
state_after: no goals

tactic: intro x
state_before: 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 ({ toFun := fun v => v ∘ ⇑e, invFun := fun v => v ∘ ⇑e.symm, left_inv := ⋯, right_inv := ⋯ } a)
          (f a_1)
state_after: 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 ⋯
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)) ↔
    φ.Realize fun a =>
      Sum.elim v ({ toFun := fun v => v ∘ ⇑e, invFun := fun v => v ∘ ⇑e.symm, left_inv := ⋯, right_inv := ⋯ } x) (f a)

tactic: rw [Formula.Realize, iff_iff_eq]
state_before: 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 ⋯
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)) ↔
    φ.Realize fun a =>
      Sum.elim v ({ toFun := fun v => v ∘ ⇑e, invFun := fun v => v ∘ ⇑e.symm, left_inv := ⋯, right_inv := ⋯ } x) (f a)
state_after: 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 ⋯
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)) =
    Realize φ
      (fun a =>
        Sum.elim v ({ toFun := fun v => v ∘ ⇑e, invFun := fun v => v ∘ ⇑e.symm, left_inv := ⋯, right_inv := ⋯ } x)
          (f a))
      default

tactic: congr
state_before: 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 ⋯
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)) =
    Realize φ
      (fun a =>
        Sum.elim v ({ toFun := fun v => v ∘ ⇑e, invFun := fun v => v ∘ ⇑e.symm, left_inv := ⋯, right_inv := ⋯ } x)
          (f a))
      default
state_after: case refine_2.e__xs
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
⊢ (fun x_1 => x (natAdd (Classical.choose ⋯) x_1)) = default

tactic: funext i
state_before: case refine_2.e__xs
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
⊢ (fun x_1 => x (natAdd (Classical.choose ⋯) x_1)) = default
state_after: case refine_2.e__xs.h
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
i : Fin 0
⊢ x (natAdd (Classical.choose ⋯) i) = default i

tactic: exact i.elim0
state_before: case refine_2.e__xs.h
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
i : Fin 0
⊢ x (natAdd (Classical.choose ⋯) i) = default i
state_after: no goals