Theorem: LO.FirstOrder.Arith.Model.Pow2.mul_add_lt_of_mul_lt_of_pos (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 ⊧ₘ* 𝐈𝚫₀
a b p q : M
hp : Pow2 p
hq : Pow2 q
h : a * p < q
hb : b < p
hbq : b < q
⊢ a * p + b < q
Tactic:
rcases zero_le a with (rfl | pos)
State after:
case inl
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀
b p q : M
hp : Pow2 p
hq : Pow2 q
hb : b < p
hbq : b < q
h : 0 * p < q
⊢ 0 * p + b < q

case inr
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀
a b p q : M
hp : Pow2 p
hq : Pow2 q
h : a * p < q
hb : b < p
hbq : b < q
pos : 0 < a
⊢ a * p + b < q

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 ⊧ₘ* 𝐈𝚫₀
a b p q : M
hp : Pow2 p
hq : Pow2 q
h : a * p < q
hb : b < p
hbq : b < q
pos : 0 < a
⊢ a * p + b < q
Tactic:
have : p ∣ q :=
  dvd_of_le hp hq (le_of_lt $
    lt_of_mul_lt_of_one_le_of_nonneg_left (by simpa [mul_comm a p] using h) (pos_iff_one_le.mp pos) (by simp))
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 ⊧ₘ* 𝐈𝚫₀
a b p q : M
hp : Pow2 p
hq : Pow2 q
h : a * p < q
hb : b < p
hbq : b < q
pos : 0 < a
this : p ∣ q
⊢ a * p + b < q

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 ⊧ₘ* 𝐈𝚫₀
a b p q : M
hp : Pow2 p
hq : Pow2 q
h : a * p < q
hb : b < p
hbq : b < q
pos : 0 < a
this : p ∣ q
⊢ a * p + b < q
Tactic:
rcases this with ⟨q, rfl⟩
State after:
case inr.intro
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀
a b p : M
hp : Pow2 p
hb : b < p
pos : 0 < a
q : M
hq : Pow2 (p * q)
h : a * p < p * q
hbq : b < p * q
⊢ a * p + b < p * q

State before:
case inr.intro
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀
a b p : M
hp : Pow2 p
hb : b < p
pos : 0 < a
q : M
hq : Pow2 (p * q)
h : a * p < p * q
hbq : b < p * q
⊢ a * p + b < p * q
Tactic:
have : a < q := lt_of_mul_lt_mul_right (a := p) (by simpa [mul_comm] using h)
State after:
case inr.intro
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀
a b p : M
hp : Pow2 p
hb : b < p
pos : 0 < a
q : M
hq : Pow2 (p * q)
h : a * p < p * q
hbq : b < p * q
this : a < q
⊢ a * p + b < p * q

State before:
case inr.intro
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀
a b p : M
hp : Pow2 p
hb : b < p
pos : 0 < a
q : M
hq : Pow2 (p * q)
h : a * p < p * q
hbq : b < p * q
this : a < q
⊢ a * p + b < p * q
Tactic:
calc
  a * p + b < (a + 1) * p := by simp [add_mul, hb]
  _         ≤ p * q       := by simp [mul_comm p q]; exact mul_le_mul_right (lt_iff_succ_le.mp this)
State after:
no goals

State before:
case inl
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀
b p q : M
hp : Pow2 p
hq : Pow2 q
hb : b < p
hbq : b < q
h : 0 * p < q
⊢ 0 * p + b < q
Tactic:
simp [hbq]
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 ⊧ₘ* 𝐈𝚫₀
a b p q : M
hp : Pow2 p
hq : Pow2 q
h : a * p < q
hb : b < p
hbq : b < q
pos : 0 < a
⊢ p * a < q
Tactic:
simpa [mul_comm a p] using h
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 ⊧ₘ* 𝐈𝚫₀
a b p q : M
hp : Pow2 p
hq : Pow2 q
h : a * p < q
hb : b < p
hbq : b < q
pos : 0 < a
⊢ 0 ≤ p
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 ⊧ₘ* 𝐈𝚫₀
a b p : M
hp : Pow2 p
hb : b < p
pos : 0 < a
q : M
hq : Pow2 (p * q)
h : a * p < p * q
hbq : b < p * q
⊢ a * p < q * p
Tactic:
simpa [mul_comm] using h
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 ⊧ₘ* 𝐈𝚫₀
a b p : M
hp : Pow2 p
hb : b < p
pos : 0 < a
q : M
hq : Pow2 (p * q)
h : a * p < p * q
hbq : b < p * q
this : a < q
⊢ a * p + b < (a + 1) * p
Tactic:
simp [add_mul, hb]
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 ⊧ₘ* 𝐈𝚫₀
a b p : M
hp : Pow2 p
hb : b < p
pos : 0 < a
q : M
hq : Pow2 (p * q)
h : a * p < p * q
hbq : b < p * q
this : a < q
⊢ (a + 1) * p ≤ p * q
Tactic:
simp [mul_comm p q]
State after:
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀
a b p : M
hp : Pow2 p
hb : b < p
pos : 0 < a
q : M
hq : Pow2 (p * q)
h : a * p < p * q
hbq : b < p * q
this : a < q
⊢ (a + 1) * p ≤ q * p

State before:
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀
a b p : M
hp : Pow2 p
hb : b < p
pos : 0 < a
q : M
hq : Pow2 (p * q)
h : a * p < p * q
hbq : b < p * q
this : a < q
⊢ (a + 1) * p ≤ q * p
Tactic:
exact mul_le_mul_right (lt_iff_succ_le.mp this)
State after:
no goals