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

State before:
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈open
p : M
⊢ Pow2 p → p = 1 ∨ ∃ q, p = 2 * q ∧ Pow2 q
Tactic:
intro H
State after:
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈open
p : M
H : Pow2 p
⊢ p = 1 ∨ ∃ q, p = 2 * q ∧ Pow2 q

State before:
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈open
p : M
H : Pow2 p
⊢ p = 1 ∨ ∃ q, p = 2 * q ∧ Pow2 q
Tactic:
by_cases hp : 1 < p
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 ⊧ₘ* 𝐈open
p : M
H : Pow2 p
hp : 1 < p
⊢ p = 1 ∨ ∃ q, p = 2 * q ∧ Pow2 q

case neg
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈open
p : M
H : Pow2 p
hp : ¬1 < p
⊢ p = 1 ∨ ∃ q, p = 2 * q ∧ Pow2 q

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 ⊧ₘ* 𝐈open
p : M
H : Pow2 p
hp : 1 < p
⊢ p = 1 ∨ ∃ q, p = 2 * q ∧ Pow2 q
Tactic:
have : 2 ∣ p := H.two_dvd hp
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 ⊧ₘ* 𝐈open
p : M
H : Pow2 p
hp : 1 < p
this : 2 ∣ p
⊢ p = 1 ∨ ∃ q, p = 2 * q ∧ Pow2 q

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 ⊧ₘ* 𝐈open
p : M
H : Pow2 p
hp : 1 < p
this : 2 ∣ p
⊢ p = 1 ∨ ∃ q, p = 2 * q ∧ Pow2 q
Tactic:
rcases this with ⟨q, rfl⟩
State after:
case pos.intro
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈open
q : M
H : Pow2 (2 * q)
hp : 1 < 2 * q
⊢ 2 * q = 1 ∨ ∃ q_1, 2 * q = 2 * q_1 ∧ Pow2 q_1

State before:
case pos.intro
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈open
q : M
H : Pow2 (2 * q)
hp : 1 < 2 * q
⊢ 2 * q = 1 ∨ ∃ q_1, 2 * q = 2 * q_1 ∧ Pow2 q_1
Tactic:
right
State after:
case pos.intro.h
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈open
q : M
H : Pow2 (2 * q)
hp : 1 < 2 * q
⊢ ∃ q_1, 2 * q = 2 * q_1 ∧ Pow2 q_1

State before:
case pos.intro.h
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈open
q : M
H : Pow2 (2 * q)
hp : 1 < 2 * q
⊢ ∃ q_1, 2 * q = 2 * q_1 ∧ Pow2 q_1
Tactic:
exact ⟨q, rfl, pow2_mul_two.mp H⟩
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 ⊧ₘ* 𝐈open
p : M
H : Pow2 p
hp : ¬1 < p
⊢ p = 1 ∨ ∃ q, p = 2 * q ∧ Pow2 q
Tactic:
have : p = 1 := le_antisymm (by simpa using hp) (pos_iff_one_le.mp H.pos)
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 ⊧ₘ* 𝐈open
p : M
H : Pow2 p
hp : ¬1 < p
this : p = 1
⊢ p = 1 ∨ ∃ q, p = 2 * q ∧ Pow2 q

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 ⊧ₘ* 𝐈open
p : M
H : Pow2 p
hp : ¬1 < p
this : p = 1
⊢ p = 1 ∨ ∃ q, p = 2 * q ∧ Pow2 q
Tactic:
left
State after:
case neg.h
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈open
p : M
H : Pow2 p
hp : ¬1 < p
this : p = 1
⊢ p = 1

State before:
case neg.h
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈open
p : M
H : Pow2 p
hp : ¬1 < p
this : p = 1
⊢ p = 1
Tactic:
exact this
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 ⊧ₘ* 𝐈open
p : M
H : Pow2 p
hp : ¬1 < p
⊢ p ≤ 1
Tactic:
simpa using hp
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 ⊧ₘ* 𝐈open
p : M
⊢ (p = 1 ∨ ∃ q, p = 2 * q ∧ Pow2 q) → Pow2 p
Tactic:
rintro (rfl | ⟨q, rfl, hq⟩) <;> simp [pow2_one, pow2_mul_two, *]
State after:
no goals