internlm/Lean-Github huggingface dataset:
Theorem: LO.FirstOrder.Arith.Model.LenBit.add_self_of_not_lenbit
Proof state before:
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈open
a i : M
pos : 0 < i
h : ¬LenBit i a
this : a / i % 2 = 0
⊢ (a / i + 1) % 2 = 1
Tactic:
rw [mod_add] <;> simp [this, one_lt_two]
Proof state after:
no goals
Theorem: LO.FirstOrder.Arith.Model.LenBit.add_self_of_not_lenbit
Proof state before:
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈open
a i : M
pos : 0 < i
h : ¬LenBit i a
⊢ a / i % 2 = 0
Tactic:
simpa [LenBit.iff_rem] using h
Proof state after:
no goals
Theorem: LO.FirstOrder.Arith.Model.LenBit.add_self_of_lenbit
Proof state before:
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈open
a i : M
pos : 0 < i
h : LenBit i a
⊢ ¬LenBit i (a + i)
Tactic:
have : a / i % 2 = 1 := by simpa [LenBit.iff_rem] using h
Proof state after:
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈open
a i : M
pos : 0 < i
h : LenBit i a
this : a / i % 2 = 1
⊢ ¬LenBit i (a + i)
Theorem: LO.FirstOrder.Arith.Model.LenBit.add_self_of_lenbit
Proof state before:
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈open
a i : M
pos : 0 < i
h : LenBit i a
this : a / i % 2 = 1
⊢ ¬LenBit i (a + i)
Tactic:
simp [LenBit.iff_rem, div_add_self_right, pos]
Proof state after:
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈open
a i : M
pos : 0 < i
h : LenBit i a
this : a / i % 2 = 1
⊢ (a / i + 1) % 2 = 0
Theorem: LO.FirstOrder.Arith.Model.LenBit.add_self_of_lenbit
Proof state before:
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈open
a i : M
pos : 0 < i
h : LenBit i a
this : a / i % 2 = 1
⊢ (a / i + 1) % 2 = 0
Tactic:
rw [mod_add] <;> simp [this, one_add_one_eq_two]
Proof state after:
no goals
Theorem: LO.FirstOrder.Arith.Model.LenBit.add_self_of_lenbit
Proof state before:
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈open
a i : M
pos : 0 < i
h : LenBit i a
⊢ a / i % 2 = 1
Tactic:
simpa [LenBit.iff_rem] using h
Proof state after:
no goals
Theorem: LO.FirstOrder.Arith.Model.LenBit.sub_self_of_lenbit
Proof state before:
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈open
a i : M
pos : 0 < i
h : LenBit i a
⊢ ¬LenBit i (a - i)
Tactic:
intro h'
Proof state after:
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈open
a i : M
pos : 0 < i
h : LenBit i a
h' : LenBit i (a - i)
⊢ False
Theorem: LO.FirstOrder.Arith.Model.LenBit.sub_self_of_lenbit
Proof state before:
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈open
a i : M
pos : 0 < i
h : LenBit i a
h' : LenBit i (a - i)
⊢ False
Tactic:
have : ¬LenBit i a := by simpa [sub_add_self_of_le h.le] using LenBit.add_self_of_lenbit pos h'
Proof state after:
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈open
a i : M
pos : 0 < i
h : LenBit i a
h' : LenBit i (a - i)
this : ¬LenBit i a
⊢ False
Theorem: LO.FirstOrder.Arith.Model.LenBit.sub_self_of_lenbit
Proof state before:
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈open
a i : M
pos : 0 < i
h : LenBit i a
h' : LenBit i (a - i)
this : ¬LenBit i a
⊢ False
Tactic:
contradiction
Proof state after:
no goals
Theorem: LO.FirstOrder.Arith.Model.LenBit.sub_self_of_lenbit
Proof state before:
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈open
a i : M
pos : 0 < i
h : LenBit i a
h' : LenBit i (a - i)
⊢ ¬LenBit i a
Tactic:
simpa [sub_add_self_of_le h.le] using LenBit.add_self_of_lenbit pos h'
Proof state after:
no goals
Theorem: LO.FirstOrder.Arith.Model.Pow2.mul
Proof 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 : M
ha : Pow2 a
hb : Pow2 b
⊢ Pow2 (a * b)
Tactic:
wlog hab : a ≤ b
Proof 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 : M
ha : Pow2 a
hb : Pow2 b
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 ⊧ₘ* 𝐈𝚫₀] {a b : M}, Pow2 a → Pow2 b → a ≤ b → Pow2 (a * b)
hab : ¬a ≤ b
⊢ Pow2 (a * b)

M✝ : Type u_1
inst✝¹¹ : Zero M✝
inst✝¹⁰ : One M✝
inst✝⁹ : Add M✝
inst✝⁸ : Mul M✝
inst✝⁷ : LT M✝
inst✝⁶ : M✝ ⊧ₘ* 𝐈𝚫₀
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀
a b : M
ha : Pow2 a
hb : Pow2 b
hab : a ≤ b
⊢ Pow2 (a * b)
Theorem: LO.FirstOrder.Arith.Model.Pow2.mul
Proof state before:
M✝ : Type u_1
inst✝¹¹ : Zero M✝
inst✝¹⁰ : One M✝
inst✝⁹ : Add M✝
inst✝⁸ : Mul M✝
inst✝⁷ : LT M✝
inst✝⁶ : M✝ ⊧ₘ* 𝐈𝚫₀
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀
a b : M
ha : Pow2 a
hb : Pow2 b
hab : a ≤ b
⊢ Pow2 (a * b)
Tactic:
suffices ∀ b : M, ∀ a ≤ b, Pow2 a → Pow2 b → Pow2 (a * b) by
  exact this b a hab ha hb
Proof state after:
M✝ : Type u_1
inst✝¹¹ : Zero M✝
inst✝¹⁰ : One M✝
inst✝⁹ : Add M✝
inst✝⁸ : Mul M✝
inst✝⁷ : LT M✝
inst✝⁶ : M✝ ⊧ₘ* 𝐈𝚫₀
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀
a b : M
ha : Pow2 a
hb : Pow2 b
hab : a ≤ b
⊢ ∀ (b a : M), a ≤ b → Pow2 a → Pow2 b → Pow2 (a * b)
Theorem: LO.FirstOrder.Arith.Model.Pow2.mul
Proof state before:
M✝ : Type u_1
inst✝¹¹ : Zero M✝
inst✝¹⁰ : One M✝
inst✝⁹ : Add M✝
inst✝⁸ : Mul M✝
inst✝⁷ : LT M✝
inst✝⁶ : M✝ ⊧ₘ* 𝐈𝚫₀
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀
a b : M
ha : Pow2 a
hb : Pow2 b
hab : a ≤ b
⊢ ∀ (b a : M), a ≤ b → Pow2 a → Pow2 b → Pow2 (a * b)
Tactic:
intro b
Proof state after:
M✝ : Type u_1
inst✝¹¹ : Zero M✝
inst✝¹⁰ : One M✝
inst✝⁹ : Add M✝
inst✝⁸ : Mul M✝
inst✝⁷ : LT M✝
inst✝⁶ : M✝ ⊧ₘ* 𝐈𝚫₀
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀
a b✝ : M
ha : Pow2 a
hb : Pow2 b✝
hab : a ≤ b✝
b : M
⊢ ∀ a ≤ b, Pow2 a → Pow2 b → Pow2 (a * b)
Theorem: LO.FirstOrder.Arith.Model.Pow2.mul
Proof state before:
M✝ : Type u_1
inst✝¹¹ : Zero M✝
inst✝¹⁰ : One M✝
inst✝⁹ : Add M✝
inst✝⁸ : Mul M✝
inst✝⁷ : LT M✝
inst✝⁶ : M✝ ⊧ₘ* 𝐈𝚫₀
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀
a b✝ : M
ha : Pow2 a
hb : Pow2 b✝
hab : a ≤ b✝
b : M
⊢ ∀ a ≤ b, Pow2 a → Pow2 b → Pow2 (a * b)
Tactic:
induction b using order_induction_iSigmaZero
Proof state after:
case hP
M✝ : Type u_1
inst✝¹¹ : Zero M✝
inst✝¹⁰ : One M✝
inst✝⁹ : Add M✝
inst✝⁸ : Mul M✝
inst✝⁷ : LT M✝
inst✝⁶ : M✝ ⊧ₘ* 𝐈𝚫₀
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀
a b : M
ha : Pow2 a
hb : Pow2 b
hab : a ≤ b
⊢ 𝚺₀-Predicate fun b => ∀ a ≤ b, Pow2 a → Pow2 b → Pow2 (a * b)

case ind
M✝ : Type u_1
inst✝¹¹ : Zero M✝
inst✝¹⁰ : One M✝
inst✝⁹ : Add M✝
inst✝⁸ : Mul M✝
inst✝⁷ : LT M✝
inst✝⁶ : M✝ ⊧ₘ* 𝐈𝚫₀
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀
a b : M
ha : Pow2 a
hb : Pow2 b
hab : a ≤ b
x✝ : M
a✝ : ∀ y < x✝, ∀ a ≤ y, Pow2 a → Pow2 y → Pow2 (a * y)
⊢ ∀ a ≤ x✝, Pow2 a → Pow2 x✝ → Pow2 (a * x✝)
Theorem: LO.FirstOrder.Arith.Model.Pow2.mul
Proof 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 : M
ha : Pow2 a
hb : Pow2 b
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 ⊧ₘ* 𝐈𝚫₀] {a b : M}, Pow2 a → Pow2 b → a ≤ b → Pow2 (a * b)
hab : ¬a ≤ b
⊢ Pow2 (a * b)
Tactic:
simpa [mul_comm] using this hb ha (by simp at hab; exact LT.lt.le hab)
Proof state after:
no goals
Theorem: LO.FirstOrder.Arith.Model.Pow2.mul
Proof 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 : M
ha : Pow2 a
hb : Pow2 b
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 ⊧ₘ* 𝐈𝚫₀] {a b : M}, Pow2 a → Pow2 b → a ≤ b → Pow2 (a * b)
hab : ¬a ≤ b
⊢ b ≤ a
Tactic:
simp at hab
Proof 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 : M
ha : Pow2 a
hb : Pow2 b
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 ⊧ₘ* 𝐈𝚫₀] {a b : M}, Pow2 a → Pow2 b → a ≤ b → Pow2 (a * b)
hab : b < a
⊢ b ≤ a
Theorem: LO.FirstOrder.Arith.Model.Pow2.mul
Proof 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 : M
ha : Pow2 a
hb : Pow2 b
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 ⊧ₘ* 𝐈𝚫₀] {a b : M}, Pow2 a → Pow2 b → a ≤ b → Pow2 (a * b)
hab : b < a
⊢ b ≤ a
Tactic:
exact LT.lt.le hab
Proof state after:
no goals
Theorem: LO.FirstOrder.Arith.Model.Pow2.mul
Proof state before:
M✝ : Type u_1
inst✝¹¹ : Zero M✝
inst✝¹⁰ : One M✝
inst✝⁹ : Add M✝
inst✝⁸ : Mul M✝
inst✝⁷ : LT M✝
inst✝⁶ : M✝ ⊧ₘ* 𝐈𝚫₀
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀
a b : M
ha : Pow2 a
hb : Pow2 b
hab : a ≤ b
this : ∀ (b a : M), a ≤ b → Pow2 a → Pow2 b → Pow2 (a * b)
⊢ Pow2 (a * b)
Tactic:
exact this b a hab ha hb
Proof state after:
no goals
Theorem: LO.FirstOrder.Arith.Model.Pow2.mul
Proof state before:
case hP
M✝ : Type u_1
inst✝¹¹ : Zero M✝
inst✝¹⁰ : One M✝
inst✝⁹ : Add M✝
inst✝⁸ : Mul M✝
inst✝⁷ : LT M✝
inst✝⁶ : M✝ ⊧ₘ* 𝐈𝚫₀
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀
a b : M
ha : Pow2 a
hb : Pow2 b
hab : a ≤ b
⊢ 𝚺₀-Predicate fun b => ∀ a ≤ b, Pow2 a → Pow2 b → Pow2 (a * b)
Tactic:
definability
Proof state after:
no goals
Theorem: LO.FirstOrder.Arith.Model.Pow2.mul
Proof state before:
M✝ : Type u_1
inst✝⁹ : Zero M✝
inst✝⁸ : One M✝
inst✝⁷ : Add M✝
inst✝⁶ : Mul M✝
inst✝⁵ : LT M✝
inst✝⁴ : M✝ ⊧ₘ* 𝐈𝚫₀
M : Type u_1
inst✝³ : Zero M
inst✝² : One M
inst✝¹ : Add M
inst✝ : Mul M
IH✝ : LT M
a✝ : M ⊧ₘ* 𝐈𝚫₀
a b✝ : M
ha : Pow2 a
hb : Pow2 b✝
hab : a ≤ b✝
b : M
IH : ∀ y < b, ∀ a ≤ y, Pow2 a → Pow2 y → Pow2 (a * y)
⊢ ∀ a ≤ b, Pow2 a → Pow2 b → Pow2 (a * b)
Tactic:
intro a hab ha hb
Proof state after:
M✝ : Type u_1
inst✝⁹ : Zero M✝
inst✝⁸ : One M✝
inst✝⁷ : Add M✝
inst✝⁶ : Mul M✝
inst✝⁵ : LT M✝
inst✝⁴ : M✝ ⊧ₘ* 𝐈𝚫₀
M : Type u_1
inst✝³ : Zero M
inst✝² : One M
inst✝¹ : Add M
inst✝ : Mul M
IH✝ : LT M
a✝¹ : M ⊧ₘ* 𝐈𝚫₀
a✝ b✝ : M
ha✝ : Pow2 a✝
hb✝ : Pow2 b✝
hab✝ : a✝ ≤ b✝
b : M
IH : ∀ y < b, ∀ a ≤ y, Pow2 a → Pow2 y → Pow2 (a * y)
a : M
hab : a ≤ b
ha : Pow2 a
hb : Pow2 b
⊢ Pow2 (a * b)
Theorem: LO.FirstOrder.Arith.Model.Pow2.mul
Proof state before:
M✝ : Type u_1
inst✝⁹ : Zero M✝
inst✝⁸ : One M✝
inst✝⁷ : Add M✝
inst✝⁶ : Mul M✝
inst✝⁵ : LT M✝
inst✝⁴ : M✝ ⊧ₘ* 𝐈𝚫₀
M : Type u_1
inst✝³ : Zero M
inst✝² : One M
inst✝¹ : Add M
inst✝ : Mul M
IH✝ : LT M
a✝¹ : M ⊧ₘ* 𝐈𝚫₀
a✝ b✝ : M
ha✝ : Pow2 a✝
hb✝ : Pow2 b✝
hab✝ : a✝ ≤ b✝
b : M
IH : ∀ y < b, ∀ a ≤ y, Pow2 a → Pow2 y → Pow2 (a * y)
a : M
hab : a ≤ b
ha : Pow2 a
hb : Pow2 b
⊢ Pow2 (a * b)
Tactic:
have : a = 1 ∨ 1 < a ∧ ∃ a', a = 2 * a' ∧ Pow2 a' := Pow2.elim'.mp ha
Proof state after:
M✝ : Type u_1
inst✝⁹ : Zero M✝
inst✝⁸ : One M✝
inst✝⁷ : Add M✝
inst✝⁶ : Mul M✝
inst✝⁵ : LT M✝
inst✝⁴ : M✝ ⊧ₘ* 𝐈𝚫₀
M : Type u_1
inst✝³ : Zero M
inst✝² : One M
inst✝¹ : Add M
inst✝ : Mul M
IH✝ : LT M
a✝¹ : M ⊧ₘ* 𝐈𝚫₀
a✝ b✝ : M
ha✝ : Pow2 a✝
hb✝ : Pow2 b✝
hab✝ : a✝ ≤ b✝
b : M
IH : ∀ y < b, ∀ a ≤ y, Pow2 a → Pow2 y → Pow2 (a * y)
a : M
hab : a ≤ b
ha : Pow2 a
hb : Pow2 b
this : a = 1 ∨ 1 < a ∧ ∃ a', a = 2 * a' ∧ Pow2 a'
⊢ Pow2 (a * b)
Theorem: LO.FirstOrder.Arith.Model.Pow2.mul
Proof state before:
M✝ : Type u_1
inst✝⁹ : Zero M✝
inst✝⁸ : One M✝
inst✝⁷ : Add M✝
inst✝⁶ : Mul M✝
inst✝⁵ : LT M✝
inst✝⁴ : M✝ ⊧ₘ* 𝐈𝚫₀
M : Type u_1
inst✝³ : Zero M
inst✝² : One M
inst✝¹ : Add M
inst✝ : Mul M
IH✝ : LT M
a✝¹ : M ⊧ₘ* 𝐈𝚫₀
a✝ b✝ : M
ha✝ : Pow2 a✝
hb✝ : Pow2 b✝
hab✝ : a✝ ≤ b✝
b : M
IH : ∀ y < b, ∀ a ≤ y, Pow2 a → Pow2 y → Pow2 (a * y)
a : M
hab : a ≤ b
ha : Pow2 a
hb : Pow2 b
this : a = 1 ∨ 1 < a ∧ ∃ a', a = 2 * a' ∧ Pow2 a'
⊢ Pow2 (a * b)
Tactic:
rcases this with (rfl | ⟨lta, a, rfl, ha⟩)
Proof 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✝ ⊧ₘ* 𝐈𝚫₀
M : Type u_1
inst✝³ : Zero M
inst✝² : One M
inst✝¹ : Add M
inst✝ : Mul M
IH✝ : LT M
a✝ : M ⊧ₘ* 𝐈𝚫₀
a b✝ : M
ha✝ : Pow2 a
hb✝ : Pow2 b✝
hab✝ : a ≤ b✝
b : M
IH : ∀ y < b, ∀ a ≤ y, Pow2 a → Pow2 y → Pow2 (a * y)
hb : Pow2 b
hab : 1 ≤ b
ha : Pow2 1
⊢ Pow2 (1 * b)

case inr.intro.intro.intro
M✝ : Type u_1
inst✝⁹ : Zero M✝
inst✝⁸ : One M✝
inst✝⁷ : Add M✝
inst✝⁶ : Mul M✝
inst✝⁵ : LT M✝
inst✝⁴ : M✝ ⊧ₘ* 𝐈𝚫₀
M : Type u_1
inst✝³ : Zero M
inst✝² : One M
inst✝¹ : Add M
inst✝ : Mul M
IH✝ : LT M
a✝¹ : M ⊧ₘ* 𝐈𝚫₀
a✝ b✝ : M
ha✝¹ : Pow2 a✝
hb✝ : Pow2 b✝
hab✝ : a✝ ≤ b✝
b : M
IH : ∀ y < b, ∀ a ≤ y, Pow2 a → Pow2 y → Pow2 (a * y)
hb : Pow2 b
a : M
ha✝ : Pow2 a
hab : 2 * a ≤ b
ha : Pow2 (2 * a)
lta : 1 < 2 * a
⊢ Pow2 (2 * a * b)
Theorem: LO.FirstOrder.Arith.Model.Pow2.mul
Proof 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✝ ⊧ₘ* 𝐈𝚫₀
M : Type u_1
inst✝³ : Zero M
inst✝² : One M
inst✝¹ : Add M
inst✝ : Mul M
IH✝ : LT M
a✝ : M ⊧ₘ* 𝐈𝚫₀
a b✝ : M
ha✝ : Pow2 a
hb✝ : Pow2 b✝
hab✝ : a ≤ b✝
b : M
IH : ∀ y < b, ∀ a ≤ y, Pow2 a → Pow2 y → Pow2 (a * y)
hb : Pow2 b
hab : 1 ≤ b
ha : Pow2 1
⊢ Pow2 (1 * b)
Tactic:
simpa using hb
Proof state after:
no goals
Theorem: LO.FirstOrder.Arith.Model.Pow2.mul
Proof state before:
case inr.intro.intro.intro
M✝ : Type u_1
inst✝⁹ : Zero M✝
inst✝⁸ : One M✝
inst✝⁷ : Add M✝
inst✝⁶ : Mul M✝
inst✝⁵ : LT M✝
inst✝⁴ : M✝ ⊧ₘ* 𝐈𝚫₀
M : Type u_1
inst✝³ : Zero M
inst✝² : One M
inst✝¹ : Add M
inst✝ : Mul M
IH✝ : LT M
a✝¹ : M ⊧ₘ* 𝐈𝚫₀
a✝ b✝ : M
ha✝¹ : Pow2 a✝
hb✝ : Pow2 b✝
hab✝ : a✝ ≤ b✝
b : M
IH : ∀ y < b, ∀ a ≤ y, Pow2 a → Pow2 y → Pow2 (a * y)
hb : Pow2 b
a : M
ha✝ : Pow2 a
hab : 2 * a ≤ b
ha : Pow2 (2 * a)
lta : 1 < 2 * a
⊢ Pow2 (2 * a * b)
Tactic:
have : b = 1 ∨ 1 < b ∧ ∃ b', b = 2 * b' ∧ Pow2 b' := Pow2.elim'.mp hb
Proof state after:
case inr.intro.intro.intro
M✝ : Type u_1
inst✝⁹ : Zero M✝
inst✝⁸ : One M✝
inst✝⁷ : Add M✝
inst✝⁶ : Mul M✝
inst✝⁵ : LT M✝
inst✝⁴ : M✝ ⊧ₘ* 𝐈𝚫₀
M : Type u_1
inst✝³ : Zero M
inst✝² : One M
inst✝¹ : Add M
inst✝ : Mul M
IH✝ : LT M
a✝¹ : M ⊧ₘ* 𝐈𝚫₀
a✝ b✝ : M
ha✝¹ : Pow2 a✝
hb✝ : Pow2 b✝
hab✝ : a✝ ≤ b✝
b : M
IH : ∀ y < b, ∀ a ≤ y, Pow2 a → Pow2 y → Pow2 (a * y)
hb : Pow2 b
a : M
ha✝ : Pow2 a
hab : 2 * a ≤ b
ha : Pow2 (2 * a)
lta : 1 < 2 * a
this : b = 1 ∨ 1 < b ∧ ∃ b', b = 2 * b' ∧ Pow2 b'
⊢ Pow2 (2 * a * b)
Theorem: LO.FirstOrder.Arith.Model.Pow2.mul
Proof state before:
case inr.intro.intro.intro
M✝ : Type u_1
inst✝⁹ : Zero M✝
inst✝⁸ : One M✝
inst✝⁷ : Add M✝
inst✝⁶ : Mul M✝
inst✝⁵ : LT M✝
inst✝⁴ : M✝ ⊧ₘ* 𝐈𝚫₀
M : Type u_1
inst✝³ : Zero M
inst✝² : One M
inst✝¹ : Add M
inst✝ : Mul M
IH✝ : LT M
a✝¹ : M ⊧ₘ* 𝐈𝚫₀
a✝ b✝ : M
ha✝¹ : Pow2 a✝
hb✝ : Pow2 b✝
hab✝ : a✝ ≤ b✝
b : M
IH : ∀ y < b, ∀ a ≤ y, Pow2 a → Pow2 y → Pow2 (a * y)
hb : Pow2 b
a : M
ha✝ : Pow2 a
hab : 2 * a ≤ b
ha : Pow2 (2 * a)
lta : 1 < 2 * a
this : b = 1 ∨ 1 < b ∧ ∃ b', b = 2 * b' ∧ Pow2 b'
⊢ Pow2 (2 * a * b)
Tactic:
rcases this with (rfl | ⟨ltb, b, rfl, hb⟩)
Proof state after:
case inr.intro.intro.intro.inl
M✝ : Type u_1
inst✝⁹ : Zero M✝
inst✝⁸ : One M✝
inst✝⁷ : Add M✝
inst✝⁶ : Mul M✝
inst✝⁵ : LT M✝
inst✝⁴ : M✝ ⊧ₘ* 𝐈𝚫₀
M : Type u_1
inst✝³ : Zero M
inst✝² : One M
inst✝¹ : Add M
inst✝ : Mul M
IH✝ : LT M
a✝¹ : M ⊧ₘ* 𝐈𝚫₀
a✝ b : M
ha✝¹ : Pow2 a✝
hb✝ : Pow2 b
hab✝ : a✝ ≤ b
a : M
ha✝ : Pow2 a
ha : Pow2 (2 * a)
lta : 1 < 2 * a
IH : ∀ y < 1, ∀ a ≤ y, Pow2 a → Pow2 y → Pow2 (a * y)
hb : Pow2 1
hab : 2 * a ≤ 1
⊢ Pow2 (2 * a * 1)

case inr.intro.intro.intro.inr.intro.intro.intro
M✝ : Type u_1
inst✝⁹ : Zero M✝
inst✝⁸ : One M✝
inst✝⁷ : Add M✝
inst✝⁶ : Mul M✝
inst✝⁵ : LT M✝
inst✝⁴ : M✝ ⊧ₘ* 𝐈𝚫₀
M : Type u_1
inst✝³ : Zero M
inst✝² : One M
inst✝¹ : Add M
inst✝ : Mul M
IH✝ : LT M
a✝¹ : M ⊧ₘ* 𝐈𝚫₀
a✝ b✝ : M
ha✝¹ : Pow2 a✝
hb✝¹ : Pow2 b✝
hab✝ : a✝ ≤ b✝
a : M
ha✝ : Pow2 a
ha : Pow2 (2 * a)
lta : 1 < 2 * a
b : M
hb✝ : Pow2 b
IH : ∀ y < 2 * b, ∀ a ≤ y, Pow2 a → Pow2 y → Pow2 (a * y)
hb : Pow2 (2 * b)
hab : 2 * a ≤ 2 * b
ltb : 1 < 2 * b
⊢ Pow2 (2 * a * (2 * b))
Theorem: LO.FirstOrder.Arith.Model.Pow2.mul
Proof state before:
case inr.intro.intro.intro.inl
M✝ : Type u_1
inst✝⁹ : Zero M✝
inst✝⁸ : One M✝
inst✝⁷ : Add M✝
inst✝⁶ : Mul M✝
inst✝⁵ : LT M✝
inst✝⁴ : M✝ ⊧ₘ* 𝐈𝚫₀
M : Type u_1
inst✝³ : Zero M
inst✝² : One M
inst✝¹ : Add M
inst✝ : Mul M
IH✝ : LT M
a✝¹ : M ⊧ₘ* 𝐈𝚫₀
a✝ b : M
ha✝¹ : Pow2 a✝
hb✝ : Pow2 b
hab✝ : a✝ ≤ b
a : M
ha✝ : Pow2 a
ha : Pow2 (2 * a)
lta : 1 < 2 * a
IH : ∀ y < 1, ∀ a ≤ y, Pow2 a → Pow2 y → Pow2 (a * y)
hb : Pow2 1
hab : 2 * a ≤ 1
⊢ Pow2 (2 * a * 1)
Tactic:
simpa using ha
Proof state after:
no goals
Theorem: LO.FirstOrder.Arith.Model.Pow2.mul
Proof state before:
case inr.intro.intro.intro.inr.intro.intro.intro
M✝ : Type u_1
inst✝⁹ : Zero M✝
inst✝⁸ : One M✝
inst✝⁷ : Add M✝
inst✝⁶ : Mul M✝
inst✝⁵ : LT M✝
inst✝⁴ : M✝ ⊧ₘ* 𝐈𝚫₀
M : Type u_1
inst✝³ : Zero M
inst✝² : One M
inst✝¹ : Add M
inst✝ : Mul M
IH✝ : LT M
a✝¹ : M ⊧ₘ* 𝐈𝚫₀
a✝ b✝ : M
ha✝¹ : Pow2 a✝
hb✝¹ : Pow2 b✝
hab✝ : a✝ ≤ b✝
a : M
ha✝ : Pow2 a
ha : Pow2 (2 * a)
lta : 1 < 2 * a
b : M
hb✝ : Pow2 b
IH : ∀ y < 2 * b, ∀ a ≤ y, Pow2 a → Pow2 y → Pow2 (a * y)
hb : Pow2 (2 * b)
hab : 2 * a ≤ 2 * b
ltb : 1 < 2 * b
⊢ Pow2 (2 * a * (2 * b))
Tactic:
have ltb : b < 2 * b := lt_two_mul_self (pos_iff_ne_zero.mpr $ by rintro rfl; simp at ltb)
Proof state after:
case inr.intro.intro.intro.inr.intro.intro.intro
M✝ : Type u_1
inst✝⁹ : Zero M✝
inst✝⁸ : One M✝
inst✝⁷ : Add M✝
inst✝⁶ : Mul M✝
inst✝⁵ : LT M✝
inst✝⁴ : M✝ ⊧ₘ* 𝐈𝚫₀
M : Type u_1
inst✝³ : Zero M
inst✝² : One M
inst✝¹ : Add M
inst✝ : Mul M
IH✝ : LT M
a✝¹ : M ⊧ₘ* 𝐈𝚫₀
a✝ b✝ : M
ha✝¹ : Pow2 a✝
hb✝¹ : Pow2 b✝
hab✝ : a✝ ≤ b✝
a : M
ha✝ : Pow2 a
ha : Pow2 (2 * a)
lta : 1 < 2 * a
b : M
hb✝ : Pow2 b
IH : ∀ y < 2 * b, ∀ a ≤ y, Pow2 a → Pow2 y → Pow2 (a * y)
hb : Pow2 (2 * b)
hab : 2 * a ≤ 2 * b
ltb✝ : 1 < 2 * b
ltb : b < 2 * b
⊢ Pow2 (2 * a * (2 * b))
Theorem: LO.FirstOrder.Arith.Model.Pow2.mul
Proof state before:
case inr.intro.intro.intro.inr.intro.intro.intro
M✝ : Type u_1
inst✝⁹ : Zero M✝
inst✝⁸ : One M✝
inst✝⁷ : Add M✝
inst✝⁶ : Mul M✝
inst✝⁵ : LT M✝
inst✝⁴ : M✝ ⊧ₘ* 𝐈𝚫₀
M : Type u_1
inst✝³ : Zero M
inst✝² : One M
inst✝¹ : Add M
inst✝ : Mul M
IH✝ : LT M
a✝¹ : M ⊧ₘ* 𝐈𝚫₀
a✝ b✝ : M
ha✝¹ : Pow2 a✝
hb✝¹ : Pow2 b✝
hab✝ : a✝ ≤ b✝
a : M
ha✝ : Pow2 a
ha : Pow2 (2 * a)
lta : 1 < 2 * a
b : M
hb✝ : Pow2 b
IH : ∀ y < 2 * b, ∀ a ≤ y, Pow2 a → Pow2 y → Pow2 (a * y)
hb : Pow2 (2 * b)
hab : 2 * a ≤ 2 * b
ltb✝ : 1 < 2 * b
ltb : b < 2 * b
⊢ Pow2 (2 * a * (2 * b))
Tactic:
have hab : a ≤ b := le_of_mul_le_mul_left hab (by simp)
Proof state after:
case inr.intro.intro.intro.inr.intro.intro.intro
M✝ : Type u_1
inst✝⁹ : Zero M✝
inst✝⁸ : One M✝
inst✝⁷ : Add M✝
inst✝⁶ : Mul M✝
inst✝⁵ : LT M✝
inst✝⁴ : M✝ ⊧ₘ* 𝐈𝚫₀
M : Type u_1
inst✝³ : Zero M
inst✝² : One M
inst✝¹ : Add M
inst✝ : Mul M
IH✝ : LT M
a✝¹ : M ⊧ₘ* 𝐈𝚫₀
a✝ b✝ : M
ha✝¹ : Pow2 a✝
hb✝¹ : Pow2 b✝
hab✝¹ : a✝ ≤ b✝
a : M
ha✝ : Pow2 a
ha : Pow2 (2 * a)
lta : 1 < 2 * a
b : M
hb✝ : Pow2 b
IH : ∀ y < 2 * b, ∀ a ≤ y, Pow2 a → Pow2 y → Pow2 (a * y)
hb : Pow2 (2 * b)
hab✝ : 2 * a ≤ 2 * b
ltb✝ : 1 < 2 * b
ltb : b < 2 * b
hab : a ≤ b
⊢ Pow2 (2 * a * (2 * b))
Theorem: LO.FirstOrder.Arith.Model.Pow2.mul
Proof state before:
case inr.intro.intro.intro.inr.intro.intro.intro
M✝ : Type u_1
inst✝⁹ : Zero M✝
inst✝⁸ : One M✝
inst✝⁷ : Add M✝
inst✝⁶ : Mul M✝
inst✝⁵ : LT M✝
inst✝⁴ : M✝ ⊧ₘ* 𝐈𝚫₀
M : Type u_1
inst✝³ : Zero M
inst✝² : One M
inst✝¹ : Add M
inst✝ : Mul M
IH✝ : LT M
a✝¹ : M ⊧ₘ* 𝐈𝚫₀
a✝ b✝ : M
ha✝¹ : Pow2 a✝
hb✝¹ : Pow2 b✝
hab✝¹ : a✝ ≤ b✝
a : M
ha✝ : Pow2 a
ha : Pow2 (2 * a)
lta : 1 < 2 * a
b : M
hb✝ : Pow2 b
IH : ∀ y < 2 * b, ∀ a ≤ y, Pow2 a → Pow2 y → Pow2 (a * y)
hb : Pow2 (2 * b)
hab✝ : 2 * a ≤ 2 * b
ltb✝ : 1 < 2 * b
ltb : b < 2 * b
hab : a ≤ b
⊢ Pow2 (2 * a * (2 * b))
Tactic:
have : Pow2 (a * b) := IH b ltb a hab (by assumption) (by assumption)
Proof state after:
case inr.intro.intro.intro.inr.intro.intro.intro
M✝ : Type u_1
inst✝⁹ : Zero M✝
inst✝⁸ : One M✝
inst✝⁷ : Add M✝
inst✝⁶ : Mul M✝
inst✝⁵ : LT M✝
inst✝⁴ : M✝ ⊧ₘ* 𝐈𝚫₀
M : Type u_1
inst✝³ : Zero M
inst✝² : One M
inst✝¹ : Add M
inst✝ : Mul M
IH✝ : LT M
a✝¹ : M ⊧ₘ* 𝐈𝚫₀
a✝ b✝ : M
ha✝¹ : Pow2 a✝
hb✝¹ : Pow2 b✝
hab✝¹ : a✝ ≤ b✝
a : M
ha✝ : Pow2 a
ha : Pow2 (2 * a)
lta : 1 < 2 * a
b : M
hb✝ : Pow2 b
IH : ∀ y < 2 * b, ∀ a ≤ y, Pow2 a → Pow2 y → Pow2 (a * y)
hb : Pow2 (2 * b)
hab✝ : 2 * a ≤ 2 * b
ltb✝ : 1 < 2 * b
ltb : b < 2 * b
hab : a ≤ b
this : Pow2 (a * b)
⊢ Pow2 (2 * a * (2 * b))
Theorem: LO.FirstOrder.Arith.Model.Pow2.mul
Proof state before:
case inr.intro.intro.intro.inr.intro.intro.intro
M✝ : Type u_1
inst✝⁹ : Zero M✝
inst✝⁸ : One M✝
inst✝⁷ : Add M✝
inst✝⁶ : Mul M✝
inst✝⁵ : LT M✝
inst✝⁴ : M✝ ⊧ₘ* 𝐈𝚫₀
M : Type u_1
inst✝³ : Zero M
inst✝² : One M
inst✝¹ : Add M
inst✝ : Mul M
IH✝ : LT M
a✝¹ : M ⊧ₘ* 𝐈𝚫₀
a✝ b✝ : M
ha✝¹ : Pow2 a✝
hb✝¹ : Pow2 b✝
hab✝¹ : a✝ ≤ b✝
a : M
ha✝ : Pow2 a
ha : Pow2 (2 * a)
lta : 1 < 2 * a
b : M
hb✝ : Pow2 b
IH : ∀ y < 2 * b, ∀ a ≤ y, Pow2 a → Pow2 y → Pow2 (a * y)
hb : Pow2 (2 * b)
hab✝ : 2 * a ≤ 2 * b
ltb✝ : 1 < 2 * b
ltb : b < 2 * b
hab : a ≤ b
this : Pow2 (a * b)
⊢ Pow2 (2 * a * (2 * b))
Tactic:
suffices Pow2 (4 * a * b) by
  have : (2 * a) * (2 * b) = 4 * a * b := by simp [mul_assoc, mul_left_comm a 2 b, ←two_mul_two_eq_four]
  simpa [this]
Proof state after:
case inr.intro.intro.intro.inr.intro.intro.intro
M✝ : Type u_1
inst✝⁹ : Zero M✝
inst✝⁸ : One M✝
inst✝⁷ : Add M✝
inst✝⁶ : Mul M✝
inst✝⁵ : LT M✝
inst✝⁴ : M✝ ⊧ₘ* 𝐈𝚫₀
M : Type u_1
inst✝³ : Zero M
inst✝² : One M
inst✝¹ : Add M
inst✝ : Mul M
IH✝ : LT M
a✝¹ : M ⊧ₘ* 𝐈𝚫₀
a✝ b✝ : M
ha✝¹ : Pow2 a✝
hb✝¹ : Pow2 b✝
hab✝¹ : a✝ ≤ b✝
a : M
ha✝ : Pow2 a
ha : Pow2 (2 * a)
lta : 1 < 2 * a
b : M
hb✝ : Pow2 b
IH : ∀ y < 2 * b, ∀ a ≤ y, Pow2 a → Pow2 y → Pow2 (a * y)
hb : Pow2 (2 * b)
hab✝ : 2 * a ≤ 2 * b
ltb✝ : 1 < 2 * b
ltb : b < 2 * b
hab : a ≤ b
this : Pow2 (a * b)
⊢ Pow2 (4 * a * b)
Theorem: LO.FirstOrder.Arith.Model.Pow2.mul
Proof state before:
case inr.intro.intro.intro.inr.intro.intro.intro
M✝ : Type u_1
inst✝⁹ : Zero M✝
inst✝⁸ : One M✝
inst✝⁷ : Add M✝
inst✝⁶ : Mul M✝
inst✝⁵ : LT M✝
inst✝⁴ : M✝ ⊧ₘ* 𝐈𝚫₀
M : Type u_1
inst✝³ : Zero M
inst✝² : One M
inst✝¹ : Add M
inst✝ : Mul M
IH✝ : LT M
a✝¹ : M ⊧ₘ* 𝐈𝚫₀
a✝ b✝ : M
ha✝¹ : Pow2 a✝
hb✝¹ : Pow2 b✝
hab✝¹ : a✝ ≤ b✝
a : M
ha✝ : Pow2 a
ha : Pow2 (2 * a)
lta : 1 < 2 * a
b : M
hb✝ : Pow2 b
IH : ∀ y < 2 * b, ∀ a ≤ y, Pow2 a → Pow2 y → Pow2 (a * y)
hb : Pow2 (2 * b)
hab✝ : 2 * a ≤ 2 * b
ltb✝ : 1 < 2 * b
ltb : b < 2 * b
hab : a ≤ b
this : Pow2 (a * b)
⊢ Pow2 (4 * a * b)
Tactic:
simpa [mul_assoc, pow2_mul_four] using this
Proof state after:
no goals
Theorem: LO.FirstOrder.Arith.Model.Pow2.mul
Proof state before:
M✝ : Type u_1
inst✝⁹ : Zero M✝
inst✝⁸ : One M✝
inst✝⁷ : Add M✝
inst✝⁶ : Mul M✝
inst✝⁵ : LT M✝
inst✝⁴ : M✝ ⊧ₘ* 𝐈𝚫₀
M : Type u_1
inst✝³ : Zero M
inst✝² : One M
inst✝¹ : Add M
inst✝ : Mul M
IH✝ : LT M
a✝¹ : M ⊧ₘ* 𝐈𝚫₀
a✝ b✝ : M
ha✝¹ : Pow2 a✝
hb✝¹ : Pow2 b✝
hab✝ : a✝ ≤ b✝
a : M
ha✝ : Pow2 a
ha : Pow2 (2 * a)
lta : 1 < 2 * a
b : M
hb✝ : Pow2 b
IH : ∀ y < 2 * b, ∀ a ≤ y, Pow2 a → Pow2 y → Pow2 (a * y)
hb : Pow2 (2 * b)
hab : 2 * a ≤ 2 * b
ltb : 1 < 2 * b
⊢ b ≠ 0
Tactic:
rintro rfl
Proof state after:
M✝ : Type u_1
inst✝⁹ : Zero M✝
inst✝⁸ : One M✝
inst✝⁷ : Add M✝
inst✝⁶ : Mul M✝
inst✝⁵ : LT M✝
inst✝⁴ : M✝ ⊧ₘ* 𝐈𝚫₀
M : Type u_1
inst✝³ : Zero M
inst✝² : One M
inst✝¹ : Add M
inst✝ : Mul M
IH✝ : LT M
a✝¹ : M ⊧ₘ* 𝐈𝚫₀
a✝ b : M
ha✝¹ : Pow2 a✝
hb✝¹ : Pow2 b
hab✝ : a✝ ≤ b
a : M
ha✝ : Pow2 a
ha : Pow2 (2 * a)
lta : 1 < 2 * a
hb✝ : Pow2 0
IH : ∀ y < 2 * 0, ∀ a ≤ y, Pow2 a → Pow2 y → Pow2 (a * y)
hb : Pow2 (2 * 0)
hab : 2 * a ≤ 2 * 0
ltb : 1 < 2 * 0
⊢ False