Theorem: LO.FirstOrder.Semiterm.val_eq_of_funEqOn (Logic/FirstOrder/Basic/Semantics/Semantics.lean)

State before:
n n₁ n₂ : ℕ
L : Language
μ : Type v
μ₁ : Type v₁
μ₂ : Type v₂
M : Type w
s : Structure L M
e : Fin n → M
e₁ : Fin n₁ → M
e₂ : Fin n₂ → M
ε : μ → M
ε₁ : μ₁ → M
ε₂ : μ₂ → M
ε' : μ → M
t : Semiterm L μ n
h : Function.funEqOn t.fvar? ε ε'
⊢ val s e ε t = val s e ε' t
Tactic:
induction t <;> simp [val_func]
State after:
case fvar
n n₁ n₂ : ℕ
L : Language
μ : Type v
μ₁ : Type v₁
μ₂ : Type v₂
M : Type w
s : Structure L M
e : Fin n → M
e₁ : Fin n₁ → M
e₂ : Fin n₂ → M
ε : μ → M
ε₁ : μ₁ → M
ε₂ : μ₂ → M
ε' : μ → M
a✝ : μ
h : Function.funEqOn (&a✝).fvar? ε ε'
⊢ ε a✝ = ε' a✝

case func
n n₁ n₂ : ℕ
L : Language
μ : Type v
μ₁ : Type v₁
μ₂ : Type v₂
M : Type w
s : Structure L M
e : Fin n → M
e₁ : Fin n₁ → M
e₂ : Fin n₂ → M
ε : μ → M
ε₁ : μ₁ → M
ε₂ : μ₂ → M
ε' : μ → M
arity✝ : ℕ
a✝¹ : L.Func arity✝
a✝ : Fin arity✝ → Semiterm L μ n
a_ih✝ : ∀ (a : Fin arity✝), Function.funEqOn (a✝ a).fvar? ε ε' → val s e ε (a✝ a) = val s e ε' (a✝ a)
h : Function.funEqOn (func a✝¹ a✝).fvar? ε ε'
⊢ (Structure.func a✝¹ fun i => val s e ε (a✝ i)) = Structure.func a✝¹ fun i => val s e ε' (a✝ i)

State before:
n n₁ n₂ : ℕ
L : Language
μ : Type v
μ₁ : Type v₁
μ₂ : Type v₂
M : Type w
s : Structure L M
e : Fin n → M
e₁ : Fin n₁ → M
e₂ : Fin n₂ → M
ε : μ → M
ε₁ : μ₁ → M
ε₂ : μ₂ → M
ε' : μ → M
x : μ
h : Function.funEqOn (&x).fvar? ε ε'
⊢ ε x = ε' x
Tactic:
case fvar x => exact h x (by simp [fvar?])
State after:
no goals

State before:
n n₁ n₂ : ℕ
L : Language
μ : Type v
μ₁ : Type v₁
μ₂ : Type v₂
M : Type w
s : Structure L M
e : Fin n → M
e₁ : Fin n₁ → M
e₂ : Fin n₂ → M
ε : μ → M
ε₁ : μ₁ → M
ε₂ : μ₂ → M
ε' : μ → M
k : ℕ
f : L.Func k
v : Fin k → Semiterm L μ n
ih : ∀ (a : Fin k), Function.funEqOn (v a).fvar? ε ε' → val s e ε (v a) = val s e ε' (v a)
h : Function.funEqOn (func f v).fvar? ε ε'
⊢ (Structure.func f fun i => val s e ε (v i)) = Structure.func f fun i => val s e ε' (v i)
Tactic:
case func k f v ih =>
  congr; funext i; exact ih i (by intro x hx; exact h x (by simp; exact ⟨i, hx⟩))
State after:
no goals

State before:
n n₁ n₂ : ℕ
L : Language
μ : Type v
μ₁ : Type v₁
μ₂ : Type v₂
M : Type w
s : Structure L M
e : Fin n → M
e₁ : Fin n₁ → M
e₂ : Fin n₂ → M
ε : μ → M
ε₁ : μ₁ → M
ε₂ : μ₂ → M
ε' : μ → M
x : μ
h : Function.funEqOn (&x).fvar? ε ε'
⊢ ε x = ε' x
Tactic:
exact h x (by simp [fvar?])
State after:
no goals

State before:
n n₁ n₂ : ℕ
L : Language
μ : Type v
μ₁ : Type v₁
μ₂ : Type v₂
M : Type w
s : Structure L M
e : Fin n → M
e₁ : Fin n₁ → M
e₂ : Fin n₂ → M
ε : μ → M
ε₁ : μ₁ → M
ε₂ : μ₂ → M
ε' : μ → M
x : μ
h : Function.funEqOn (&x).fvar? ε ε'
⊢ (&x).fvar? x
Tactic:
simp [fvar?]
State after:
no goals

State before:
n n₁ n₂ : ℕ
L : Language
μ : Type v
μ₁ : Type v₁
μ₂ : Type v₂
M : Type w
s : Structure L M
e : Fin n → M
e₁ : Fin n₁ → M
e₂ : Fin n₂ → M
ε : μ → M
ε₁ : μ₁ → M
ε₂ : μ₂ → M
ε' : μ → M
k : ℕ
f : L.Func k
v : Fin k → Semiterm L μ n
ih : ∀ (a : Fin k), Function.funEqOn (v a).fvar? ε ε' → val s e ε (v a) = val s e ε' (v a)
h : Function.funEqOn (func f v).fvar? ε ε'
⊢ (Structure.func f fun i => val s e ε (v i)) = Structure.func f fun i => val s e ε' (v i)
Tactic:
congr
State after:
case e_a
n n₁ n₂ : ℕ
L : Language
μ : Type v
μ₁ : Type v₁
μ₂ : Type v₂
M : Type w
s : Structure L M
e : Fin n → M
e₁ : Fin n₁ → M
e₂ : Fin n₂ → M
ε : μ → M
ε₁ : μ₁ → M
ε₂ : μ₂ → M
ε' : μ → M
k : ℕ
f : L.Func k
v : Fin k → Semiterm L μ n
ih : ∀ (a : Fin k), Function.funEqOn (v a).fvar? ε ε' → val s e ε (v a) = val s e ε' (v a)
h : Function.funEqOn (func f v).fvar? ε ε'
⊢ (fun i => val s e ε (v i)) = fun i => val s e ε' (v i)

State before:
case e_a
n n₁ n₂ : ℕ
L : Language
μ : Type v
μ₁ : Type v₁
μ₂ : Type v₂
M : Type w
s : Structure L M
e : Fin n → M
e₁ : Fin n₁ → M
e₂ : Fin n₂ → M
ε : μ → M
ε₁ : μ₁ → M
ε₂ : μ₂ → M
ε' : μ → M
k : ℕ
f : L.Func k
v : Fin k → Semiterm L μ n
ih : ∀ (a : Fin k), Function.funEqOn (v a).fvar? ε ε' → val s e ε (v a) = val s e ε' (v a)
h : Function.funEqOn (func f v).fvar? ε ε'
⊢ (fun i => val s e ε (v i)) = fun i => val s e ε' (v i)
Tactic:
funext i
State after:
case e_a.h
n n₁ n₂ : ℕ
L : Language
μ : Type v
μ₁ : Type v₁
μ₂ : Type v₂
M : Type w
s : Structure L M
e : Fin n → M
e₁ : Fin n₁ → M
e₂ : Fin n₂ → M
ε : μ → M
ε₁ : μ₁ → M
ε₂ : μ₂ → M
ε' : μ → M
k : ℕ
f : L.Func k
v : Fin k → Semiterm L μ n
ih : ∀ (a : Fin k), Function.funEqOn (v a).fvar? ε ε' → val s e ε (v a) = val s e ε' (v a)
h : Function.funEqOn (func f v).fvar? ε ε'
i : Fin k
⊢ val s e ε (v i) = val s e ε' (v i)

State before:
case e_a.h
n n₁ n₂ : ℕ
L : Language
μ : Type v
μ₁ : Type v₁
μ₂ : Type v₂
M : Type w
s : Structure L M
e : Fin n → M
e₁ : Fin n₁ → M
e₂ : Fin n₂ → M
ε : μ → M
ε₁ : μ₁ → M
ε₂ : μ₂ → M
ε' : μ → M
k : ℕ
f : L.Func k
v : Fin k → Semiterm L μ n
ih : ∀ (a : Fin k), Function.funEqOn (v a).fvar? ε ε' → val s e ε (v a) = val s e ε' (v a)
h : Function.funEqOn (func f v).fvar? ε ε'
i : Fin k
⊢ val s e ε (v i) = val s e ε' (v i)
Tactic:
exact ih i (by intro x hx; exact h x (by simp; exact ⟨i, hx⟩))
State after:
no goals

State before:
n n₁ n₂ : ℕ
L : Language
μ : Type v
μ₁ : Type v₁
μ₂ : Type v₂
M : Type w
s : Structure L M
e : Fin n → M
e₁ : Fin n₁ → M
e₂ : Fin n₂ → M
ε : μ → M
ε₁ : μ₁ → M
ε₂ : μ₂ → M
ε' : μ → M
k : ℕ
f : L.Func k
v : Fin k → Semiterm L μ n
ih : ∀ (a : Fin k), Function.funEqOn (v a).fvar? ε ε' → val s e ε (v a) = val s e ε' (v a)
h : Function.funEqOn (func f v).fvar? ε ε'
i : Fin k
⊢ Function.funEqOn (v i).fvar? ε ε'
Tactic:
intro x hx
State after:
n n₁ n₂ : ℕ
L : Language
μ : Type v
μ₁ : Type v₁
μ₂ : Type v₂
M : Type w
s : Structure L M
e : Fin n → M
e₁ : Fin n₁ → M
e₂ : Fin n₂ → M
ε : μ → M
ε₁ : μ₁ → M
ε₂ : μ₂ → M
ε' : μ → M
k : ℕ
f : L.Func k
v : Fin k → Semiterm L μ n
ih : ∀ (a : Fin k), Function.funEqOn (v a).fvar? ε ε' → val s e ε (v a) = val s e ε' (v a)
h : Function.funEqOn (func f v).fvar? ε ε'
i : Fin k
x : μ
hx : (v i).fvar? x
⊢ ε x = ε' x

State before:
n n₁ n₂ : ℕ
L : Language
μ : Type v
μ₁ : Type v₁
μ₂ : Type v₂
M : Type w
s : Structure L M
e : Fin n → M
e₁ : Fin n₁ → M
e₂ : Fin n₂ → M
ε : μ → M
ε₁ : μ₁ → M
ε₂ : μ₂ → M
ε' : μ → M
k : ℕ
f : L.Func k
v : Fin k → Semiterm L μ n
ih : ∀ (a : Fin k), Function.funEqOn (v a).fvar? ε ε' → val s e ε (v a) = val s e ε' (v a)
h : Function.funEqOn (func f v).fvar? ε ε'
i : Fin k
x : μ
hx : (v i).fvar? x
⊢ ε x = ε' x
Tactic:
exact h x (by simp; exact ⟨i, hx⟩)
State after:
no goals

State before:
n n₁ n₂ : ℕ
L : Language
μ : Type v
μ₁ : Type v₁
μ₂ : Type v₂
M : Type w
s : Structure L M
e : Fin n → M
e₁ : Fin n₁ → M
e₂ : Fin n₂ → M
ε : μ → M
ε₁ : μ₁ → M
ε₂ : μ₂ → M
ε' : μ → M
k : ℕ
f : L.Func k
v : Fin k → Semiterm L μ n
ih : ∀ (a : Fin k), Function.funEqOn (v a).fvar? ε ε' → val s e ε (v a) = val s e ε' (v a)
h : Function.funEqOn (func f v).fvar? ε ε'
i : Fin k
x : μ
hx : (v i).fvar? x
⊢ (func f v).fvar? x
Tactic:
simp
State after:
n n₁ n₂ : ℕ
L : Language
μ : Type v
μ₁ : Type v₁
μ₂ : Type v₂
M : Type w
s : Structure L M
e : Fin n → M
e₁ : Fin n₁ → M
e₂ : Fin n₂ → M
ε : μ → M
ε₁ : μ₁ → M
ε₂ : μ₂ → M
ε' : μ → M
k : ℕ
f : L.Func k
v : Fin k → Semiterm L μ n
ih : ∀ (a : Fin k), Function.funEqOn (v a).fvar? ε ε' → val s e ε (v a) = val s e ε' (v a)
h : Function.funEqOn (func f v).fvar? ε ε'
i : Fin k
x : μ
hx : (v i).fvar? x
⊢ ∃ i, x ∈ (v i).fvarList

State before:
n n₁ n₂ : ℕ
L : Language
μ : Type v
μ₁ : Type v₁
μ₂ : Type v₂
M : Type w
s : Structure L M
e : Fin n → M
e₁ : Fin n₁ → M
e₂ : Fin n₂ → M
ε : μ → M
ε₁ : μ₁ → M
ε₂ : μ₂ → M
ε' : μ → M
k : ℕ
f : L.Func k
v : Fin k → Semiterm L μ n
ih : ∀ (a : Fin k), Function.funEqOn (v a).fvar? ε ε' → val s e ε (v a) = val s e ε' (v a)
h : Function.funEqOn (func f v).fvar? ε ε'
i : Fin k
x : μ
hx : (v i).fvar? x
⊢ ∃ i, x ∈ (v i).fvarList
Tactic:
exact ⟨i, hx⟩
State after:
no goals