Theorem: LO.FirstOrder.Arith.Model.sqrt_exists_unique (Arithmetization/Basic/IOpen.lean)

State before:
M : Type u_1
inst✝⁶ : Zero M
inst✝⁵ : One M
inst✝⁴ : Add M
inst✝³ : Mul M
inst✝² : LT M
inst✝¹ : M ⊧ₘ* 𝐏𝐀⁻
inst✝ : M ⊧ₘ* 𝐈open
a : M
⊢ ∃! x, x * x ≤ a ∧ a < (x + 1) * (x + 1)
Tactic:
have : ∃ x, x * x ≤ a ∧ a < (x + 1) * (x + 1) := by
  have : a < (a + 1) * (a + 1) → ∃ x, x * x ≤ a ∧ a < (x + 1) * (x + 1) := by
    simpa using open_leastNumber (P := λ x ↦ x * x ≤ a) ⟨“x | x * x ≤ &a”, by simp, by simp⟩
  have hn : a < (a + 1) * (a + 1) := calc
    a ≤ a * a             := le_mul_self a
    _ < a * a + 1         := lt_add_one (a * a)
    _ ≤ (a + 1) * (a + 1) := by simp [add_mul_self_eq]
  exact this hn
State after:
M : Type u_1
inst✝⁶ : Zero M
inst✝⁵ : One M
inst✝⁴ : Add M
inst✝³ : Mul M
inst✝² : LT M
inst✝¹ : M ⊧ₘ* 𝐏𝐀⁻
inst✝ : M ⊧ₘ* 𝐈open
a : M
this : ∃ x, x * x ≤ a ∧ a < (x + 1) * (x + 1)
⊢ ∃! x, x * x ≤ a ∧ a < (x + 1) * (x + 1)

State before:
M : Type u_1
inst✝⁶ : Zero M
inst✝⁵ : One M
inst✝⁴ : Add M
inst✝³ : Mul M
inst✝² : LT M
inst✝¹ : M ⊧ₘ* 𝐏𝐀⁻
inst✝ : M ⊧ₘ* 𝐈open
a : M
this : ∃ x, x * x ≤ a ∧ a < (x + 1) * (x + 1)
⊢ ∃! x, x * x ≤ a ∧ a < (x + 1) * (x + 1)
Tactic:
rcases this with ⟨x, hx⟩
State after:
case intro
M : Type u_1
inst✝⁶ : Zero M
inst✝⁵ : One M
inst✝⁴ : Add M
inst✝³ : Mul M
inst✝² : LT M
inst✝¹ : M ⊧ₘ* 𝐏𝐀⁻
inst✝ : M ⊧ₘ* 𝐈open
a x : M
hx : x * x ≤ a ∧ a < (x + 1) * (x + 1)
⊢ ∃! x, x * x ≤ a ∧ a < (x + 1) * (x + 1)

State before:
M : Type u_1
inst✝⁶ : Zero M
inst✝⁵ : One M
inst✝⁴ : Add M
inst✝³ : Mul M
inst✝² : LT M
inst✝¹ : M ⊧ₘ* 𝐏𝐀⁻
inst✝ : M ⊧ₘ* 𝐈open
a : M
⊢ ∃ x, x * x ≤ a ∧ a < (x + 1) * (x + 1)
Tactic:
have : a < (a + 1) * (a + 1) → ∃ x, x * x ≤ a ∧ a < (x + 1) * (x + 1) := by
  simpa using open_leastNumber (P := λ x ↦ x * x ≤ a) ⟨“x | x * x ≤ &a”, by simp, by simp⟩
State after:
M : Type u_1
inst✝⁶ : Zero M
inst✝⁵ : One M
inst✝⁴ : Add M
inst✝³ : Mul M
inst✝² : LT M
inst✝¹ : M ⊧ₘ* 𝐏𝐀⁻
inst✝ : M ⊧ₘ* 𝐈open
a : M
this : a < (a + 1) * (a + 1) → ∃ x, x * x ≤ a ∧ a < (x + 1) * (x + 1)
⊢ ∃ x, x * x ≤ a ∧ a < (x + 1) * (x + 1)

State before:
M : Type u_1
inst✝⁶ : Zero M
inst✝⁵ : One M
inst✝⁴ : Add M
inst✝³ : Mul M
inst✝² : LT M
inst✝¹ : M ⊧ₘ* 𝐏𝐀⁻
inst✝ : M ⊧ₘ* 𝐈open
a : M
this : a < (a + 1) * (a + 1) → ∃ x, x * x ≤ a ∧ a < (x + 1) * (x + 1)
⊢ ∃ x, x * x ≤ a ∧ a < (x + 1) * (x + 1)
Tactic:
have hn : a < (a + 1) * (a + 1) := calc
  a ≤ a * a             := le_mul_self a
  _ < a * a + 1         := lt_add_one (a * a)
  _ ≤ (a + 1) * (a + 1) := by simp [add_mul_self_eq]
State after:
M : Type u_1
inst✝⁶ : Zero M
inst✝⁵ : One M
inst✝⁴ : Add M
inst✝³ : Mul M
inst✝² : LT M
inst✝¹ : M ⊧ₘ* 𝐏𝐀⁻
inst✝ : M ⊧ₘ* 𝐈open
a : M
this : a < (a + 1) * (a + 1) → ∃ x, x * x ≤ a ∧ a < (x + 1) * (x + 1)
hn : a < (a + 1) * (a + 1)
⊢ ∃ x, x * x ≤ a ∧ a < (x + 1) * (x + 1)

State before:
M : Type u_1
inst✝⁶ : Zero M
inst✝⁵ : One M
inst✝⁴ : Add M
inst✝³ : Mul M
inst✝² : LT M
inst✝¹ : M ⊧ₘ* 𝐏𝐀⁻
inst✝ : M ⊧ₘ* 𝐈open
a : M
this : a < (a + 1) * (a + 1) → ∃ x, x * x ≤ a ∧ a < (x + 1) * (x + 1)
hn : a < (a + 1) * (a + 1)
⊢ ∃ x, x * x ≤ a ∧ a < (x + 1) * (x + 1)
Tactic:
exact this hn
State after:
no goals

State before:
M : Type u_1
inst✝⁶ : Zero M
inst✝⁵ : One M
inst✝⁴ : Add M
inst✝³ : Mul M
inst✝² : LT M
inst✝¹ : M ⊧ₘ* 𝐏𝐀⁻
inst✝ : M ⊧ₘ* 𝐈open
a : M
⊢ a < (a + 1) * (a + 1) → ∃ x, x * x ≤ a ∧ a < (x + 1) * (x + 1)
Tactic:
simpa using open_leastNumber (P := λ x ↦ x * x ≤ a) ⟨“x | x * x ≤ &a”, by simp, by simp⟩
State after:
no goals

State before:
M : Type u_1
inst✝⁶ : Zero M
inst✝⁵ : One M
inst✝⁴ : Add M
inst✝³ : Mul M
inst✝² : LT M
inst✝¹ : M ⊧ₘ* 𝐏𝐀⁻
inst✝ : M ⊧ₘ* 𝐈open
a : M
⊢ “(#0 * #0) ≤ &a”.Open
Tactic:
simp
State after:
no goals

State before:
M : Type u_1
inst✝⁶ : Zero M
inst✝⁵ : One M
inst✝⁴ : Add M
inst✝³ : Mul M
inst✝² : LT M
inst✝¹ : M ⊧ₘ* 𝐏𝐀⁻
inst✝ : M ⊧ₘ* 𝐈open
a : M
⊢ ∀ (x : M), (fun x => x * x ≤ a) x ↔ (Semiformula.Evalm M ![x] id) (“(#0 * #0) ≤ &a”)
Tactic:
simp
State after:
no goals

State before:
M : Type u_1
inst✝⁶ : Zero M
inst✝⁵ : One M
inst✝⁴ : Add M
inst✝³ : Mul M
inst✝² : LT M
inst✝¹ : M ⊧ₘ* 𝐏𝐀⁻
inst✝ : M ⊧ₘ* 𝐈open
a : M
this : a < (a + 1) * (a + 1) → ∃ x, x * x ≤ a ∧ a < (x + 1) * (x + 1)
⊢ a * a + 1 ≤ (a + 1) * (a + 1)
Tactic:
simp [add_mul_self_eq]
State after:
no goals

State before:
M : Type u_1
inst✝⁶ : Zero M
inst✝⁵ : One M
inst✝⁴ : Add M
inst✝³ : Mul M
inst✝² : LT M
inst✝¹ : M ⊧ₘ* 𝐏𝐀⁻
inst✝ : M ⊧ₘ* 𝐈open
a x : M
hx : x * x ≤ a ∧ a < (x + 1) * (x + 1)
⊢ ∀ (y : M), y * y ≤ a ∧ a < (y + 1) * (y + 1) → y = x
Tactic:
intro y hy
State after:
M : Type u_1
inst✝⁶ : Zero M
inst✝⁵ : One M
inst✝⁴ : Add M
inst✝³ : Mul M
inst✝² : LT M
inst✝¹ : M ⊧ₘ* 𝐏𝐀⁻
inst✝ : M ⊧ₘ* 𝐈open
a x : M
hx : x * x ≤ a ∧ a < (x + 1) * (x + 1)
y : M
hy : y * y ≤ a ∧ a < (y + 1) * (y + 1)
⊢ y = x

State before:
M : Type u_1
inst✝⁶ : Zero M
inst✝⁵ : One M
inst✝⁴ : Add M
inst✝³ : Mul M
inst✝² : LT M
inst✝¹ : M ⊧ₘ* 𝐏𝐀⁻
inst✝ : M ⊧ₘ* 𝐈open
a x : M
hx : x * x ≤ a ∧ a < (x + 1) * (x + 1)
y : M
hy : y * y ≤ a ∧ a < (y + 1) * (y + 1)
⊢ y = x
Tactic:
by_contra ne
State after:
M : Type u_1
inst✝⁶ : Zero M
inst✝⁵ : One M
inst✝⁴ : Add M
inst✝³ : Mul M
inst✝² : LT M
inst✝¹ : M ⊧ₘ* 𝐏𝐀⁻
inst✝ : M ⊧ₘ* 𝐈open
a x : M
hx : x * x ≤ a ∧ a < (x + 1) * (x + 1)
y : M
hy : y * y ≤ a ∧ a < (y + 1) * (y + 1)
ne : ¬y = x
⊢ False

State before:
M : Type u_1
inst✝⁶ : Zero M
inst✝⁵ : One M
inst✝⁴ : Add M
inst✝³ : Mul M
inst✝² : LT M
inst✝¹ : M ⊧ₘ* 𝐏𝐀⁻
inst✝ : M ⊧ₘ* 𝐈open
a x : M
hx : x * x ≤ a ∧ a < (x + 1) * (x + 1)
y : M
hy : y * y ≤ a ∧ a < (y + 1) * (y + 1)
ne : ¬y = x
⊢ False
Tactic:
wlog lt : x < y
State after:
case inr
M : Type u_1
inst✝⁶ : Zero M
inst✝⁵ : One M
inst✝⁴ : Add M
inst✝³ : Mul M
inst✝² : LT M
inst✝¹ : M ⊧ₘ* 𝐏𝐀⁻
inst✝ : M ⊧ₘ* 𝐈open
a x : M
hx : x * x ≤ a ∧ a < (x + 1) * (x + 1)
y : M
hy : y * y ≤ a ∧ a < (y + 1) * (y + 1)
ne : ¬y = x
this :
  ∀ {M : Type u_1} [inst : Zero M] [inst_1 : One M] [inst_2 : Add M] [inst_3 : Mul M] [inst_4 : LT M]
    [inst_5 : M ⊧ₘ* 𝐏𝐀⁻] [inst : M ⊧ₘ* 𝐈open] (a x : M),
    x * x ≤ a ∧ a < (x + 1) * (x + 1) → ∀ (y : M), y * y ≤ a ∧ a < (y + 1) * (y + 1) → ¬y = x → x < y → False
lt : ¬x < y
⊢ False

M✝ : Type u_1
inst✝¹⁰ : One M✝
inst✝⁹ : Add M✝
inst✝⁸ : Mul M✝
inst✝⁷ : LT M✝
M : Type u_1
inst✝⁶ : Zero M
inst✝⁵ : One M
inst✝⁴ : Add M
inst✝³ : Mul M
inst✝² : LT M
inst✝¹ : M ⊧ₘ* 𝐏𝐀⁻
inst✝ : M ⊧ₘ* 𝐈open
a x : M
hx : x * x ≤ a ∧ a < (x + 1) * (x + 1)
y : M
hy : y * y ≤ a ∧ a < (y + 1) * (y + 1)
ne : ¬y = x
lt : x < y
⊢ False

State before:
M✝ : Type u_1
inst✝¹⁰ : One M✝
inst✝⁹ : Add M✝
inst✝⁸ : Mul M✝
inst✝⁷ : LT M✝
M : Type u_1
inst✝⁶ : Zero M
inst✝⁵ : One M
inst✝⁴ : Add M
inst✝³ : Mul M
inst✝² : LT M
inst✝¹ : M ⊧ₘ* 𝐏𝐀⁻
inst✝ : M ⊧ₘ* 𝐈open
a x : M
hx : x * x ≤ a ∧ a < (x + 1) * (x + 1)
y : M
hy : y * y ≤ a ∧ a < (y + 1) * (y + 1)
ne : ¬y = x
lt : x < y
⊢ False
Tactic:
have : a < a := calc
  a < (x + 1) * (x + 1) := hx.2
  _ ≤ y * y             := mul_self_le_mul_self (by simp) (lt_iff_succ_le.mp lt)
  _ ≤ a                 := hy.1
State after:
M✝ : Type u_1
inst✝¹⁰ : One M✝
inst✝⁹ : Add M✝
inst✝⁸ : Mul M✝
inst✝⁷ : LT M✝
M : Type u_1
inst✝⁶ : Zero M
inst✝⁵ : One M
inst✝⁴ : Add M
inst✝³ : Mul M
inst✝² : LT M
inst✝¹ : M ⊧ₘ* 𝐏𝐀⁻
inst✝ : M ⊧ₘ* 𝐈open
a x : M
hx : x * x ≤ a ∧ a < (x + 1) * (x + 1)
y : M
hy : y * y ≤ a ∧ a < (y + 1) * (y + 1)
ne : ¬y = x
lt : x < y
this : a < a
⊢ False

State before:
M✝ : Type u_1
inst✝¹⁰ : One M✝
inst✝⁹ : Add M✝
inst✝⁸ : Mul M✝
inst✝⁷ : LT M✝
M : Type u_1
inst✝⁶ : Zero M
inst✝⁵ : One M
inst✝⁴ : Add M
inst✝³ : Mul M
inst✝² : LT M
inst✝¹ : M ⊧ₘ* 𝐏𝐀⁻
inst✝ : M ⊧ₘ* 𝐈open
a x : M
hx : x * x ≤ a ∧ a < (x + 1) * (x + 1)
y : M
hy : y * y ≤ a ∧ a < (y + 1) * (y + 1)
ne : ¬y = x
lt : x < y
this : a < a
⊢ False
Tactic:
simp at this
State after:
no goals

State before:
case inr
M : Type u_1
inst✝⁶ : Zero M
inst✝⁵ : One M
inst✝⁴ : Add M
inst✝³ : Mul M
inst✝² : LT M
inst✝¹ : M ⊧ₘ* 𝐏𝐀⁻
inst✝ : M ⊧ₘ* 𝐈open
a x : M
hx : x * x ≤ a ∧ a < (x + 1) * (x + 1)
y : M
hy : y * y ≤ a ∧ a < (y + 1) * (y + 1)
ne : ¬y = x
this :
  ∀ {M : Type u_1} [inst : Zero M] [inst_1 : One M] [inst_2 : Add M] [inst_3 : Mul M] [inst_4 : LT M]
    [inst_5 : M ⊧ₘ* 𝐏𝐀⁻] [inst : M ⊧ₘ* 𝐈open] (a x : M),
    x * x ≤ a ∧ a < (x + 1) * (x + 1) → ∀ (y : M), y * y ≤ a ∧ a < (y + 1) * (y + 1) → ¬y = x → x < y → False
lt : ¬x < y
⊢ False
Tactic:
exact this a y hy x hx (Ne.symm ne) (Ne.lt_of_le ne $ by simpa using lt)
State after:
no goals

State before:
M : Type u_1
inst✝⁶ : Zero M
inst✝⁵ : One M
inst✝⁴ : Add M
inst✝³ : Mul M
inst✝² : LT M
inst✝¹ : M ⊧ₘ* 𝐏𝐀⁻
inst✝ : M ⊧ₘ* 𝐈open
a x : M
hx : x * x ≤ a ∧ a < (x + 1) * (x + 1)
y : M
hy : y * y ≤ a ∧ a < (y + 1) * (y + 1)
ne : ¬y = x
this :
  ∀ {M : Type u_1} [inst : Zero M] [inst_1 : One M] [inst_2 : Add M] [inst_3 : Mul M] [inst_4 : LT M]
    [inst_5 : M ⊧ₘ* 𝐏𝐀⁻] [inst : M ⊧ₘ* 𝐈open] (a x : M),
    x * x ≤ a ∧ a < (x + 1) * (x + 1) → ∀ (y : M), y * y ≤ a ∧ a < (y + 1) * (y + 1) → ¬y = x → x < y → False
lt : ¬x < y
⊢ y ≤ x
Tactic:
simpa using lt
State after:
no goals

State before:
M✝ : Type u_1
inst✝¹⁰ : One M✝
inst✝⁹ : Add M✝
inst✝⁸ : Mul M✝
inst✝⁷ : LT M✝
M : Type u_1
inst✝⁶ : Zero M
inst✝⁵ : One M
inst✝⁴ : Add M
inst✝³ : Mul M
inst✝² : LT M
inst✝¹ : M ⊧ₘ* 𝐏𝐀⁻
inst✝ : M ⊧ₘ* 𝐈open
a x : M
hx : x * x ≤ a ∧ a < (x + 1) * (x + 1)
y : M
hy : y * y ≤ a ∧ a < (y + 1) * (y + 1)
ne : ¬y = x
lt : x < y
⊢ 0 ≤ x + 1
Tactic:
simp
State after:
no goals