Theorem: LO.FirstOrder.Arith.Model.PPow2.elim (Arithmetization/ISigmaZero/Exponential/PPow2.lean)

State before:
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀
i : M
⊢ PPow2 i ↔ i = 2 ∨ ∃ b, i = b ^ 2 ∧ PPow2 b
Tactic:
by_cases ei : i = 2
State after:
case pos
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀
i : M
ei : i = 2
⊢ PPow2 i ↔ i = 2 ∨ ∃ b, i = b ^ 2 ∧ PPow2 b

case neg
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀
i : M
ei : ¬i = 2
⊢ PPow2 i ↔ i = 2 ∨ ∃ b, i = b ^ 2 ∧ PPow2 b

State before:
case pos
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀
i : M
ei : i = 2
⊢ PPow2 i ↔ i = 2 ∨ ∃ b, i = b ^ 2 ∧ PPow2 b
Tactic:
rcases ei with rfl
State after:
case pos
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀
⊢ PPow2 2 ↔ 2 = 2 ∨ ∃ b, 2 = b ^ 2 ∧ PPow2 b

State before:
case pos
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀
⊢ PPow2 2 ↔ 2 = 2 ∨ ∃ b, 2 = b ^ 2 ∧ PPow2 b
Tactic:
simp
State after:
no goals

State before:
case neg
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀
i : M
ei : ¬i = 2
⊢ PPow2 i ↔ i = 2 ∨ ∃ b, i = b ^ 2 ∧ PPow2 b
Tactic:
simp [ei]
State after:
case neg
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀
i : M
ei : ¬i = 2
⊢ PPow2 i ↔ ∃ b, i = b ^ 2 ∧ PPow2 b

State before:
case neg
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀
i : M
ei : ¬i = 2
⊢ PPow2 i ↔ ∃ b, i = b ^ 2 ∧ PPow2 b
Tactic:
constructor
State after:
case neg.mp
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀
i : M
ei : ¬i = 2
⊢ PPow2 i → ∃ b, i = b ^ 2 ∧ PPow2 b

case neg.mpr
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀
i : M
ei : ¬i = 2
⊢ (∃ b, i = b ^ 2 ∧ PPow2 b) → PPow2 i

State before:
case neg.mp
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀
i : M
ei : ¬i = 2
⊢ PPow2 i → ∃ b, i = b ^ 2 ∧ PPow2 b
Tactic:
rintro ppi
State after:
case neg.mp
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀
i : M
ei : ¬i = 2
ppi : PPow2 i
⊢ ∃ b, i = b ^ 2 ∧ PPow2 b

State before:
case neg.mp
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀
i : M
ei : ¬i = 2
ppi : PPow2 i
⊢ ∃ b, i = b ^ 2 ∧ PPow2 b
Tactic:
exact ⟨√i, Eq.symm <| ppi.sq_sqrt_eq ei, ppi.sqrt ei⟩
State after:
no goals

State before:
case neg.mpr
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀
i : M
ei : ¬i = 2
⊢ (∃ b, i = b ^ 2 ∧ PPow2 b) → PPow2 i
Tactic:
rintro ⟨j, rfl, ppj⟩
State after:
case neg.mpr.intro.intro
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀
j : M
ppj : PPow2 j
ei : ¬j ^ 2 = 2
⊢ PPow2 (j ^ 2)

State before:
case neg.mpr.intro.intro
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀
j : M
ppj : PPow2 j
ei : ¬j ^ 2 = 2
⊢ PPow2 (j ^ 2)
Tactic:
exact ppj.sq
State after:
no goals