Theorem: FirstOrder.Language.BoundedFormula.realize_toFormula
File: Mathlib/ModelTheory/Semantics.lean

tactic: induction' φ with _ _ _ _ _ _ _ _ _ _ _ ih1 ih2 _ _ ih3 a8 a9 a0
state_before: L : Language
L' : Language
M : Type w
N : Type ?u.638594
P : Type ?u.638597
inst✝² : Structure L M
inst✝¹ : Structure L N
inst✝ : Structure L P
α : Type u'
β : Type v'
n : ℕ
T : Theory L
φ : BoundedFormula L α n
v : α ⊕ Fin n → M
⊢ Formula.Realize (toFormula φ) v ↔ Realize φ (v ∘ Sum.inl) (v ∘ Sum.inr)

tactic: rfl
state_before: case falsum
L : Language
L' : Language
M : Type w
N : Type ?u.638594
P : Type ?u.638597
inst✝² : Structure L M
inst✝¹ : Structure L N
inst✝ : Structure L P
α : Type u'
β : Type v'
n : ℕ
T : Theory L
v✝ : α ⊕ Fin n → M
n✝ : ℕ
v : α ⊕ Fin n✝ → M
⊢ Formula.Realize (toFormula falsum) v ↔ Realize falsum (v ∘ Sum.inl) (v ∘ Sum.inr)

tactic: simp [BoundedFormula.Realize]
state_before: case equal
L : Language
L' : Language
M : Type w
N : Type ?u.638594
P : Type ?u.638597
inst✝² : Structure L M
inst✝¹ : Structure L N
inst✝ : Structure L P
α : Type u'
β : Type v'
n : ℕ
T : Theory L
v✝ : α ⊕ Fin n → M
n✝ : ℕ
t₁✝ t₂✝ : Term L (α ⊕ Fin n✝)
v : α ⊕ Fin n✝ → M
⊢ Formula.Realize (toFormula (equal t₁✝ t₂✝)) v ↔ Realize (equal t₁✝ t₂✝) (v ∘ Sum.inl) (v ∘ Sum.inr)

tactic: simp [BoundedFormula.Realize]
state_before: case rel
L : Language
L' : Language
M : Type w
N : Type ?u.638594
P : Type ?u.638597
inst✝² : Structure L M
inst✝¹ : Structure L N
inst✝ : Structure L P
α : Type u'
β : Type v'
n : ℕ
T : Theory L
v✝ : α ⊕ Fin n → M
n✝ l✝ : ℕ
R✝ : Relations L l✝
ts✝ : Fin l✝ → Term L (α ⊕ Fin n✝)
v : α ⊕ Fin n✝ → M
⊢ Formula.Realize (toFormula (rel R✝ ts✝)) v ↔ Realize (rel R✝ ts✝) (v ∘ Sum.inl) (v ∘ Sum.inr)

tactic: rw [toFormula, Formula.Realize, realize_imp, ← Formula.Realize, ih1, ← Formula.Realize, ih2,
  realize_imp]
state_before: case imp
L : Language
L' : Language
M : Type w
N : Type ?u.638594
P : Type ?u.638597
inst✝² : Structure L M
inst✝¹ : Structure L N
inst✝ : Structure L P
α : Type u'
β : Type v'
n : ℕ
T : Theory L
v✝ : α ⊕ Fin n → M
n✝ : ℕ
f₁✝ f₂✝ : BoundedFormula L α n✝
ih1 : ∀ (v : α ⊕ Fin n✝ → M), Formula.Realize (toFormula f₁✝) v ↔ Realize f₁✝ (v ∘ Sum.inl) (v ∘ Sum.inr)
ih2 : ∀ (v : α ⊕ Fin n✝ → M), Formula.Realize (toFormula f₂✝) v ↔ Realize f₂✝ (v ∘ Sum.inl) (v ∘ Sum.inr)
v : α ⊕ Fin n✝ → M
⊢ Formula.Realize (toFormula (f₁✝ ⟹ f₂✝)) v ↔ Realize (f₁✝ ⟹ f₂✝) (v ∘ Sum.inl) (v ∘ Sum.inr)

tactic: rw [toFormula, Formula.Realize, realize_all, realize_all]
state_before: case all
L : Language
L' : Language
M : Type w
N : Type ?u.638594
P : Type ?u.638597
inst✝² : Structure L M
inst✝¹ : Structure L N
inst✝ : Structure L P
α : Type u'
β : Type v'
n : ℕ
T : Theory L
v✝ : α ⊕ Fin n → M
n✝ : ℕ
f✝ : BoundedFormula L α (n✝ + 1)
ih3 : ∀ (v : α ⊕ Fin (n✝ + 1) → M), Formula.Realize (toFormula f✝) v ↔ Realize f✝ (v ∘ Sum.inl) (v ∘ Sum.inr)
v : α ⊕ Fin n✝ → M
⊢ Formula.Realize (toFormula (∀'f✝)) v ↔ Realize (∀'f✝) (v ∘ Sum.inl) (v ∘ Sum.inr)

tactic: refine' forall_congr' fun a => _
state_before: case all
L : Language
L' : Language
M : Type w
N : Type ?u.638594
P : Type ?u.638597
inst✝² : Structure L M
inst✝¹ : Structure L N
inst✝ : Structure L P
α : Type u'
β : Type v'
n : ℕ
T : Theory L
v✝ : α ⊕ Fin n → M
n✝ : ℕ
f✝ : BoundedFormula L α (n✝ + 1)
ih3 : ∀ (v : α ⊕ Fin (n✝ + 1) → M), Formula.Realize (toFormula f✝) v ↔ Realize f✝ (v ∘ Sum.inl) (v ∘ Sum.inr)
v : α ⊕ Fin n✝ → M
⊢ (∀ (a : M),
      Realize (relabel (Sum.elim (Sum.inl ∘ Sum.inl) (Sum.map Sum.inr id ∘ ↑finSumFinEquiv.symm)) (toFormula f✝)) v
        (snoc default a)) ↔
    ∀ (a : M), Realize f✝ (v ∘ Sum.inl) (snoc (v ∘ Sum.inr) a)

tactic: have h := ih3 (Sum.elim (v ∘ Sum.inl) (snoc (v ∘ Sum.inr) a))
state_before: case all
L : Language
L' : Language
M : Type w
N : Type ?u.638594
P : Type ?u.638597
inst✝² : Structure L M
inst✝¹ : Structure L N
inst✝ : Structure L P
α : Type u'
β : Type v'
n : ℕ
T : Theory L
v✝ : α ⊕ Fin n → M
n✝ : ℕ
f✝ : BoundedFormula L α (n✝ + 1)
ih3 : ∀ (v : α ⊕ Fin (n✝ + 1) → M), Formula.Realize (toFormula f✝) v ↔ Realize f✝ (v ∘ Sum.inl) (v ∘ Sum.inr)
v : α ⊕ Fin n✝ → M
a : M
⊢ Realize (relabel (Sum.elim (Sum.inl ∘ Sum.inl) (Sum.map Sum.inr id ∘ ↑finSumFinEquiv.symm)) (toFormula f✝)) v
      (snoc default a) ↔
    Realize f✝ (v ∘ Sum.inl) (snoc (v ∘ Sum.inr) a)

tactic: simp only [Sum.elim_comp_inl, Sum.elim_comp_inr] at h
state_before: case all
L : Language
L' : Language
M : Type w
N : Type ?u.638594
P : Type ?u.638597
inst✝² : Structure L M
inst✝¹ : Structure L N
inst✝ : Structure L P
α : Type u'
β : Type v'
n : ℕ
T : Theory L
v✝ : α ⊕ Fin n → M
n✝ : ℕ
f✝ : BoundedFormula L α (n✝ + 1)
ih3 : ∀ (v : α ⊕ Fin (n✝ + 1) → M), Formula.Realize (toFormula f✝) v ↔ Realize f✝ (v ∘ Sum.inl) (v ∘ Sum.inr)
v : α ⊕ Fin n✝ → M
a : M
h :
  Formula.Realize (toFormula f✝) (Sum.elim (v ∘ Sum.inl) (snoc (v ∘ Sum.inr) a)) ↔
    Realize f✝ (Sum.elim (v ∘ Sum.inl) (snoc (v ∘ Sum.inr) a) ∘ Sum.inl)
      (Sum.elim (v ∘ Sum.inl) (snoc (v ∘ Sum.inr) a) ∘ Sum.inr)
⊢ Realize (relabel (Sum.elim (Sum.inl ∘ Sum.inl) (Sum.map Sum.inr id ∘ ↑finSumFinEquiv.symm)) (toFormula f✝)) v
      (snoc default a) ↔
    Realize f✝ (v ∘ Sum.inl) (snoc (v ∘ Sum.inr) a)

tactic: rw [← h, realize_relabel, Formula.Realize, iff_iff_eq]
state_before: case all
L : Language
L' : Language
M : Type w
N : Type ?u.638594
P : Type ?u.638597
inst✝² : Structure L M
inst✝¹ : Structure L N
inst✝ : Structure L P
α : Type u'
β : Type v'
n : ℕ
T : Theory L
v✝ : α ⊕ Fin n → M
n✝ : ℕ
f✝ : BoundedFormula L α (n✝ + 1)
ih3 : ∀ (v : α ⊕ Fin (n✝ + 1) → M), Formula.Realize (toFormula f✝) v ↔ Realize f✝ (v ∘ Sum.inl) (v ∘ Sum.inr)
v : α ⊕ Fin n✝ → M
a : M
h :
  Formula.Realize (toFormula f✝) (Sum.elim (v ∘ Sum.inl) (snoc (v ∘ Sum.inr) a)) ↔
    Realize f✝ (v ∘ Sum.inl) (snoc (v ∘ Sum.inr) a)
⊢ Realize (relabel (Sum.elim (Sum.inl ∘ Sum.inl) (Sum.map Sum.inr id ∘ ↑finSumFinEquiv.symm)) (toFormula f✝)) v
      (snoc default a) ↔
    Realize f✝ (v ∘ Sum.inl) (snoc (v ∘ Sum.inr) a)

tactic: simp only [Function.comp]
state_before: case all
L : Language
L' : Language
M : Type w
N : Type ?u.638594
P : Type ?u.638597
inst✝² : Structure L M
inst✝¹ : Structure L N
inst✝ : Structure L P
α : Type u'
β : Type v'
n : ℕ
T : Theory L
v✝ : α ⊕ Fin n → M
n✝ : ℕ
f✝ : BoundedFormula L α (n✝ + 1)
ih3 : ∀ (v : α ⊕ Fin (n✝ + 1) → M), Formula.Realize (toFormula f✝) v ↔ Realize f✝ (v ∘ Sum.inl) (v ∘ Sum.inr)
v : α ⊕ Fin n✝ → M
a : M
h :
  Formula.Realize (toFormula f✝) (Sum.elim (v ∘ Sum.inl) (snoc (v ∘ Sum.inr) a)) ↔
    Realize f✝ (v ∘ Sum.inl) (snoc (v ∘ Sum.inr) a)
⊢ Realize (toFormula f✝)
      (Sum.elim v (snoc default a ∘ ↑(castAdd 0)) ∘
        Sum.elim (Sum.inl ∘ Sum.inl) (Sum.map Sum.inr id ∘ ↑finSumFinEquiv.symm))
      (snoc default a ∘ ↑(natAdd 1)) =
    Realize (toFormula f✝) (Sum.elim (v ∘ Sum.inl) (snoc (v ∘ Sum.inr) a)) default

tactic: congr with x
state_before: case all
L : Language
L' : Language
M : Type w
N : Type ?u.638594
P : Type ?u.638597
inst✝² : Structure L M
inst✝¹ : Structure L N
inst✝ : Structure L P
α : Type u'
β : Type v'
n : ℕ
T : Theory L
v✝ : α ⊕ Fin n → M
n✝ : ℕ
f✝ : BoundedFormula L α (n✝ + 1)
ih3 : ∀ (v : α ⊕ Fin (n✝ + 1) → M), Formula.Realize (toFormula f✝) v ↔ Realize f✝ (v ∘ Sum.inl) (v ∘ Sum.inr)
v : α ⊕ Fin n✝ → M
a : M
h :
  Formula.Realize (toFormula f✝) (Sum.elim (v ∘ Sum.inl) (snoc (v ∘ Sum.inr) a)) ↔
    Realize f✝ (v ∘ Sum.inl) (snoc (v ∘ Sum.inr) a)
⊢ (Realize (toFormula f✝)
      (fun x =>
        Sum.elim v (fun x => snoc default a (↑(castAdd 0) x))
          (Sum.elim (fun x => Sum.inl (Sum.inl x)) (fun x => Sum.map Sum.inr id (↑finSumFinEquiv.symm x)) x))
      fun x => snoc default a (↑(natAdd 1) x)) =
    Realize (toFormula f✝) (Sum.elim (fun x => v (Sum.inl x)) (snoc (fun x => v (Sum.inr x)) a)) default

tactic: cases' x with _ x
state_before: case all.e__v.h
L : Language
L' : Language
M : Type w
N : Type ?u.638594
P : Type ?u.638597
inst✝² : Structure L M
inst✝¹ : Structure L N
inst✝ : Structure L P
α : Type u'
β : Type v'
n : ℕ
T : Theory L
v✝ : α ⊕ Fin n → M
n✝ : ℕ
f✝ : BoundedFormula L α (n✝ + 1)
ih3 : ∀ (v : α ⊕ Fin (n✝ + 1) → M), Formula.Realize (toFormula f✝) v ↔ Realize f✝ (v ∘ Sum.inl) (v ∘ Sum.inr)
v : α ⊕ Fin n✝ → M
a : M
h :
  Formula.Realize (toFormula f✝) (Sum.elim (v ∘ Sum.inl) (snoc (v ∘ Sum.inr) a)) ↔
    Realize f✝ (v ∘ Sum.inl) (snoc (v ∘ Sum.inr) a)
x : α ⊕ Fin (n✝ + 1)
⊢ Sum.elim v (fun x => snoc default a (↑(castAdd 0) x))
      (Sum.elim (fun x => Sum.inl (Sum.inl x)) (fun x => Sum.map Sum.inr id (↑finSumFinEquiv.symm x)) x) =
    Sum.elim (fun x => v (Sum.inl x)) (snoc (fun x => v (Sum.inr x)) a) x

tactic: simp
state_before: case all.e__v.h.inl
L : Language
L' : Language
M : Type w
N : Type ?u.638594
P : Type ?u.638597
inst✝² : Structure L M
inst✝¹ : Structure L N
inst✝ : Structure L P
α : Type u'
β : Type v'
n : ℕ
T : Theory L
v✝ : α ⊕ Fin n → M
n✝ : ℕ
f✝ : BoundedFormula L α (n✝ + 1)
ih3 : ∀ (v : α ⊕ Fin (n✝ + 1) → M), Formula.Realize (toFormula f✝) v ↔ Realize f✝ (v ∘ Sum.inl) (v ∘ Sum.inr)
v : α ⊕ Fin n✝ → M
a : M
h :
  Formula.Realize (toFormula f✝) (Sum.elim (v ∘ Sum.inl) (snoc (v ∘ Sum.inr) a)) ↔
    Realize f✝ (v ∘ Sum.inl) (snoc (v ∘ Sum.inr) a)
val✝ : α
⊢ Sum.elim v (fun x => snoc default a (↑(castAdd 0) x))
      (Sum.elim (fun x => Sum.inl (Sum.inl x)) (fun x => Sum.map Sum.inr id (↑finSumFinEquiv.symm x)) (Sum.inl val✝)) =
    Sum.elim (fun x => v (Sum.inl x)) (snoc (fun x => v (Sum.inr x)) a) (Sum.inl val✝)

tactic: refine' Fin.lastCases _ _ x
state_before: case all.e__v.h.inr
L : Language
L' : Language
M : Type w
N : Type ?u.638594
P : Type ?u.638597
inst✝² : Structure L M
inst✝¹ : Structure L N
inst✝ : Structure L P
α : Type u'
β : Type v'
n : ℕ
T : Theory L
v✝ : α ⊕ Fin n → M
n✝ : ℕ
f✝ : BoundedFormula L α (n✝ + 1)
ih3 : ∀ (v : α ⊕ Fin (n✝ + 1) → M), Formula.Realize (toFormula f✝) v ↔ Realize f✝ (v ∘ Sum.inl) (v ∘ Sum.inr)
v : α ⊕ Fin n✝ → M
a : M
h :
  Formula.Realize (toFormula f✝) (Sum.elim (v ∘ Sum.inl) (snoc (v ∘ Sum.inr) a)) ↔
    Realize f✝ (v ∘ Sum.inl) (snoc (v ∘ Sum.inr) a)
x : Fin (n✝ + 1)
⊢ Sum.elim v (fun x => snoc default a (↑(castAdd 0) x))
      (Sum.elim (fun x => Sum.inl (Sum.inl x)) (fun x => Sum.map Sum.inr id (↑finSumFinEquiv.symm x)) (Sum.inr x)) =
    Sum.elim (fun x => v (Sum.inl x)) (snoc (fun x => v (Sum.inr x)) a) (Sum.inr x)

tactic: rw [Sum.elim_inr, Sum.elim_inr,
  finSumFinEquiv_symm_last, Sum.map_inr, Sum.elim_inr]
state_before: case all.e__v.h.inr.refine'_1
L : Language
L' : Language
M : Type w
N : Type ?u.638594
P : Type ?u.638597
inst✝² : Structure L M
inst✝¹ : Structure L N
inst✝ : Structure L P
α : Type u'
β : Type v'
n : ℕ
T : Theory L
v✝ : α ⊕ Fin n → M
n✝ : ℕ
f✝ : BoundedFormula L α (n✝ + 1)
ih3 : ∀ (v : α ⊕ Fin (n✝ + 1) → M), Formula.Realize (toFormula f✝) v ↔ Realize f✝ (v ∘ Sum.inl) (v ∘ Sum.inr)
v : α ⊕ Fin n✝ → M
a : M
h :
  Formula.Realize (toFormula f✝) (Sum.elim (v ∘ Sum.inl) (snoc (v ∘ Sum.inr) a)) ↔
    Realize f✝ (v ∘ Sum.inl) (snoc (v ∘ Sum.inr) a)
x : Fin (n✝ + 1)
⊢ Sum.elim v (fun x => snoc default a (↑(castAdd 0) x))
      (Sum.elim (fun x => Sum.inl (Sum.inl x)) (fun x => Sum.map Sum.inr id (↑finSumFinEquiv.symm x))
        (Sum.inr (last n✝))) =
    Sum.elim (fun x => v (Sum.inl x)) (snoc (fun x => v (Sum.inr x)) a) (Sum.inr (last n✝))

tactic: simp [Fin.snoc]
state_before: case all.e__v.h.inr.refine'_1
L : Language
L' : Language
M : Type w
N : Type ?u.638594
P : Type ?u.638597
inst✝² : Structure L M
inst✝¹ : Structure L N
inst✝ : Structure L P
α : Type u'
β : Type v'
n : ℕ
T : Theory L
v✝ : α ⊕ Fin n → M
n✝ : ℕ
f✝ : BoundedFormula L α (n✝ + 1)
ih3 : ∀ (v : α ⊕ Fin (n✝ + 1) → M), Formula.Realize (toFormula f✝) v ↔ Realize f✝ (v ∘ Sum.inl) (v ∘ Sum.inr)
v : α ⊕ Fin n✝ → M
a : M
h :
  Formula.Realize (toFormula f✝) (Sum.elim (v ∘ Sum.inl) (snoc (v ∘ Sum.inr) a)) ↔
    Realize f✝ (v ∘ Sum.inl) (snoc (v ∘ Sum.inr) a)
x : Fin (n✝ + 1)
⊢ snoc default a (↑(castAdd 0) (id 0)) = snoc (fun x => v (Sum.inr x)) a (last n✝)

tactic: simp only [castSucc, Function.comp_apply, Sum.elim_inr,
  finSumFinEquiv_symm_apply_castAdd, Sum.map_inl, Sum.elim_inl]
state_before: case all.e__v.h.inr.refine'_2
L : Language
L' : Language
M : Type w
N : Type ?u.638594
P : Type ?u.638597
inst✝² : Structure L M
inst✝¹ : Structure L N
inst✝ : Structure L P
α : Type u'
β : Type v'
n : ℕ
T : Theory L
v✝ : α ⊕ Fin n → M
n✝ : ℕ
f✝ : BoundedFormula L α (n✝ + 1)
ih3 : ∀ (v : α ⊕ Fin (n✝ + 1) → M), Formula.Realize (toFormula f✝) v ↔ Realize f✝ (v ∘ Sum.inl) (v ∘ Sum.inr)
v : α ⊕ Fin n✝ → M
a : M
h :
  Formula.Realize (toFormula f✝) (Sum.elim (v ∘ Sum.inl) (snoc (v ∘ Sum.inr) a)) ↔
    Realize f✝ (v ∘ Sum.inl) (snoc (v ∘ Sum.inr) a)
x : Fin (n✝ + 1)
⊢ ∀ (i : Fin n✝),
    Sum.elim v (fun x => snoc default a (↑(castAdd 0) x))
        (Sum.elim (fun x => Sum.inl (Sum.inl x)) (fun x => Sum.map Sum.inr id (↑finSumFinEquiv.symm x))
          (Sum.inr (↑castSucc i))) =
      Sum.elim (fun x => v (Sum.inl x)) (snoc (fun x => v (Sum.inr x)) a) (Sum.inr (↑castSucc i))

tactic: rw [← castSucc]
state_before: case all.e__v.h.inr.refine'_2
L : Language
L' : Language
M : Type w
N : Type ?u.638594
P : Type ?u.638597
inst✝² : Structure L M
inst✝¹ : Structure L N
inst✝ : Structure L P
α : Type u'
β : Type v'
n : ℕ
T : Theory L
v✝ : α ⊕ Fin n → M
n✝ : ℕ
f✝ : BoundedFormula L α (n✝ + 1)
ih3 : ∀ (v : α ⊕ Fin (n✝ + 1) → M), Formula.Realize (toFormula f✝) v ↔ Realize f✝ (v ∘ Sum.inl) (v ∘ Sum.inr)
v : α ⊕ Fin n✝ → M
a : M
h :
  Formula.Realize (toFormula f✝) (Sum.elim (v ∘ Sum.inl) (snoc (v ∘ Sum.inr) a)) ↔
    Realize f✝ (v ∘ Sum.inl) (snoc (v ∘ Sum.inr) a)
x : Fin (n✝ + 1)
⊢ ∀ (i : Fin n✝), v (Sum.inr i) = snoc (fun x => v (Sum.inr x)) a (↑(castAdd 1) i)

tactic: simp
state_before: case all.e__v.h.inr.refine'_2
L : Language
L' : Language
M : Type w
N : Type ?u.638594
P : Type ?u.638597
inst✝² : Structure L M
inst✝¹ : Structure L N
inst✝ : Structure L P
α : Type u'
β : Type v'
n : ℕ
T : Theory L
v✝ : α ⊕ Fin n → M
n✝ : ℕ
f✝ : BoundedFormula L α (n✝ + 1)
ih3 : ∀ (v : α ⊕ Fin (n✝ + 1) → M), Formula.Realize (toFormula f✝) v ↔ Realize f✝ (v ∘ Sum.inl) (v ∘ Sum.inr)
v : α ⊕ Fin n✝ → M
a : M
h :
  Formula.Realize (toFormula f✝) (Sum.elim (v ∘ Sum.inl) (snoc (v ∘ Sum.inr) a)) ↔
    Realize f✝ (v ∘ Sum.inl) (snoc (v ∘ Sum.inr) a)
x : Fin (n✝ + 1)
⊢ ∀ (i : Fin n✝), v (Sum.inr i) = snoc (fun x => v (Sum.inr x)) a (↑castSucc i)

tactic: exact Fin.elim0 x
state_before: case all.e__xs.h
L : Language
L' : Language
M : Type w
N : Type ?u.638594
P : Type ?u.638597
inst✝² : Structure L M
inst✝¹ : Structure L N
inst✝ : Structure L P
α : Type u'
β : Type v'
n : ℕ
T : Theory L
v✝ : α ⊕ Fin n → M
n✝ : ℕ
f✝ : BoundedFormula L α (n✝ + 1)
ih3 : ∀ (v : α ⊕ Fin (n✝ + 1) → M), Formula.Realize (toFormula f✝) v ↔ Realize f✝ (v ∘ Sum.inl) (v ∘ Sum.inr)
v : α ⊕ Fin n✝ → M
a : M
h :
  Formula.Realize (toFormula f✝) (Sum.elim (v ∘ Sum.inl) (snoc (v ∘ Sum.inr) a)) ↔
    Realize f✝ (v ∘ Sum.inl) (snoc (v ∘ Sum.inr) a)
x : Fin 0
⊢ snoc default a (↑(natAdd 1) x) = default x