Theorem: FirstOrder.Language.ElementaryEmbedding.injective
File: Mathlib/ModelTheory/ElementaryMaps.lean

Proof steps:
state_before: L : Language
M : Type u_1
N : Type u_2
P : Type u_3
Q : Type u_4
inst✝³ : L.Structure M
inst✝² : L.Structure N
inst✝¹ : L.Structure P
inst✝ : L.Structure Q
φ : M ↪ₑ[L] N
⊢ Function.Injective ⇑φ
state_after: L : Language
M : Type u_1
N : Type u_2
P : Type u_3
Q : Type u_4
inst✝³ : L.Structure M
inst✝² : L.Structure N
inst✝¹ : L.Structure P
inst✝ : L.Structure Q
φ : M ↪ₑ[L] N
x y : M
⊢ φ x = φ y → x = y
tactic: intro x y
state_before: L : Language
M : Type u_1
N : Type u_2
P : Type u_3
Q : Type u_4
inst✝³ : L.Structure M
inst✝² : L.Structure N
inst✝¹ : L.Structure P
inst✝ : L.Structure Q
φ : M ↪ₑ[L] N
x y : M
⊢ φ x = φ y → x = y
state_after: L : Language
M : Type u_1
N : Type u_2
P : Type u_3
Q : Type u_4
inst✝³ : L.Structure M
inst✝² : L.Structure N
inst✝¹ : L.Structure P
inst✝ : L.Structure Q
φ : M ↪ₑ[L] N
x y : M
h :
  ((var 0).equal (var 1)).Realize (⇑φ ∘ fun i => if i = 0 then x else y) ↔
    ((var 0).equal (var 1)).Realize fun i => if i = 0 then x else y
⊢ φ x = φ y → x = y
tactic: have h :=
    φ.map_formula ((var 0).equal (var 1) : L.Formula (Fin 2)) fun i => if i = 0 then x else y
state_before: L : Language
M : Type u_1
N : Type u_2
P : Type u_3
Q : Type u_4
inst✝³ : L.Structure M
inst✝² : L.Structure N
inst✝¹ : L.Structure P
inst✝ : L.Structure Q
φ : M ↪ₑ[L] N
x y : M
h :
  ((var 0).equal (var 1)).Realize (⇑φ ∘ fun i => if i = 0 then x else y) ↔
    ((var 0).equal (var 1)).Realize fun i => if i = 0 then x else y
⊢ φ x = φ y → x = y
state_after: L : Language
M : Type u_1
N : Type u_2
P : Type u_3
Q : Type u_4
inst✝³ : L.Structure M
inst✝² : L.Structure N
inst✝¹ : L.Structure P
inst✝ : L.Structure Q
φ : M ↪ₑ[L] N
x y : M
h :
  Term.realize (⇑φ ∘ fun i => if i = 0 then x else y) (var 0) =
      Term.realize (⇑φ ∘ fun i => if i = 0 then x else y) (var 1) ↔
    Term.realize (fun i => if i = 0 then x else y) (var 0) = Term.realize (fun i => if i = 0 then x else y) (var 1)
⊢ φ x = φ y → x = y
tactic: rw [Formula.realize_equal, Formula.realize_equal] at h
state_before: L : Language
M : Type u_1
N : Type u_2
P : Type u_3
Q : Type u_4
inst✝³ : L.Structure M
inst✝² : L.Structure N
inst✝¹ : L.Structure P
inst✝ : L.Structure Q
φ : M ↪ₑ[L] N
x y : M
h :
  Term.realize (⇑φ ∘ fun i => if i = 0 then x else y) (var 0) =
      Term.realize (⇑φ ∘ fun i => if i = 0 then x else y) (var 1) ↔
    Term.realize (fun i => if i = 0 then x else y) (var 0) = Term.realize (fun i => if i = 0 then x else y) (var 1)
⊢ φ x = φ y → x = y
state_after: L : Language
M : Type u_1
N : Type u_2
P : Type u_3
Q : Type u_4
inst✝³ : L.Structure M
inst✝² : L.Structure N
inst✝¹ : L.Structure P
inst✝ : L.Structure Q
φ : M ↪ₑ[L] N
x y : M
h : φ x = φ (if 2 = 1 then x else y) ↔ x = if 2 = 1 then x else y
⊢ φ x = φ y → x = y
tactic: simp only [Nat.one_ne_zero, Term.realize, Fin.one_eq_zero_iff, if_true, eq_self_iff_true,
    Function.comp_apply, if_false] at h
state_before: L : Language
M : Type u_1
N : Type u_2
P : Type u_3
Q : Type u_4
inst✝³ : L.Structure M
inst✝² : L.Structure N
inst✝¹ : L.Structure P
inst✝ : L.Structure Q
φ : M ↪ₑ[L] N
x y : M
h : φ x = φ (if 2 = 1 then x else y) ↔ x = if 2 = 1 then x else y
⊢ φ x = φ y → x = y
state_after: no goals
tactic: exact h.1