Theorem: FirstOrder.Language.model_distinctConstantsTheory
File: Mathlib/ModelTheory/Semantics.lean

tactic: simp only [distinctConstantsTheory, Theory.model_iff, Set.mem_image, Set.mem_inter,
  Set.mem_prod, Set.mem_compl, Prod.exists, forall_exists_index, and_imp]
state_before: L : Language
L' : Language
M✝ : Type w
N : Type ?u.854555
P : Type ?u.854558
inst✝³ : Structure L M✝
inst✝² : Structure L N
inst✝¹ : Structure L P
α : Type u'
β : Type v'
n : ℕ
T : Theory L
M : Type w
inst✝ : Structure (L[[α]]) M
s : Set α
⊢ M ⊨ distinctConstantsTheory L s ↔ Set.InjOn (fun i => ↑(Language.con L i)) s

tactic: refine' ⟨fun h a as b bs ab => _, _⟩
state_before: L : Language
L' : Language
M✝ : Type w
N : Type ?u.854555
P : Type ?u.854558
inst✝³ : Structure L M✝
inst✝² : Structure L N
inst✝¹ : Structure L P
α : Type u'
β : Type v'
n : ℕ
T : Theory L
M : Type w
inst✝ : Structure (L[[α]]) M
s : Set α
⊢ (∀ (φ : Sentence (L[[α]])) (x x_1 : α),
      (x, x_1) ∈ s ×ˢ s ∩ Set.diagonal αᶜ →
        Formula.not (Term.equal (Constants.term (Language.con L x)) (Constants.term (Language.con L x_1))) = φ →
          M ⊨ φ) ↔
    Set.InjOn (fun i => ↑(Language.con L i)) s

tactic: contrapose! ab
state_before: case refine'_1
L : Language
L' : Language
M✝ : Type w
N : Type ?u.854555
P : Type ?u.854558
inst✝³ : Structure L M✝
inst✝² : Structure L N
inst✝¹ : Structure L P
α : Type u'
β : Type v'
n : ℕ
T : Theory L
M : Type w
inst✝ : Structure (L[[α]]) M
s : Set α
h :
  ∀ (φ : Sentence (L[[α]])) (x x_1 : α),
    (x, x_1) ∈ s ×ˢ s ∩ Set.diagonal αᶜ →
      Formula.not (Term.equal (Constants.term (Language.con L x)) (Constants.term (Language.con L x_1))) = φ → M ⊨ φ
a : α
as : a ∈ s
b : α
bs : b ∈ s
ab : (fun i => ↑(Language.con L i)) a = (fun i => ↑(Language.con L i)) b
⊢ a = b

tactic: have h' := h _ a b ⟨⟨as, bs⟩, ab⟩ rfl
state_before: case refine'_1
L : Language
L' : Language
M✝ : Type w
N : Type ?u.854555
P : Type ?u.854558
inst✝³ : Structure L M✝
inst✝² : Structure L N
inst✝¹ : Structure L P
α : Type u'
β : Type v'
n : ℕ
T : Theory L
M : Type w
inst✝ : Structure (L[[α]]) M
s : Set α
h :
  ∀ (φ : Sentence (L[[α]])) (x x_1 : α),
    (x, x_1) ∈ s ×ˢ s ∩ Set.diagonal αᶜ →
      Formula.not (Term.equal (Constants.term (Language.con L x)) (Constants.term (Language.con L x_1))) = φ → M ⊨ φ
a : α
as : a ∈ s
b : α
bs : b ∈ s
ab : a ≠ b
⊢ ↑(Language.con L a) ≠ ↑(Language.con L b)

tactic: simp only [Sentence.Realize, Formula.realize_not, Formula.realize_equal,
  Term.realize_constants] at h'
state_before: case refine'_1
L : Language
L' : Language
M✝ : Type w
N : Type ?u.854555
P : Type ?u.854558
inst✝³ : Structure L M✝
inst✝² : Structure L N
inst✝¹ : Structure L P
α : Type u'
β : Type v'
n : ℕ
T : Theory L
M : Type w
inst✝ : Structure (L[[α]]) M
s : Set α
h :
  ∀ (φ : Sentence (L[[α]])) (x x_1 : α),
    (x, x_1) ∈ s ×ˢ s ∩ Set.diagonal αᶜ →
      Formula.not (Term.equal (Constants.term (Language.con L x)) (Constants.term (Language.con L x_1))) = φ → M ⊨ φ
a : α
as : a ∈ s
b : α
bs : b ∈ s
ab : a ≠ b
h' : M ⊨ Formula.not (Term.equal (Constants.term (Language.con L a)) (Constants.term (Language.con L b)))
⊢ ↑(Language.con L a) ≠ ↑(Language.con L b)

tactic: exact h'
state_before: case refine'_1
L : Language
L' : Language
M✝ : Type w
N : Type ?u.854555
P : Type ?u.854558
inst✝³ : Structure L M✝
inst✝² : Structure L N
inst✝¹ : Structure L P
α : Type u'
β : Type v'
n : ℕ
T : Theory L
M : Type w
inst✝ : Structure (L[[α]]) M
s : Set α
h :
  ∀ (φ : Sentence (L[[α]])) (x x_1 : α),
    (x, x_1) ∈ s ×ˢ s ∩ Set.diagonal αᶜ →
      Formula.not (Term.equal (Constants.term (Language.con L x)) (Constants.term (Language.con L x_1))) = φ → M ⊨ φ
a : α
as : a ∈ s
b : α
bs : b ∈ s
ab : a ≠ b
h' : ¬↑(Language.con L a) = ↑(Language.con L b)
⊢ ↑(Language.con L a) ≠ ↑(Language.con L b)

tactic: rintro h φ a b ⟨⟨as, bs⟩, ab⟩ rfl
state_before: case refine'_2
L : Language
L' : Language
M✝ : Type w
N : Type ?u.854555
P : Type ?u.854558
inst✝³ : Structure L M✝
inst✝² : Structure L N
inst✝¹ : Structure L P
α : Type u'
β : Type v'
n : ℕ
T : Theory L
M : Type w
inst✝ : Structure (L[[α]]) M
s : Set α
⊢ Set.InjOn (fun i => ↑(Language.con L i)) s →
    ∀ (φ : Sentence (L[[α]])) (x x_1 : α),
      (x, x_1) ∈ s ×ˢ s ∩ Set.diagonal αᶜ →
        Formula.not (Term.equal (Constants.term (Language.con L x)) (Constants.term (Language.con L x_1))) = φ → M ⊨ φ

tactic: simp only [Sentence.Realize, Formula.realize_not, Formula.realize_equal, Term.realize_constants]
state_before: case refine'_2.intro.intro
L : Language
L' : Language
M✝ : Type w
N : Type ?u.854555
P : Type ?u.854558
inst✝³ : Structure L M✝
inst✝² : Structure L N
inst✝¹ : Structure L P
α : Type u'
β : Type v'
n : ℕ
T : Theory L
M : Type w
inst✝ : Structure (L[[α]]) M
s : Set α
h : Set.InjOn (fun i => ↑(Language.con L i)) s
a b : α
ab : (a, b) ∈ Set.diagonal αᶜ
as : (a, b).fst ∈ s
bs : (a, b).snd ∈ s
⊢ M ⊨ Formula.not (Term.equal (Constants.term (Language.con L a)) (Constants.term (Language.con L b)))

tactic: exact fun contra => ab (h as bs contra)
state_before: case refine'_2.intro.intro
L : Language
L' : Language
M✝ : Type w
N : Type ?u.854555
P : Type ?u.854558
inst✝³ : Structure L M✝
inst✝² : Structure L N
inst✝¹ : Structure L P
α : Type u'
β : Type v'
n : ℕ
T : Theory L
M : Type w
inst✝ : Structure (L[[α]]) M
s : Set α
h : Set.InjOn (fun i => ↑(Language.con L i)) s
a b : α
ab : (a, b) ∈ Set.diagonal αᶜ
as : (a, b).fst ∈ s
bs : (a, b).snd ∈ s
⊢ ¬↑(Language.con L a) = ↑(Language.con L b)