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_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
M : Type w
inst✝ : L[[α]].Structure M
s : Set α
⊢ M ⊨ L.distinctConstantsTheory s ↔ Set.InjOn (fun i => ↑(L.con i)) s
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
M : Type w
inst✝ : L[[α]].Structure M
s : Set α
⊢ (∀ (φ : L[[α]].Sentence) (x x_1 : α),
      (x, x_1) ∈ s ×ˢ s ∩ (Set.diagonal α)ᶜ → ((L.con x).term.equal (L.con x_1).term).not = φ → M ⊨ φ) ↔
    Set.InjOn (fun i => ↑(L.con i)) s

tactic: refine ⟨fun h a as b bs ab => ?_, ?_⟩
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
M : Type w
inst✝ : L[[α]].Structure M
s : Set α
⊢ (∀ (φ : L[[α]].Sentence) (x x_1 : α),
      (x, x_1) ∈ s ×ˢ s ∩ (Set.diagonal α)ᶜ → ((L.con x).term.equal (L.con x_1).term).not = φ → M ⊨ φ) ↔
    Set.InjOn (fun i => ↑(L.con i)) s
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
M : Type w
inst✝ : L[[α]].Structure M
s : Set α
h :
  ∀ (φ : L[[α]].Sentence) (x x_1 : α),
    (x, x_1) ∈ s ×ˢ s ∩ (Set.diagonal α)ᶜ → ((L.con x).term.equal (L.con x_1).term).not = φ → M ⊨ φ
a : α
as : a ∈ s
b : α
bs : b ∈ s
ab : (fun i => ↑(L.con i)) a = (fun i => ↑(L.con i)) b
⊢ a = b

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
M : Type w
inst✝ : L[[α]].Structure M
s : Set α
⊢ Set.InjOn (fun i => ↑(L.con i)) s →
    ∀ (φ : L[[α]].Sentence) (x x_1 : α),
      (x, x_1) ∈ s ×ˢ s ∩ (Set.diagonal α)ᶜ → ((L.con x).term.equal (L.con x_1).term).not = φ → M ⊨ φ

tactic: contrapose! ab
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
M : Type w
inst✝ : L[[α]].Structure M
s : Set α
h :
  ∀ (φ : L[[α]].Sentence) (x x_1 : α),
    (x, x_1) ∈ s ×ˢ s ∩ (Set.diagonal α)ᶜ → ((L.con x).term.equal (L.con x_1).term).not = φ → M ⊨ φ
a : α
as : a ∈ s
b : α
bs : b ∈ s
ab : (fun i => ↑(L.con i)) a = (fun i => ↑(L.con i)) b
⊢ a = b
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
M : Type w
inst✝ : L[[α]].Structure M
s : Set α
h :
  ∀ (φ : L[[α]].Sentence) (x x_1 : α),
    (x, x_1) ∈ s ×ˢ s ∩ (Set.diagonal α)ᶜ → ((L.con x).term.equal (L.con x_1).term).not = φ → M ⊨ φ
a : α
as : a ∈ s
b : α
bs : b ∈ s
ab : a ≠ b
⊢ ↑(L.con a) ≠ ↑(L.con 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_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
M : Type w
inst✝ : L[[α]].Structure M
s : Set α
h :
  ∀ (φ : L[[α]].Sentence) (x x_1 : α),
    (x, x_1) ∈ s ×ˢ s ∩ (Set.diagonal α)ᶜ → ((L.con x).term.equal (L.con x_1).term).not = φ → M ⊨ φ
a : α
as : a ∈ s
b : α
bs : b ∈ s
ab : a ≠ b
⊢ ↑(L.con a) ≠ ↑(L.con b)
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
M : Type w
inst✝ : L[[α]].Structure M
s : Set α
h :
  ∀ (φ : L[[α]].Sentence) (x x_1 : α),
    (x, x_1) ∈ s ×ˢ s ∩ (Set.diagonal α)ᶜ → ((L.con x).term.equal (L.con x_1).term).not = φ → M ⊨ φ
a : α
as : a ∈ s
b : α
bs : b ∈ s
ab : a ≠ b
h' : M ⊨ ((L.con a).term.equal (L.con b).term).not
⊢ ↑(L.con a) ≠ ↑(L.con 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_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
M : Type w
inst✝ : L[[α]].Structure M
s : Set α
h :
  ∀ (φ : L[[α]].Sentence) (x x_1 : α),
    (x, x_1) ∈ s ×ˢ s ∩ (Set.diagonal α)ᶜ → ((L.con x).term.equal (L.con x_1).term).not = φ → M ⊨ φ
a : α
as : a ∈ s
b : α
bs : b ∈ s
ab : a ≠ b
h' : M ⊨ ((L.con a).term.equal (L.con b).term).not
⊢ ↑(L.con a) ≠ ↑(L.con b)
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
M : Type w
inst✝ : L[[α]].Structure M
s : Set α
h :
  ∀ (φ : L[[α]].Sentence) (x x_1 : α),
    (x, x_1) ∈ s ×ˢ s ∩ (Set.diagonal α)ᶜ → ((L.con x).term.equal (L.con x_1).term).not = φ → M ⊨ φ
a : α
as : a ∈ s
b : α
bs : b ∈ s
ab : a ≠ b
h' : ¬↑(L.con a) = ↑(L.con b)
⊢ ↑(L.con a) ≠ ↑(L.con b)

tactic: exact h'
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
M : Type w
inst✝ : L[[α]].Structure M
s : Set α
h :
  ∀ (φ : L[[α]].Sentence) (x x_1 : α),
    (x, x_1) ∈ s ×ˢ s ∩ (Set.diagonal α)ᶜ → ((L.con x).term.equal (L.con x_1).term).not = φ → M ⊨ φ
a : α
as : a ∈ s
b : α
bs : b ∈ s
ab : a ≠ b
h' : ¬↑(L.con a) = ↑(L.con b)
⊢ ↑(L.con a) ≠ ↑(L.con b)
state_after: no goals

tactic: rintro h φ a b ⟨⟨as, bs⟩, ab⟩ rfl
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
M : Type w
inst✝ : L[[α]].Structure M
s : Set α
⊢ Set.InjOn (fun i => ↑(L.con i)) s →
    ∀ (φ : L[[α]].Sentence) (x x_1 : α),
      (x, x_1) ∈ s ×ˢ s ∩ (Set.diagonal α)ᶜ → ((L.con x).term.equal (L.con x_1).term).not = φ → M ⊨ φ
state_after: case refine_2.intro.intro
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
M : Type w
inst✝ : L[[α]].Structure M
s : Set α
h : Set.InjOn (fun i => ↑(L.con i)) s
a b : α
ab : (a, b) ∈ (Set.diagonal α)ᶜ
as : (a, b).1 ∈ s
bs : (a, b).2 ∈ s
⊢ M ⊨ ((L.con a).term.equal (L.con b).term).not

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_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
M : Type w
inst✝ : L[[α]].Structure M
s : Set α
h : Set.InjOn (fun i => ↑(L.con i)) s
a b : α
ab : (a, b) ∈ (Set.diagonal α)ᶜ
as : (a, b).1 ∈ s
bs : (a, b).2 ∈ s
⊢ M ⊨ ((L.con a).term.equal (L.con b).term).not
state_after: case refine_2.intro.intro
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
M : Type w
inst✝ : L[[α]].Structure M
s : Set α
h : Set.InjOn (fun i => ↑(L.con i)) s
a b : α
ab : (a, b) ∈ (Set.diagonal α)ᶜ
as : (a, b).1 ∈ s
bs : (a, b).2 ∈ s
⊢ ¬↑(L.con a) = ↑(L.con 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_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
M : Type w
inst✝ : L[[α]].Structure M
s : Set α
h : Set.InjOn (fun i => ↑(L.con i)) s
a b : α
ab : (a, b) ∈ (Set.diagonal α)ᶜ
as : (a, b).1 ∈ s
bs : (a, b).2 ∈ s
⊢ ¬↑(L.con a) = ↑(L.con b)
state_after: no goals