/-
Copyright 2025 The Formal Conjectures Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-/
import FormalConjecturesUtilMathoverflow 75792
Various questions about integer complexity, which is the minimum number of 1s needed to express a natural number using addition, multiplication, and parentheses.
Let ‖n‖ denote the integer complexity of n > 0.
It is known that ‖3^n‖ = 3n for n > 0.
Is it true that ‖2^n‖ = 2n for n > 0?
The corresponding conjecture for 5 is false, because
5^6 = 15625 = 1 + 2^3 * 3^2 * (1 + 2^3 * 3^3)!
We have chosen to formalise this using an inductive type.
References:
mathoverflow/75792 by user Harry Altman
http://arxiv.org/abs/1203.6462 by Jānis Iraids, Kaspars Balodis, Juris Čerņenoks, Mārtiņš Opmanis, Rihards Opmanis, Kārlis Podnieks
http://arxiv.org/abs/1207.4841 by Harry Altman, Joshua Zelinsky
https://oeis.org/A5245 : Mahler-Popken complexity.
namespace Mathoverflow75792
The inductively defined predicate that m is reachable in n steps.
inductive Reachable : ℕ → ℕ → Prop
| one : Reachable 1 1
| add {m n a b} : Reachable m a → Reachable n b → Reachable (m + n) (a + b)
| mul {m n a b} : Reachable m a → Reachable n b → Reachable (m * n) (a + b)@[category test, AMS 11]
theorem Reachable.self (n : ℕ) (hn : 0 < n) : Reachable n n :=
Nat.le_induction .one (fun _ _ ih ↦ .add ih .one) n hnmul n:ℕm:ℕm✝:ℕn✝:ℕa✝:ℕb✝:ℕh₁:Reachable m✝ a✝h₂:Reachable n✝ b✝a_ih✝¹:0 = m✝ → Falsea_ih✝:0 = n✝ → Falsehm:m✝ = 0 ∨ n✝ = 0⊢ False; aesop All goals completed! 🐙
@[category test, AMS 11]
theorem not_reachable_zero_snd (m : ℕ) : ¬ Reachable m 0 := by m:ℕ⊢ ¬Reachable m 0
intro h m:ℕh:Reachable m 0⊢ False; generalize hn : 0 = n at h m:ℕn:ℕhn:0 = nh:Reachable m n⊢ False; induction h with
| one => one m:ℕn:ℕhn:0 = 1⊢ False exact absurd hn (by m:ℕn:ℕhn:0 = 1⊢ ¬0 = 1 decide All goals completed! 🐙)
| add h₁ h₂ => add m:ℕn:ℕm✝:ℕn✝:ℕa✝:ℕb✝:ℕh₁:Reachable m✝ a✝h₂:Reachable n✝ b✝a_ih✝¹:0 = a✝ → Falsea_ih✝:0 = b✝ → Falsehn:0 = a✝ + b✝⊢ False rw [eq_comm, add m:ℕn:ℕm✝:ℕn✝:ℕa✝:ℕb✝:ℕh₁:Reachable m✝ a✝h₂:Reachable n✝ b✝a_ih✝¹:0 = a✝ → Falsea_ih✝:0 = b✝ → Falsehn:a✝ + b✝ = 0⊢ False add m:ℕn:ℕm✝:ℕn✝:ℕa✝:ℕb✝:ℕh₁:Reachable m✝ a✝h₂:Reachable n✝ b✝a_ih✝¹:0 = a✝ → Falsea_ih✝:0 = b✝ → Falsehn:a✝ = 0 ∧ b✝ = 0⊢ False add_eq_zero add m:ℕn:ℕm✝:ℕn✝:ℕa✝:ℕb✝:ℕh₁:Reachable m✝ a✝h₂:Reachable n✝ b✝a_ih✝¹:0 = a✝ → Falsea_ih✝:0 = b✝ → Falsehn:a✝ = 0 ∧ b✝ = 0⊢ False add m:ℕn:ℕm✝:ℕn✝:ℕa✝:ℕb✝:ℕh₁:Reachable m✝ a✝h₂:Reachable n✝ b✝a_ih✝¹:0 = a✝ → Falsea_ih✝:0 = b✝ → Falsehn:a✝ = 0 ∧ b✝ = 0⊢ False] at hnadd m:ℕn:ℕm✝:ℕn✝:ℕa✝:ℕb✝:ℕh₁:Reachable m✝ a✝h₂:Reachable n✝ b✝a_ih✝¹:0 = a✝ → Falsea_ih✝:0 = b✝ → Falsehn:a✝ = 0 ∧ b✝ = 0⊢ False; aesop All goals completed! 🐙
| mul h₁ h₂ => mul m:ℕn:ℕm✝:ℕn✝:ℕa✝:ℕb✝:ℕh₁:Reachable m✝ a✝h₂:Reachable n✝ b✝a_ih✝¹:0 = a✝ → Falsea_ih✝:0 = b✝ → Falsehn:0 = a✝ + b✝⊢ False rw [eq_comm, mul m:ℕn:ℕm✝:ℕn✝:ℕa✝:ℕb✝:ℕh₁:Reachable m✝ a✝h₂:Reachable n✝ b✝a_ih✝¹:0 = a✝ → Falsea_ih✝:0 = b✝ → Falsehn:a✝ + b✝ = 0⊢ False mul m:ℕn:ℕm✝:ℕn✝:ℕa✝:ℕb✝:ℕh₁:Reachable m✝ a✝h₂:Reachable n✝ b✝a_ih✝¹:0 = a✝ → Falsea_ih✝:0 = b✝ → Falsehn:a✝ = 0 ∧ b✝ = 0⊢ False add_eq_zero mul m:ℕn:ℕm✝:ℕn✝:ℕa✝:ℕb✝:ℕh₁:Reachable m✝ a✝h₂:Reachable n✝ b✝a_ih✝¹:0 = a✝ → Falsea_ih✝:0 = b✝ → Falsehn:a✝ = 0 ∧ b✝ = 0⊢ Falsemul m:ℕn:ℕm✝:ℕn✝:ℕa✝:ℕb✝:ℕh₁:Reachable m✝ a✝h₂:Reachable n✝ b✝a_ih✝¹:0 = a✝ → Falsea_ih✝:0 = b✝ → Falsehn:a✝ = 0 ∧ b✝ = 0⊢ False] at hnmul m:ℕn:ℕm✝:ℕn✝:ℕa✝:ℕb✝:ℕh₁:Reachable m✝ a✝h₂:Reachable n✝ b✝a_ih✝¹:0 = a✝ → Falsea_ih✝:0 = b✝ → Falsehn:a✝ = 0 ∧ b✝ = 0⊢ False; aesop All goals completed! 🐙@[category test, AMS 11]
theorem Reachable.dec {m n : ℕ} (h : Reachable m n) :
∃ m' n', m' + 1 = m ∧ n' + 1 = n := by m:ℕn:ℕh:Reachable m n⊢ ∃ m' n', m' + 1 = m ∧ n' + 1 = n
obtain _ | m := m zero n:ℕh:Reachable 0 n⊢ ∃ m' n', m' + 1 = 0 ∧ n' + 1 = nsucc n:ℕm:ℕh:Reachable (m + 1) n⊢ ∃ m' n', m' + 1 = m + 1 ∧ n' + 1 = n
· zero n:ℕh:Reachable 0 n⊢ ∃ m' n', m' + 1 = 0 ∧ n' + 1 = n exact absurd h (not_reachable_zero_fst _) All goals completed! 🐙
obtain _ | n := n succ.zero m:ℕh:Reachable (m + 1) 0⊢ ∃ m' n', m' + 1 = m + 1 ∧ n' + 1 = 0succ.succ m:ℕn:ℕh:Reachable (m + 1) (n + 1)⊢ ∃ m' n', m' + 1 = m + 1 ∧ n' + 1 = n + 1
· succ.zero m:ℕh:Reachable (m + 1) 0⊢ ∃ m' n', m' + 1 = m + 1 ∧ n' + 1 = 0 exact absurd h (not_reachable_zero_snd _) All goals completed! 🐙
exact ⟨_, _, rfl, rfl⟩ All goals completed! 🐙@[category test, AMS 11]
theorem Reachable.le {m n₁ n₂ : ℕ} (hn : n₁ ≤ n₂) (hm : Reachable m n₁) : Reachable m n₂ := by m:ℕn₁:ℕn₂:ℕhn:n₁ ≤ n₂hm:Reachable m n₁⊢ Reachable m n₂
induction hn with
| refl => refl m:ℕn₁:ℕn₂:ℕhm:Reachable m n₁⊢ Reachable m n₁ exact hm All goals completed! 🐙
| step h ih => step m:ℕn₁:ℕn₂:ℕhm:Reachable m n₁m✝:ℕh:n₁.le m✝ih:Reachable m m✝⊢ Reachable m m✝.succ convert ih.mul .one m:ℕn₁:ℕn₂:ℕhm:Reachable m n₁m✝:ℕh:n₁.le m✝ih:Reachable m m✝⊢ m = m * 1; simp All goals completed! 🐙
@[category test, AMS 11]
theorem reachable_iff_of_two_le (m n : ℕ) (hm : 2 ≤ m) :
Reachable m n ↔ ∃ m₁, ∃ _ : m₁ < m, ∃ m₂, ∃ _ : m₂ < m, ∃ n₁, ∃ _ : n₁ < n, ∃ n₂, ∃ _ : n₂ < n,
n₁ + n₂ = n ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m ∨ m₁ * m₂ = m) := by m:ℕn:ℕhm:2 ≤ m⊢ Reachable m n ↔
∃ m₁,
∃ (_ : m₁ < m),
∃ m₂,
∃ (_ : m₂ < m),
∃ n₁,
∃ (_ : n₁ < n),
∃ n₂, ∃ (_ : n₂ < n), n₁ + n₂ = n ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m ∨ m₁ * m₂ = m)
refine ⟨fun hmn ↦ ?_, fun ⟨m₁, hm₁, m₂, hm₂, n₁, hn₁, n₂, hn₂, h₁, h₂, h₃, h₄⟩ ↦
h₁ ▸ h₄.casesOn (· ▸ .add h₂ h₃) (· ▸ .mul h₂ h₃)⟩ m:ℕn:ℕhm:2 ≤ mhmn:Reachable m n⊢ ∃ m₁,
∃ (_ : m₁ < m),
∃ m₂,
∃ (_ : m₂ < m),
∃ n₁,
∃ (_ : n₁ < n),
∃ n₂, ∃ (_ : n₂ < n), n₁ + n₂ = n ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m ∨ m₁ * m₂ = m)
induction hmn with
| one => one m:ℕn:ℕhm:2 ≤ 1⊢ ∃ m₁,
∃ (_ : m₁ < 1),
∃ m₂,
∃ (_ : m₂ < 1),
∃ n₁,
∃ (_ : n₁ < 1),
∃ n₂, ∃ (_ : n₂ < 1), n₁ + n₂ = 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = 1 ∨ m₁ * m₂ = 1) exact absurd hm (by m:ℕn:ℕhm:2 ≤ 1⊢ ¬2 ≤ 1 decide All goals completed! 🐙)
| @add m₃ m₄ n₃ n₄ h₁ h₂ ih₁ ih₂ => add m:ℕn:ℕm₃:ℕm₄:ℕn₃:ℕn₄:ℕh₁:Reachable m₃ n₃h₂:Reachable m₄ n₄ih₁:2 ≤ m₃ →
∃ m₁,
∃ (_ : m₁ < m₃),
∃ m₂,
∃ (_ : m₂ < m₃),
∃ n₁,
∃ (_ : n₁ < n₃),
∃ n₂, ∃ (_ : n₂ < n₃), n₁ + n₂ = n₃ ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ ∨ m₁ * m₂ = m₃)ih₂:2 ≤ m₄ →
∃ m₁,
∃ (_ : m₁ < m₄),
∃ m₂,
∃ (_ : m₂ < m₄),
∃ n₁,
∃ (_ : n₁ < n₄),
∃ n₂, ∃ (_ : n₂ < n₄), n₁ + n₂ = n₄ ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₄ ∨ m₁ * m₂ = m₄)hm:2 ≤ m₃ + m₄⊢ ∃ m₁,
∃ (_ : m₁ < m₃ + m₄),
∃ m₂,
∃ (_ : m₂ < m₃ + m₄),
∃ n₁,
∃ (_ : n₁ < n₃ + n₄),
∃ n₂,
∃ (_ : n₂ < n₃ + n₄),
n₁ + n₂ = n₃ + n₄ ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + m₄ ∨ m₁ * m₂ = m₃ + m₄)
obtain ⟨m₃, n₃, rfl, rfl⟩ := h₁.dec add m:ℕn:ℕm₄:ℕn₄:ℕh₂:Reachable m₄ n₄ih₂:2 ≤ m₄ →
∃ m₁,
∃ (_ : m₁ < m₄),
∃ m₂,
∃ (_ : m₂ < m₄),
∃ n₁,
∃ (_ : n₁ < n₄),
∃ n₂, ∃ (_ : n₂ < n₄), n₁ + n₂ = n₄ ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₄ ∨ m₁ * m₂ = m₄)m₃:ℕn₃:ℕhm:2 ≤ m₃ + 1 + m₄h₁:Reachable (m₃ + 1) (n₃ + 1)ih₁:2 ≤ m₃ + 1 →
∃ m₁,
∃ (_ : m₁ < m₃ + 1),
∃ m₂,
∃ (_ : m₂ < m₃ + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + 1 ∨ m₁ * m₂ = m₃ + 1)⊢ ∃ m₁,
∃ (_ : m₁ < m₃ + 1 + m₄),
∃ m₂,
∃ (_ : m₂ < m₃ + 1 + m₄),
∃ n₁,
∃ (_ : n₁ < n₃ + 1 + n₄),
∃ n₂,
∃ (_ : n₂ < n₃ + 1 + n₄),
n₁ + n₂ = n₃ + 1 + n₄ ∧
Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + 1 + m₄ ∨ m₁ * m₂ = m₃ + 1 + m₄)
obtain ⟨m₄, n₄, rfl, rfl⟩ := h₂.dec add m:ℕn:ℕm₃:ℕn₃:ℕh₁:Reachable (m₃ + 1) (n₃ + 1)ih₁:2 ≤ m₃ + 1 →
∃ m₁,
∃ (_ : m₁ < m₃ + 1),
∃ m₂,
∃ (_ : m₂ < m₃ + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + 1 ∨ m₁ * m₂ = m₃ + 1)m₄:ℕn₄:ℕhm:2 ≤ m₃ + 1 + (m₄ + 1)h₂:Reachable (m₄ + 1) (n₄ + 1)ih₂:2 ≤ m₄ + 1 →
∃ m₁,
∃ (_ : m₁ < m₄ + 1),
∃ m₂,
∃ (_ : m₂ < m₄ + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₄ + 1 ∨ m₁ * m₂ = m₄ + 1)⊢ ∃ m₁,
∃ (_ : m₁ < m₃ + 1 + (m₄ + 1)),
∃ m₂,
∃ (_ : m₂ < m₃ + 1 + (m₄ + 1)),
∃ n₁,
∃ (_ : n₁ < n₃ + 1 + (n₄ + 1)),
∃ n₂,
∃ (_ : n₂ < n₃ + 1 + (n₄ + 1)),
n₁ + n₂ = n₃ + 1 + (n₄ + 1) ∧
Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + 1 + (m₄ + 1) ∨ m₁ * m₂ = m₃ + 1 + (m₄ + 1))
refine ⟨m₃ + 1, ?_, m₄ + 1, ?_, n₃ + 1, ?_, n₄ + 1, ?_, rfl, h₁, h₂, .inl rfl⟩ add.refine_1 m:ℕn:ℕm₃:ℕn₃:ℕh₁:Reachable (m₃ + 1) (n₃ + 1)ih₁:2 ≤ m₃ + 1 →
∃ m₁,
∃ (_ : m₁ < m₃ + 1),
∃ m₂,
∃ (_ : m₂ < m₃ + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + 1 ∨ m₁ * m₂ = m₃ + 1)m₄:ℕn₄:ℕhm:2 ≤ m₃ + 1 + (m₄ + 1)h₂:Reachable (m₄ + 1) (n₄ + 1)ih₂:2 ≤ m₄ + 1 →
∃ m₁,
∃ (_ : m₁ < m₄ + 1),
∃ m₂,
∃ (_ : m₂ < m₄ + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₄ + 1 ∨ m₁ * m₂ = m₄ + 1)⊢ m₃ + 1 < m₃ + 1 + (m₄ + 1)add.refine_2 m:ℕn:ℕm₃:ℕn₃:ℕh₁:Reachable (m₃ + 1) (n₃ + 1)ih₁:2 ≤ m₃ + 1 →
∃ m₁,
∃ (_ : m₁ < m₃ + 1),
∃ m₂,
∃ (_ : m₂ < m₃ + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + 1 ∨ m₁ * m₂ = m₃ + 1)m₄:ℕn₄:ℕhm:2 ≤ m₃ + 1 + (m₄ + 1)h₂:Reachable (m₄ + 1) (n₄ + 1)ih₂:2 ≤ m₄ + 1 →
∃ m₁,
∃ (_ : m₁ < m₄ + 1),
∃ m₂,
∃ (_ : m₂ < m₄ + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₄ + 1 ∨ m₁ * m₂ = m₄ + 1)⊢ m₄ + 1 < m₃ + 1 + (m₄ + 1)add.refine_3 m:ℕn:ℕm₃:ℕn₃:ℕh₁:Reachable (m₃ + 1) (n₃ + 1)ih₁:2 ≤ m₃ + 1 →
∃ m₁,
∃ (_ : m₁ < m₃ + 1),
∃ m₂,
∃ (_ : m₂ < m₃ + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + 1 ∨ m₁ * m₂ = m₃ + 1)m₄:ℕn₄:ℕhm:2 ≤ m₃ + 1 + (m₄ + 1)h₂:Reachable (m₄ + 1) (n₄ + 1)ih₂:2 ≤ m₄ + 1 →
∃ m₁,
∃ (_ : m₁ < m₄ + 1),
∃ m₂,
∃ (_ : m₂ < m₄ + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₄ + 1 ∨ m₁ * m₂ = m₄ + 1)⊢ n₃ + 1 < n₃ + 1 + (n₄ + 1)add.refine_4 m:ℕn:ℕm₃:ℕn₃:ℕh₁:Reachable (m₃ + 1) (n₃ + 1)ih₁:2 ≤ m₃ + 1 →
∃ m₁,
∃ (_ : m₁ < m₃ + 1),
∃ m₂,
∃ (_ : m₂ < m₃ + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + 1 ∨ m₁ * m₂ = m₃ + 1)m₄:ℕn₄:ℕhm:2 ≤ m₃ + 1 + (m₄ + 1)h₂:Reachable (m₄ + 1) (n₄ + 1)ih₂:2 ≤ m₄ + 1 →
∃ m₁,
∃ (_ : m₁ < m₄ + 1),
∃ m₂,
∃ (_ : m₂ < m₄ + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₄ + 1 ∨ m₁ * m₂ = m₄ + 1)⊢ n₄ + 1 < n₃ + 1 + (n₄ + 1) <;> add.refine_1 m:ℕn:ℕm₃:ℕn₃:ℕh₁:Reachable (m₃ + 1) (n₃ + 1)ih₁:2 ≤ m₃ + 1 →
∃ m₁,
∃ (_ : m₁ < m₃ + 1),
∃ m₂,
∃ (_ : m₂ < m₃ + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + 1 ∨ m₁ * m₂ = m₃ + 1)m₄:ℕn₄:ℕhm:2 ≤ m₃ + 1 + (m₄ + 1)h₂:Reachable (m₄ + 1) (n₄ + 1)ih₂:2 ≤ m₄ + 1 →
∃ m₁,
∃ (_ : m₁ < m₄ + 1),
∃ m₂,
∃ (_ : m₂ < m₄ + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₄ + 1 ∨ m₁ * m₂ = m₄ + 1)⊢ m₃ + 1 < m₃ + 1 + (m₄ + 1)add.refine_2 m:ℕn:ℕm₃:ℕn₃:ℕh₁:Reachable (m₃ + 1) (n₃ + 1)ih₁:2 ≤ m₃ + 1 →
∃ m₁,
∃ (_ : m₁ < m₃ + 1),
∃ m₂,
∃ (_ : m₂ < m₃ + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + 1 ∨ m₁ * m₂ = m₃ + 1)m₄:ℕn₄:ℕhm:2 ≤ m₃ + 1 + (m₄ + 1)h₂:Reachable (m₄ + 1) (n₄ + 1)ih₂:2 ≤ m₄ + 1 →
∃ m₁,
∃ (_ : m₁ < m₄ + 1),
∃ m₂,
∃ (_ : m₂ < m₄ + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₄ + 1 ∨ m₁ * m₂ = m₄ + 1)⊢ m₄ + 1 < m₃ + 1 + (m₄ + 1)add.refine_3 m:ℕn:ℕm₃:ℕn₃:ℕh₁:Reachable (m₃ + 1) (n₃ + 1)ih₁:2 ≤ m₃ + 1 →
∃ m₁,
∃ (_ : m₁ < m₃ + 1),
∃ m₂,
∃ (_ : m₂ < m₃ + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + 1 ∨ m₁ * m₂ = m₃ + 1)m₄:ℕn₄:ℕhm:2 ≤ m₃ + 1 + (m₄ + 1)h₂:Reachable (m₄ + 1) (n₄ + 1)ih₂:2 ≤ m₄ + 1 →
∃ m₁,
∃ (_ : m₁ < m₄ + 1),
∃ m₂,
∃ (_ : m₂ < m₄ + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₄ + 1 ∨ m₁ * m₂ = m₄ + 1)⊢ n₃ + 1 < n₃ + 1 + (n₄ + 1)add.refine_4 m:ℕn:ℕm₃:ℕn₃:ℕh₁:Reachable (m₃ + 1) (n₃ + 1)ih₁:2 ≤ m₃ + 1 →
∃ m₁,
∃ (_ : m₁ < m₃ + 1),
∃ m₂,
∃ (_ : m₂ < m₃ + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + 1 ∨ m₁ * m₂ = m₃ + 1)m₄:ℕn₄:ℕhm:2 ≤ m₃ + 1 + (m₄ + 1)h₂:Reachable (m₄ + 1) (n₄ + 1)ih₂:2 ≤ m₄ + 1 →
∃ m₁,
∃ (_ : m₁ < m₄ + 1),
∃ m₂,
∃ (_ : m₂ < m₄ + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₄ + 1 ∨ m₁ * m₂ = m₄ + 1)⊢ n₄ + 1 < n₃ + 1 + (n₄ + 1) omega All goals completed! 🐙
| @mul m₃ m₄ n₃ n₄ h₁ h₂ ih₁ ih₂ => mul m:ℕn:ℕm₃:ℕm₄:ℕn₃:ℕn₄:ℕh₁:Reachable m₃ n₃h₂:Reachable m₄ n₄ih₁:2 ≤ m₃ →
∃ m₁,
∃ (_ : m₁ < m₃),
∃ m₂,
∃ (_ : m₂ < m₃),
∃ n₁,
∃ (_ : n₁ < n₃),
∃ n₂, ∃ (_ : n₂ < n₃), n₁ + n₂ = n₃ ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ ∨ m₁ * m₂ = m₃)ih₂:2 ≤ m₄ →
∃ m₁,
∃ (_ : m₁ < m₄),
∃ m₂,
∃ (_ : m₂ < m₄),
∃ n₁,
∃ (_ : n₁ < n₄),
∃ n₂, ∃ (_ : n₂ < n₄), n₁ + n₂ = n₄ ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₄ ∨ m₁ * m₂ = m₄)hm:2 ≤ m₃ * m₄⊢ ∃ m₁,
∃ (_ : m₁ < m₃ * m₄),
∃ m₂,
∃ (_ : m₂ < m₃ * m₄),
∃ n₁,
∃ (_ : n₁ < n₃ + n₄),
∃ n₂,
∃ (_ : n₂ < n₃ + n₄),
n₁ + n₂ = n₃ + n₄ ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ * m₄ ∨ m₁ * m₂ = m₃ * m₄)
obtain ⟨m₃, n₃, rfl, rfl⟩ := h₁.dec mul m:ℕn:ℕm₄:ℕn₄:ℕh₂:Reachable m₄ n₄ih₂:2 ≤ m₄ →
∃ m₁,
∃ (_ : m₁ < m₄),
∃ m₂,
∃ (_ : m₂ < m₄),
∃ n₁,
∃ (_ : n₁ < n₄),
∃ n₂, ∃ (_ : n₂ < n₄), n₁ + n₂ = n₄ ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₄ ∨ m₁ * m₂ = m₄)m₃:ℕn₃:ℕhm:2 ≤ (m₃ + 1) * m₄h₁:Reachable (m₃ + 1) (n₃ + 1)ih₁:2 ≤ m₃ + 1 →
∃ m₁,
∃ (_ : m₁ < m₃ + 1),
∃ m₂,
∃ (_ : m₂ < m₃ + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + 1 ∨ m₁ * m₂ = m₃ + 1)⊢ ∃ m₁,
∃ (_ : m₁ < (m₃ + 1) * m₄),
∃ m₂,
∃ (_ : m₂ < (m₃ + 1) * m₄),
∃ n₁,
∃ (_ : n₁ < n₃ + 1 + n₄),
∃ n₂,
∃ (_ : n₂ < n₃ + 1 + n₄),
n₁ + n₂ = n₃ + 1 + n₄ ∧
Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = (m₃ + 1) * m₄ ∨ m₁ * m₂ = (m₃ + 1) * m₄)
obtain ⟨m₄, n₄, rfl, rfl⟩ := h₂.dec mul m:ℕn:ℕm₃:ℕn₃:ℕh₁:Reachable (m₃ + 1) (n₃ + 1)ih₁:2 ≤ m₃ + 1 →
∃ m₁,
∃ (_ : m₁ < m₃ + 1),
∃ m₂,
∃ (_ : m₂ < m₃ + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + 1 ∨ m₁ * m₂ = m₃ + 1)m₄:ℕn₄:ℕhm:2 ≤ (m₃ + 1) * (m₄ + 1)h₂:Reachable (m₄ + 1) (n₄ + 1)ih₂:2 ≤ m₄ + 1 →
∃ m₁,
∃ (_ : m₁ < m₄ + 1),
∃ m₂,
∃ (_ : m₂ < m₄ + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₄ + 1 ∨ m₁ * m₂ = m₄ + 1)⊢ ∃ m₁,
∃ (_ : m₁ < (m₃ + 1) * (m₄ + 1)),
∃ m₂,
∃ (_ : m₂ < (m₃ + 1) * (m₄ + 1)),
∃ n₁,
∃ (_ : n₁ < n₃ + 1 + (n₄ + 1)),
∃ n₂,
∃ (_ : n₂ < n₃ + 1 + (n₄ + 1)),
n₁ + n₂ = n₃ + 1 + (n₄ + 1) ∧
Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = (m₃ + 1) * (m₄ + 1) ∨ m₁ * m₂ = (m₃ + 1) * (m₄ + 1))
obtain _ | m₃ := m₃ mul.zero m:ℕn:ℕn₃:ℕm₄:ℕn₄:ℕh₂:Reachable (m₄ + 1) (n₄ + 1)ih₂:2 ≤ m₄ + 1 →
∃ m₁,
∃ (_ : m₁ < m₄ + 1),
∃ m₂,
∃ (_ : m₂ < m₄ + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₄ + 1 ∨ m₁ * m₂ = m₄ + 1)h₁:Reachable (0 + 1) (n₃ + 1)ih₁:2 ≤ 0 + 1 →
∃ m₁,
∃ (_ : m₁ < 0 + 1),
∃ m₂,
∃ (_ : m₂ < 0 + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = 0 + 1 ∨ m₁ * m₂ = 0 + 1)hm:2 ≤ (0 + 1) * (m₄ + 1)⊢ ∃ m₁,
∃ (_ : m₁ < (0 + 1) * (m₄ + 1)),
∃ m₂,
∃ (_ : m₂ < (0 + 1) * (m₄ + 1)),
∃ n₁,
∃ (_ : n₁ < n₃ + 1 + (n₄ + 1)),
∃ n₂,
∃ (_ : n₂ < n₃ + 1 + (n₄ + 1)),
n₁ + n₂ = n₃ + 1 + (n₄ + 1) ∧
Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = (0 + 1) * (m₄ + 1) ∨ m₁ * m₂ = (0 + 1) * (m₄ + 1))mul.succ m:ℕn:ℕn₃:ℕm₄:ℕn₄:ℕh₂:Reachable (m₄ + 1) (n₄ + 1)ih₂:2 ≤ m₄ + 1 →
∃ m₁,
∃ (_ : m₁ < m₄ + 1),
∃ m₂,
∃ (_ : m₂ < m₄ + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₄ + 1 ∨ m₁ * m₂ = m₄ + 1)m₃:ℕh₁:Reachable (m₃ + 1 + 1) (n₃ + 1)ih₁:2 ≤ m₃ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₃ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₃ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + 1 + 1 ∨ m₁ * m₂ = m₃ + 1 + 1)hm:2 ≤ (m₃ + 1 + 1) * (m₄ + 1)⊢ ∃ m₁,
∃ (_ : m₁ < (m₃ + 1 + 1) * (m₄ + 1)),
∃ m₂,
∃ (_ : m₂ < (m₃ + 1 + 1) * (m₄ + 1)),
∃ n₁,
∃ (_ : n₁ < n₃ + 1 + (n₄ + 1)),
∃ n₂,
∃ (_ : n₂ < n₃ + 1 + (n₄ + 1)),
n₁ + n₂ = n₃ + 1 + (n₄ + 1) ∧
Reachable m₁ n₁ ∧
Reachable m₂ n₂ ∧ (m₁ + m₂ = (m₃ + 1 + 1) * (m₄ + 1) ∨ m₁ * m₂ = (m₃ + 1 + 1) * (m₄ + 1))
· mul.zero m:ℕn:ℕn₃:ℕm₄:ℕn₄:ℕh₂:Reachable (m₄ + 1) (n₄ + 1)ih₂:2 ≤ m₄ + 1 →
∃ m₁,
∃ (_ : m₁ < m₄ + 1),
∃ m₂,
∃ (_ : m₂ < m₄ + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₄ + 1 ∨ m₁ * m₂ = m₄ + 1)h₁:Reachable (0 + 1) (n₃ + 1)ih₁:2 ≤ 0 + 1 →
∃ m₁,
∃ (_ : m₁ < 0 + 1),
∃ m₂,
∃ (_ : m₂ < 0 + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = 0 + 1 ∨ m₁ * m₂ = 0 + 1)hm:2 ≤ (0 + 1) * (m₄ + 1)⊢ ∃ m₁,
∃ (_ : m₁ < (0 + 1) * (m₄ + 1)),
∃ m₂,
∃ (_ : m₂ < (0 + 1) * (m₄ + 1)),
∃ n₁,
∃ (_ : n₁ < n₃ + 1 + (n₄ + 1)),
∃ n₂,
∃ (_ : n₂ < n₃ + 1 + (n₄ + 1)),
n₁ + n₂ = n₃ + 1 + (n₄ + 1) ∧
Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = (0 + 1) * (m₄ + 1) ∨ m₁ * m₂ = (0 + 1) * (m₄ + 1)) obtain ⟨m₅, hm₅, m₆, hm₆, n₅, hn₅, n₆, hn₆, h₃, h₄, h₅, h₆⟩ := ih₂ (by m:ℕn:ℕn₃:ℕm₄:ℕn₄:ℕh₂:Reachable (m₄ + 1) (n₄ + 1)ih₂:2 ≤ m₄ + 1 →
∃ m₁,
∃ (_ : m₁ < m₄ + 1),
∃ m₂,
∃ (_ : m₂ < m₄ + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₄ + 1 ∨ m₁ * m₂ = m₄ + 1)h₁:Reachable (0 + 1) (n₃ + 1)ih₁:2 ≤ 0 + 1 →
∃ m₁,
∃ (_ : m₁ < 0 + 1),
∃ m₂,
∃ (_ : m₂ < 0 + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = 0 + 1 ∨ m₁ * m₂ = 0 + 1)hm:2 ≤ (0 + 1) * (m₄ + 1)⊢ 2 ≤ m₄ + 1 mul.zero m:ℕn:ℕn₃:ℕm₄:ℕn₄:ℕh₂:Reachable (m₄ + 1) (n₄ + 1)ih₂:2 ≤ m₄ + 1 →
∃ m₁,
∃ (_ : m₁ < m₄ + 1),
∃ m₂,
∃ (_ : m₂ < m₄ + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₄ + 1 ∨ m₁ * m₂ = m₄ + 1)h₁:Reachable (0 + 1) (n₃ + 1)ih₁:2 ≤ 0 + 1 →
∃ m₁,
∃ (_ : m₁ < 0 + 1),
∃ m₂,
∃ (_ : m₂ < 0 + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = 0 + 1 ∨ m₁ * m₂ = 0 + 1)hm:2 ≤ (0 + 1) * (m₄ + 1)m₅:ℕhm₅:m₅ < m₄ + 1m₆:ℕhm₆:m₆ < m₄ + 1n₅:ℕhn₅:n₅ < n₄ + 1n₆:ℕhn₆:n₆ < n₄ + 1h₃:n₅ + n₆ = n₄ + 1h₄:Reachable m₅ n₅h₅:Reachable m₆ n₆h₆:m₅ + m₆ = m₄ + 1 ∨ m₅ * m₆ = m₄ + 1⊢ ∃ m₁,
∃ (_ : m₁ < (0 + 1) * (m₄ + 1)),
∃ m₂,
∃ (_ : m₂ < (0 + 1) * (m₄ + 1)),
∃ n₁,
∃ (_ : n₁ < n₃ + 1 + (n₄ + 1)),
∃ n₂,
∃ (_ : n₂ < n₃ + 1 + (n₄ + 1)),
n₁ + n₂ = n₃ + 1 + (n₄ + 1) ∧
Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = (0 + 1) * (m₄ + 1) ∨ m₁ * m₂ = (0 + 1) * (m₄ + 1)) omega All goals completed! 🐙 mul.zero m:ℕn:ℕn₃:ℕm₄:ℕn₄:ℕh₂:Reachable (m₄ + 1) (n₄ + 1)ih₂:2 ≤ m₄ + 1 →
∃ m₁,
∃ (_ : m₁ < m₄ + 1),
∃ m₂,
∃ (_ : m₂ < m₄ + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₄ + 1 ∨ m₁ * m₂ = m₄ + 1)h₁:Reachable (0 + 1) (n₃ + 1)ih₁:2 ≤ 0 + 1 →
∃ m₁,
∃ (_ : m₁ < 0 + 1),
∃ m₂,
∃ (_ : m₂ < 0 + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = 0 + 1 ∨ m₁ * m₂ = 0 + 1)hm:2 ≤ (0 + 1) * (m₄ + 1)m₅:ℕhm₅:m₅ < m₄ + 1m₆:ℕhm₆:m₆ < m₄ + 1n₅:ℕhn₅:n₅ < n₄ + 1n₆:ℕhn₆:n₆ < n₄ + 1h₃:n₅ + n₆ = n₄ + 1h₄:Reachable m₅ n₅h₅:Reachable m₆ n₆h₆:m₅ + m₆ = m₄ + 1 ∨ m₅ * m₆ = m₄ + 1⊢ ∃ m₁,
∃ (_ : m₁ < (0 + 1) * (m₄ + 1)),
∃ m₂,
∃ (_ : m₂ < (0 + 1) * (m₄ + 1)),
∃ n₁,
∃ (_ : n₁ < n₃ + 1 + (n₄ + 1)),
∃ n₂,
∃ (_ : n₂ < n₃ + 1 + (n₄ + 1)),
n₁ + n₂ = n₃ + 1 + (n₄ + 1) ∧
Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = (0 + 1) * (m₄ + 1) ∨ m₁ * m₂ = (0 + 1) * (m₄ + 1)))mul.zero m:ℕn:ℕn₃:ℕm₄:ℕn₄:ℕh₂:Reachable (m₄ + 1) (n₄ + 1)ih₂:2 ≤ m₄ + 1 →
∃ m₁,
∃ (_ : m₁ < m₄ + 1),
∃ m₂,
∃ (_ : m₂ < m₄ + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₄ + 1 ∨ m₁ * m₂ = m₄ + 1)h₁:Reachable (0 + 1) (n₃ + 1)ih₁:2 ≤ 0 + 1 →
∃ m₁,
∃ (_ : m₁ < 0 + 1),
∃ m₂,
∃ (_ : m₂ < 0 + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = 0 + 1 ∨ m₁ * m₂ = 0 + 1)hm:2 ≤ (0 + 1) * (m₄ + 1)m₅:ℕhm₅:m₅ < m₄ + 1m₆:ℕhm₆:m₆ < m₄ + 1n₅:ℕhn₅:n₅ < n₄ + 1n₆:ℕhn₆:n₆ < n₄ + 1h₃:n₅ + n₆ = n₄ + 1h₄:Reachable m₅ n₅h₅:Reachable m₆ n₆h₆:m₅ + m₆ = m₄ + 1 ∨ m₅ * m₆ = m₄ + 1⊢ ∃ m₁,
∃ (_ : m₁ < (0 + 1) * (m₄ + 1)),
∃ m₂,
∃ (_ : m₂ < (0 + 1) * (m₄ + 1)),
∃ n₁,
∃ (_ : n₁ < n₃ + 1 + (n₄ + 1)),
∃ n₂,
∃ (_ : n₂ < n₃ + 1 + (n₄ + 1)),
n₁ + n₂ = n₃ + 1 + (n₄ + 1) ∧
Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = (0 + 1) * (m₄ + 1) ∨ m₁ * m₂ = (0 + 1) * (m₄ + 1))
refine ⟨m₅, ?_, m₆, ?_, n₅+n₃+1, ?_, n₆, ?_, by m:ℕn:ℕn₃:ℕm₄:ℕn₄:ℕh₂:Reachable (m₄ + 1) (n₄ + 1)ih₂:2 ≤ m₄ + 1 →
∃ m₁,
∃ (_ : m₁ < m₄ + 1),
∃ m₂,
∃ (_ : m₂ < m₄ + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₄ + 1 ∨ m₁ * m₂ = m₄ + 1)h₁:Reachable (0 + 1) (n₃ + 1)ih₁:2 ≤ 0 + 1 →
∃ m₁,
∃ (_ : m₁ < 0 + 1),
∃ m₂,
∃ (_ : m₂ < 0 + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = 0 + 1 ∨ m₁ * m₂ = 0 + 1)hm:2 ≤ (0 + 1) * (m₄ + 1)m₅:ℕhm₅:m₅ < m₄ + 1m₆:ℕhm₆:m₆ < m₄ + 1n₅:ℕhn₅:n₅ < n₄ + 1n₆:ℕhn₆:n₆ < n₄ + 1h₃:n₅ + n₆ = n₄ + 1h₄:Reachable m₅ n₅h₅:Reachable m₆ n₆h₆:m₅ + m₆ = m₄ + 1 ∨ m₅ * m₆ = m₄ + 1⊢ n₅ + n₃ + 1 + n₆ = n₃ + 1 + (n₄ + 1) rw [← h₃ m:ℕn:ℕn₃:ℕm₄:ℕn₄:ℕh₂:Reachable (m₄ + 1) (n₄ + 1)ih₂:2 ≤ m₄ + 1 →
∃ m₁,
∃ (_ : m₁ < m₄ + 1),
∃ m₂,
∃ (_ : m₂ < m₄ + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₄ + 1 ∨ m₁ * m₂ = m₄ + 1)h₁:Reachable (0 + 1) (n₃ + 1)ih₁:2 ≤ 0 + 1 →
∃ m₁,
∃ (_ : m₁ < 0 + 1),
∃ m₂,
∃ (_ : m₂ < 0 + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = 0 + 1 ∨ m₁ * m₂ = 0 + 1)hm:2 ≤ (0 + 1) * (m₄ + 1)m₅:ℕhm₅:m₅ < m₄ + 1m₆:ℕhm₆:m₆ < m₄ + 1n₅:ℕhn₅:n₅ < n₄ + 1n₆:ℕhn₆:n₆ < n₄ + 1h₃:n₅ + n₆ = n₄ + 1h₄:Reachable m₅ n₅h₅:Reachable m₆ n₆h₆:m₅ + m₆ = m₄ + 1 ∨ m₅ * m₆ = m₄ + 1⊢ n₅ + n₃ + 1 + n₆ = n₃ + 1 + (n₅ + n₆) m:ℕn:ℕn₃:ℕm₄:ℕn₄:ℕh₂:Reachable (m₄ + 1) (n₄ + 1)ih₂:2 ≤ m₄ + 1 →
∃ m₁,
∃ (_ : m₁ < m₄ + 1),
∃ m₂,
∃ (_ : m₂ < m₄ + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₄ + 1 ∨ m₁ * m₂ = m₄ + 1)h₁:Reachable (0 + 1) (n₃ + 1)ih₁:2 ≤ 0 + 1 →
∃ m₁,
∃ (_ : m₁ < 0 + 1),
∃ m₂,
∃ (_ : m₂ < 0 + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = 0 + 1 ∨ m₁ * m₂ = 0 + 1)hm:2 ≤ (0 + 1) * (m₄ + 1)m₅:ℕhm₅:m₅ < m₄ + 1m₆:ℕhm₆:m₆ < m₄ + 1n₅:ℕhn₅:n₅ < n₄ + 1n₆:ℕhn₆:n₆ < n₄ + 1h₃:n₅ + n₆ = n₄ + 1h₄:Reachable m₅ n₅h₅:Reachable m₆ n₆h₆:m₅ + m₆ = m₄ + 1 ∨ m₅ * m₆ = m₄ + 1⊢ n₅ + n₃ + 1 + n₆ = n₃ + 1 + (n₅ + n₆)] m:ℕn:ℕn₃:ℕm₄:ℕn₄:ℕh₂:Reachable (m₄ + 1) (n₄ + 1)ih₂:2 ≤ m₄ + 1 →
∃ m₁,
∃ (_ : m₁ < m₄ + 1),
∃ m₂,
∃ (_ : m₂ < m₄ + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₄ + 1 ∨ m₁ * m₂ = m₄ + 1)h₁:Reachable (0 + 1) (n₃ + 1)ih₁:2 ≤ 0 + 1 →
∃ m₁,
∃ (_ : m₁ < 0 + 1),
∃ m₂,
∃ (_ : m₂ < 0 + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = 0 + 1 ∨ m₁ * m₂ = 0 + 1)hm:2 ≤ (0 + 1) * (m₄ + 1)m₅:ℕhm₅:m₅ < m₄ + 1m₆:ℕhm₆:m₆ < m₄ + 1n₅:ℕhn₅:n₅ < n₄ + 1n₆:ℕhn₆:n₆ < n₄ + 1h₃:n₅ + n₆ = n₄ + 1h₄:Reachable m₅ n₅h₅:Reachable m₆ n₆h₆:m₅ + m₆ = m₄ + 1 ∨ m₅ * m₆ = m₄ + 1⊢ n₅ + n₃ + 1 + n₆ = n₃ + 1 + (n₅ + n₆); ring All goals completed! 🐙, h₄.le ?_, h₅, ?_⟩
all_goals omega All goals completed! 🐙
obtain _ | m₄ := m₄ mul.succ.zero m:ℕn:ℕn₃:ℕn₄:ℕm₃:ℕh₁:Reachable (m₃ + 1 + 1) (n₃ + 1)ih₁:2 ≤ m₃ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₃ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₃ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + 1 + 1 ∨ m₁ * m₂ = m₃ + 1 + 1)h₂:Reachable (0 + 1) (n₄ + 1)ih₂:2 ≤ 0 + 1 →
∃ m₁,
∃ (_ : m₁ < 0 + 1),
∃ m₂,
∃ (_ : m₂ < 0 + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = 0 + 1 ∨ m₁ * m₂ = 0 + 1)hm:2 ≤ (m₃ + 1 + 1) * (0 + 1)⊢ ∃ m₁,
∃ (_ : m₁ < (m₃ + 1 + 1) * (0 + 1)),
∃ m₂,
∃ (_ : m₂ < (m₃ + 1 + 1) * (0 + 1)),
∃ n₁,
∃ (_ : n₁ < n₃ + 1 + (n₄ + 1)),
∃ n₂,
∃ (_ : n₂ < n₃ + 1 + (n₄ + 1)),
n₁ + n₂ = n₃ + 1 + (n₄ + 1) ∧
Reachable m₁ n₁ ∧
Reachable m₂ n₂ ∧ (m₁ + m₂ = (m₃ + 1 + 1) * (0 + 1) ∨ m₁ * m₂ = (m₃ + 1 + 1) * (0 + 1))mul.succ.succ m:ℕn:ℕn₃:ℕn₄:ℕm₃:ℕh₁:Reachable (m₃ + 1 + 1) (n₃ + 1)ih₁:2 ≤ m₃ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₃ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₃ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + 1 + 1 ∨ m₁ * m₂ = m₃ + 1 + 1)m₄:ℕh₂:Reachable (m₄ + 1 + 1) (n₄ + 1)ih₂:2 ≤ m₄ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₄ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₄ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₄ + 1 + 1 ∨ m₁ * m₂ = m₄ + 1 + 1)hm:2 ≤ (m₃ + 1 + 1) * (m₄ + 1 + 1)⊢ ∃ m₁,
∃ (_ : m₁ < (m₃ + 1 + 1) * (m₄ + 1 + 1)),
∃ m₂,
∃ (_ : m₂ < (m₃ + 1 + 1) * (m₄ + 1 + 1)),
∃ n₁,
∃ (_ : n₁ < n₃ + 1 + (n₄ + 1)),
∃ n₂,
∃ (_ : n₂ < n₃ + 1 + (n₄ + 1)),
n₁ + n₂ = n₃ + 1 + (n₄ + 1) ∧
Reachable m₁ n₁ ∧
Reachable m₂ n₂ ∧ (m₁ + m₂ = (m₃ + 1 + 1) * (m₄ + 1 + 1) ∨ m₁ * m₂ = (m₃ + 1 + 1) * (m₄ + 1 + 1))
· mul.succ.zero m:ℕn:ℕn₃:ℕn₄:ℕm₃:ℕh₁:Reachable (m₃ + 1 + 1) (n₃ + 1)ih₁:2 ≤ m₃ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₃ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₃ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + 1 + 1 ∨ m₁ * m₂ = m₃ + 1 + 1)h₂:Reachable (0 + 1) (n₄ + 1)ih₂:2 ≤ 0 + 1 →
∃ m₁,
∃ (_ : m₁ < 0 + 1),
∃ m₂,
∃ (_ : m₂ < 0 + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = 0 + 1 ∨ m₁ * m₂ = 0 + 1)hm:2 ≤ (m₃ + 1 + 1) * (0 + 1)⊢ ∃ m₁,
∃ (_ : m₁ < (m₃ + 1 + 1) * (0 + 1)),
∃ m₂,
∃ (_ : m₂ < (m₃ + 1 + 1) * (0 + 1)),
∃ n₁,
∃ (_ : n₁ < n₃ + 1 + (n₄ + 1)),
∃ n₂,
∃ (_ : n₂ < n₃ + 1 + (n₄ + 1)),
n₁ + n₂ = n₃ + 1 + (n₄ + 1) ∧
Reachable m₁ n₁ ∧
Reachable m₂ n₂ ∧ (m₁ + m₂ = (m₃ + 1 + 1) * (0 + 1) ∨ m₁ * m₂ = (m₃ + 1 + 1) * (0 + 1)) obtain ⟨m₅, hm₅, m₆, hm₆, n₅, hn₅, n₆, hn₆, h₃, h₄, h₅, h₆⟩ := ih₁ (by m:ℕn:ℕn₃:ℕn₄:ℕm₃:ℕh₁:Reachable (m₃ + 1 + 1) (n₃ + 1)ih₁:2 ≤ m₃ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₃ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₃ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + 1 + 1 ∨ m₁ * m₂ = m₃ + 1 + 1)h₂:Reachable (0 + 1) (n₄ + 1)ih₂:2 ≤ 0 + 1 →
∃ m₁,
∃ (_ : m₁ < 0 + 1),
∃ m₂,
∃ (_ : m₂ < 0 + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = 0 + 1 ∨ m₁ * m₂ = 0 + 1)hm:2 ≤ (m₃ + 1 + 1) * (0 + 1)⊢ 2 ≤ m₃ + 1 + 1 mul.succ.zero m:ℕn:ℕn₃:ℕn₄:ℕm₃:ℕh₁:Reachable (m₃ + 1 + 1) (n₃ + 1)ih₁:2 ≤ m₃ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₃ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₃ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + 1 + 1 ∨ m₁ * m₂ = m₃ + 1 + 1)h₂:Reachable (0 + 1) (n₄ + 1)ih₂:2 ≤ 0 + 1 →
∃ m₁,
∃ (_ : m₁ < 0 + 1),
∃ m₂,
∃ (_ : m₂ < 0 + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = 0 + 1 ∨ m₁ * m₂ = 0 + 1)hm:2 ≤ (m₃ + 1 + 1) * (0 + 1)m₅:ℕhm₅:m₅ < m₃ + 1 + 1m₆:ℕhm₆:m₆ < m₃ + 1 + 1n₅:ℕhn₅:n₅ < n₃ + 1n₆:ℕhn₆:n₆ < n₃ + 1h₃:n₅ + n₆ = n₃ + 1h₄:Reachable m₅ n₅h₅:Reachable m₆ n₆h₆:m₅ + m₆ = m₃ + 1 + 1 ∨ m₅ * m₆ = m₃ + 1 + 1⊢ ∃ m₁,
∃ (_ : m₁ < (m₃ + 1 + 1) * (0 + 1)),
∃ m₂,
∃ (_ : m₂ < (m₃ + 1 + 1) * (0 + 1)),
∃ n₁,
∃ (_ : n₁ < n₃ + 1 + (n₄ + 1)),
∃ n₂,
∃ (_ : n₂ < n₃ + 1 + (n₄ + 1)),
n₁ + n₂ = n₃ + 1 + (n₄ + 1) ∧
Reachable m₁ n₁ ∧
Reachable m₂ n₂ ∧ (m₁ + m₂ = (m₃ + 1 + 1) * (0 + 1) ∨ m₁ * m₂ = (m₃ + 1 + 1) * (0 + 1)) omega All goals completed! 🐙mul.succ.zero m:ℕn:ℕn₃:ℕn₄:ℕm₃:ℕh₁:Reachable (m₃ + 1 + 1) (n₃ + 1)ih₁:2 ≤ m₃ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₃ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₃ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + 1 + 1 ∨ m₁ * m₂ = m₃ + 1 + 1)h₂:Reachable (0 + 1) (n₄ + 1)ih₂:2 ≤ 0 + 1 →
∃ m₁,
∃ (_ : m₁ < 0 + 1),
∃ m₂,
∃ (_ : m₂ < 0 + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = 0 + 1 ∨ m₁ * m₂ = 0 + 1)hm:2 ≤ (m₃ + 1 + 1) * (0 + 1)m₅:ℕhm₅:m₅ < m₃ + 1 + 1m₆:ℕhm₆:m₆ < m₃ + 1 + 1n₅:ℕhn₅:n₅ < n₃ + 1n₆:ℕhn₆:n₆ < n₃ + 1h₃:n₅ + n₆ = n₃ + 1h₄:Reachable m₅ n₅h₅:Reachable m₆ n₆h₆:m₅ + m₆ = m₃ + 1 + 1 ∨ m₅ * m₆ = m₃ + 1 + 1⊢ ∃ m₁,
∃ (_ : m₁ < (m₃ + 1 + 1) * (0 + 1)),
∃ m₂,
∃ (_ : m₂ < (m₃ + 1 + 1) * (0 + 1)),
∃ n₁,
∃ (_ : n₁ < n₃ + 1 + (n₄ + 1)),
∃ n₂,
∃ (_ : n₂ < n₃ + 1 + (n₄ + 1)),
n₁ + n₂ = n₃ + 1 + (n₄ + 1) ∧
Reachable m₁ n₁ ∧
Reachable m₂ n₂ ∧ (m₁ + m₂ = (m₃ + 1 + 1) * (0 + 1) ∨ m₁ * m₂ = (m₃ + 1 + 1) * (0 + 1)))mul.succ.zero m:ℕn:ℕn₃:ℕn₄:ℕm₃:ℕh₁:Reachable (m₃ + 1 + 1) (n₃ + 1)ih₁:2 ≤ m₃ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₃ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₃ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + 1 + 1 ∨ m₁ * m₂ = m₃ + 1 + 1)h₂:Reachable (0 + 1) (n₄ + 1)ih₂:2 ≤ 0 + 1 →
∃ m₁,
∃ (_ : m₁ < 0 + 1),
∃ m₂,
∃ (_ : m₂ < 0 + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = 0 + 1 ∨ m₁ * m₂ = 0 + 1)hm:2 ≤ (m₃ + 1 + 1) * (0 + 1)m₅:ℕhm₅:m₅ < m₃ + 1 + 1m₆:ℕhm₆:m₆ < m₃ + 1 + 1n₅:ℕhn₅:n₅ < n₃ + 1n₆:ℕhn₆:n₆ < n₃ + 1h₃:n₅ + n₆ = n₃ + 1h₄:Reachable m₅ n₅h₅:Reachable m₆ n₆h₆:m₅ + m₆ = m₃ + 1 + 1 ∨ m₅ * m₆ = m₃ + 1 + 1⊢ ∃ m₁,
∃ (_ : m₁ < (m₃ + 1 + 1) * (0 + 1)),
∃ m₂,
∃ (_ : m₂ < (m₃ + 1 + 1) * (0 + 1)),
∃ n₁,
∃ (_ : n₁ < n₃ + 1 + (n₄ + 1)),
∃ n₂,
∃ (_ : n₂ < n₃ + 1 + (n₄ + 1)),
n₁ + n₂ = n₃ + 1 + (n₄ + 1) ∧
Reachable m₁ n₁ ∧
Reachable m₂ n₂ ∧ (m₁ + m₂ = (m₃ + 1 + 1) * (0 + 1) ∨ m₁ * m₂ = (m₃ + 1 + 1) * (0 + 1))
refine ⟨m₅, ?_, m₆, ?_, n₅, ?_, n₆+n₄+1, ?_, by m:ℕn:ℕn₃:ℕn₄:ℕm₃:ℕh₁:Reachable (m₃ + 1 + 1) (n₃ + 1)ih₁:2 ≤ m₃ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₃ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₃ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + 1 + 1 ∨ m₁ * m₂ = m₃ + 1 + 1)h₂:Reachable (0 + 1) (n₄ + 1)ih₂:2 ≤ 0 + 1 →
∃ m₁,
∃ (_ : m₁ < 0 + 1),
∃ m₂,
∃ (_ : m₂ < 0 + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = 0 + 1 ∨ m₁ * m₂ = 0 + 1)hm:2 ≤ (m₃ + 1 + 1) * (0 + 1)m₅:ℕhm₅:m₅ < m₃ + 1 + 1m₆:ℕhm₆:m₆ < m₃ + 1 + 1n₅:ℕhn₅:n₅ < n₃ + 1n₆:ℕhn₆:n₆ < n₃ + 1h₃:n₅ + n₆ = n₃ + 1h₄:Reachable m₅ n₅h₅:Reachable m₆ n₆h₆:m₅ + m₆ = m₃ + 1 + 1 ∨ m₅ * m₆ = m₃ + 1 + 1⊢ n₅ + (n₆ + n₄ + 1) = n₃ + 1 + (n₄ + 1) rw [← h₃ m:ℕn:ℕn₃:ℕn₄:ℕm₃:ℕh₁:Reachable (m₃ + 1 + 1) (n₃ + 1)ih₁:2 ≤ m₃ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₃ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₃ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + 1 + 1 ∨ m₁ * m₂ = m₃ + 1 + 1)h₂:Reachable (0 + 1) (n₄ + 1)ih₂:2 ≤ 0 + 1 →
∃ m₁,
∃ (_ : m₁ < 0 + 1),
∃ m₂,
∃ (_ : m₂ < 0 + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = 0 + 1 ∨ m₁ * m₂ = 0 + 1)hm:2 ≤ (m₃ + 1 + 1) * (0 + 1)m₅:ℕhm₅:m₅ < m₃ + 1 + 1m₆:ℕhm₆:m₆ < m₃ + 1 + 1n₅:ℕhn₅:n₅ < n₃ + 1n₆:ℕhn₆:n₆ < n₃ + 1h₃:n₅ + n₆ = n₃ + 1h₄:Reachable m₅ n₅h₅:Reachable m₆ n₆h₆:m₅ + m₆ = m₃ + 1 + 1 ∨ m₅ * m₆ = m₃ + 1 + 1⊢ n₅ + (n₆ + n₄ + 1) = n₅ + n₆ + (n₄ + 1) m:ℕn:ℕn₃:ℕn₄:ℕm₃:ℕh₁:Reachable (m₃ + 1 + 1) (n₃ + 1)ih₁:2 ≤ m₃ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₃ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₃ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + 1 + 1 ∨ m₁ * m₂ = m₃ + 1 + 1)h₂:Reachable (0 + 1) (n₄ + 1)ih₂:2 ≤ 0 + 1 →
∃ m₁,
∃ (_ : m₁ < 0 + 1),
∃ m₂,
∃ (_ : m₂ < 0 + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = 0 + 1 ∨ m₁ * m₂ = 0 + 1)hm:2 ≤ (m₃ + 1 + 1) * (0 + 1)m₅:ℕhm₅:m₅ < m₃ + 1 + 1m₆:ℕhm₆:m₆ < m₃ + 1 + 1n₅:ℕhn₅:n₅ < n₃ + 1n₆:ℕhn₆:n₆ < n₃ + 1h₃:n₅ + n₆ = n₃ + 1h₄:Reachable m₅ n₅h₅:Reachable m₆ n₆h₆:m₅ + m₆ = m₃ + 1 + 1 ∨ m₅ * m₆ = m₃ + 1 + 1⊢ n₅ + (n₆ + n₄ + 1) = n₅ + n₆ + (n₄ + 1)] m:ℕn:ℕn₃:ℕn₄:ℕm₃:ℕh₁:Reachable (m₃ + 1 + 1) (n₃ + 1)ih₁:2 ≤ m₃ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₃ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₃ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + 1 + 1 ∨ m₁ * m₂ = m₃ + 1 + 1)h₂:Reachable (0 + 1) (n₄ + 1)ih₂:2 ≤ 0 + 1 →
∃ m₁,
∃ (_ : m₁ < 0 + 1),
∃ m₂,
∃ (_ : m₂ < 0 + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = 0 + 1 ∨ m₁ * m₂ = 0 + 1)hm:2 ≤ (m₃ + 1 + 1) * (0 + 1)m₅:ℕhm₅:m₅ < m₃ + 1 + 1m₆:ℕhm₆:m₆ < m₃ + 1 + 1n₅:ℕhn₅:n₅ < n₃ + 1n₆:ℕhn₆:n₆ < n₃ + 1h₃:n₅ + n₆ = n₃ + 1h₄:Reachable m₅ n₅h₅:Reachable m₆ n₆h₆:m₅ + m₆ = m₃ + 1 + 1 ∨ m₅ * m₆ = m₃ + 1 + 1⊢ n₅ + (n₆ + n₄ + 1) = n₅ + n₆ + (n₄ + 1); ring All goals completed! 🐙, h₄, h₅.le ?_, ?_⟩
all_goals omega All goals completed! 🐙
refine ⟨m₃+2, ?_, m₄+2, ?_, _, ?_, _, ?_, rfl, h₁, h₂, .inr rfl⟩ mul.succ.succ.refine_1 m:ℕn:ℕn₃:ℕn₄:ℕm₃:ℕh₁:Reachable (m₃ + 1 + 1) (n₃ + 1)ih₁:2 ≤ m₃ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₃ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₃ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + 1 + 1 ∨ m₁ * m₂ = m₃ + 1 + 1)m₄:ℕh₂:Reachable (m₄ + 1 + 1) (n₄ + 1)ih₂:2 ≤ m₄ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₄ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₄ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₄ + 1 + 1 ∨ m₁ * m₂ = m₄ + 1 + 1)hm:2 ≤ (m₃ + 1 + 1) * (m₄ + 1 + 1)⊢ m₃ + 2 < (m₃ + 1 + 1) * (m₄ + 1 + 1)mul.succ.succ.refine_2 m:ℕn:ℕn₃:ℕn₄:ℕm₃:ℕh₁:Reachable (m₃ + 1 + 1) (n₃ + 1)ih₁:2 ≤ m₃ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₃ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₃ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + 1 + 1 ∨ m₁ * m₂ = m₃ + 1 + 1)m₄:ℕh₂:Reachable (m₄ + 1 + 1) (n₄ + 1)ih₂:2 ≤ m₄ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₄ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₄ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₄ + 1 + 1 ∨ m₁ * m₂ = m₄ + 1 + 1)hm:2 ≤ (m₃ + 1 + 1) * (m₄ + 1 + 1)⊢ m₄ + 2 < (m₃ + 1 + 1) * (m₄ + 1 + 1)mul.succ.succ.refine_3 m:ℕn:ℕn₃:ℕn₄:ℕm₃:ℕh₁:Reachable (m₃ + 1 + 1) (n₃ + 1)ih₁:2 ≤ m₃ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₃ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₃ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + 1 + 1 ∨ m₁ * m₂ = m₃ + 1 + 1)m₄:ℕh₂:Reachable (m₄ + 1 + 1) (n₄ + 1)ih₂:2 ≤ m₄ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₄ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₄ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₄ + 1 + 1 ∨ m₁ * m₂ = m₄ + 1 + 1)hm:2 ≤ (m₃ + 1 + 1) * (m₄ + 1 + 1)⊢ n₃ + 1 < n₃ + 1 + (n₄ + 1)mul.succ.succ.refine_4 m:ℕn:ℕn₃:ℕn₄:ℕm₃:ℕh₁:Reachable (m₃ + 1 + 1) (n₃ + 1)ih₁:2 ≤ m₃ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₃ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₃ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + 1 + 1 ∨ m₁ * m₂ = m₃ + 1 + 1)m₄:ℕh₂:Reachable (m₄ + 1 + 1) (n₄ + 1)ih₂:2 ≤ m₄ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₄ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₄ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₄ + 1 + 1 ∨ m₁ * m₂ = m₄ + 1 + 1)hm:2 ≤ (m₃ + 1 + 1) * (m₄ + 1 + 1)⊢ n₄ + 1 < n₃ + 1 + (n₄ + 1)
· mul.succ.succ.refine_1 m:ℕn:ℕn₃:ℕn₄:ℕm₃:ℕh₁:Reachable (m₃ + 1 + 1) (n₃ + 1)ih₁:2 ≤ m₃ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₃ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₃ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + 1 + 1 ∨ m₁ * m₂ = m₃ + 1 + 1)m₄:ℕh₂:Reachable (m₄ + 1 + 1) (n₄ + 1)ih₂:2 ≤ m₄ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₄ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₄ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₄ + 1 + 1 ∨ m₁ * m₂ = m₄ + 1 + 1)hm:2 ≤ (m₃ + 1 + 1) * (m₄ + 1 + 1)⊢ m₃ + 2 < (m₃ + 1 + 1) * (m₄ + 1 + 1) refine (Nat.lt_mul_iff_one_lt_right ?_).2 ?_ mul.succ.succ.refine_1.refine_1 m:ℕn:ℕn₃:ℕn₄:ℕm₃:ℕh₁:Reachable (m₃ + 1 + 1) (n₃ + 1)ih₁:2 ≤ m₃ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₃ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₃ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + 1 + 1 ∨ m₁ * m₂ = m₃ + 1 + 1)m₄:ℕh₂:Reachable (m₄ + 1 + 1) (n₄ + 1)ih₂:2 ≤ m₄ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₄ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₄ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₄ + 1 + 1 ∨ m₁ * m₂ = m₄ + 1 + 1)hm:2 ≤ (m₃ + 1 + 1) * (m₄ + 1 + 1)⊢ 0 < m₃ + 2mul.succ.succ.refine_1.refine_2 m:ℕn:ℕn₃:ℕn₄:ℕm₃:ℕh₁:Reachable (m₃ + 1 + 1) (n₃ + 1)ih₁:2 ≤ m₃ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₃ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₃ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + 1 + 1 ∨ m₁ * m₂ = m₃ + 1 + 1)m₄:ℕh₂:Reachable (m₄ + 1 + 1) (n₄ + 1)ih₂:2 ≤ m₄ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₄ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₄ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₄ + 1 + 1 ∨ m₁ * m₂ = m₄ + 1 + 1)hm:2 ≤ (m₃ + 1 + 1) * (m₄ + 1 + 1)⊢ 1 < m₄ + 1 + 1 <;> mul.succ.succ.refine_1.refine_1 m:ℕn:ℕn₃:ℕn₄:ℕm₃:ℕh₁:Reachable (m₃ + 1 + 1) (n₃ + 1)ih₁:2 ≤ m₃ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₃ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₃ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + 1 + 1 ∨ m₁ * m₂ = m₃ + 1 + 1)m₄:ℕh₂:Reachable (m₄ + 1 + 1) (n₄ + 1)ih₂:2 ≤ m₄ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₄ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₄ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₄ + 1 + 1 ∨ m₁ * m₂ = m₄ + 1 + 1)hm:2 ≤ (m₃ + 1 + 1) * (m₄ + 1 + 1)⊢ 0 < m₃ + 2mul.succ.succ.refine_1.refine_2 m:ℕn:ℕn₃:ℕn₄:ℕm₃:ℕh₁:Reachable (m₃ + 1 + 1) (n₃ + 1)ih₁:2 ≤ m₃ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₃ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₃ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + 1 + 1 ∨ m₁ * m₂ = m₃ + 1 + 1)m₄:ℕh₂:Reachable (m₄ + 1 + 1) (n₄ + 1)ih₂:2 ≤ m₄ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₄ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₄ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₄ + 1 + 1 ∨ m₁ * m₂ = m₄ + 1 + 1)hm:2 ≤ (m₃ + 1 + 1) * (m₄ + 1 + 1)⊢ 1 < m₄ + 1 + 1 omega All goals completed! 🐙
· mul.succ.succ.refine_2 m:ℕn:ℕn₃:ℕn₄:ℕm₃:ℕh₁:Reachable (m₃ + 1 + 1) (n₃ + 1)ih₁:2 ≤ m₃ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₃ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₃ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + 1 + 1 ∨ m₁ * m₂ = m₃ + 1 + 1)m₄:ℕh₂:Reachable (m₄ + 1 + 1) (n₄ + 1)ih₂:2 ≤ m₄ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₄ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₄ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₄ + 1 + 1 ∨ m₁ * m₂ = m₄ + 1 + 1)hm:2 ≤ (m₃ + 1 + 1) * (m₄ + 1 + 1)⊢ m₄ + 2 < (m₃ + 1 + 1) * (m₄ + 1 + 1) refine (Nat.lt_mul_iff_one_lt_left ?_).2 ?_ mul.succ.succ.refine_2.refine_1 m:ℕn:ℕn₃:ℕn₄:ℕm₃:ℕh₁:Reachable (m₃ + 1 + 1) (n₃ + 1)ih₁:2 ≤ m₃ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₃ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₃ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + 1 + 1 ∨ m₁ * m₂ = m₃ + 1 + 1)m₄:ℕh₂:Reachable (m₄ + 1 + 1) (n₄ + 1)ih₂:2 ≤ m₄ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₄ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₄ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₄ + 1 + 1 ∨ m₁ * m₂ = m₄ + 1 + 1)hm:2 ≤ (m₃ + 1 + 1) * (m₄ + 1 + 1)⊢ 0 < m₄ + 2mul.succ.succ.refine_2.refine_2 m:ℕn:ℕn₃:ℕn₄:ℕm₃:ℕh₁:Reachable (m₃ + 1 + 1) (n₃ + 1)ih₁:2 ≤ m₃ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₃ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₃ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + 1 + 1 ∨ m₁ * m₂ = m₃ + 1 + 1)m₄:ℕh₂:Reachable (m₄ + 1 + 1) (n₄ + 1)ih₂:2 ≤ m₄ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₄ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₄ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₄ + 1 + 1 ∨ m₁ * m₂ = m₄ + 1 + 1)hm:2 ≤ (m₃ + 1 + 1) * (m₄ + 1 + 1)⊢ 1 < m₃ + 1 + 1 <;> mul.succ.succ.refine_2.refine_1 m:ℕn:ℕn₃:ℕn₄:ℕm₃:ℕh₁:Reachable (m₃ + 1 + 1) (n₃ + 1)ih₁:2 ≤ m₃ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₃ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₃ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + 1 + 1 ∨ m₁ * m₂ = m₃ + 1 + 1)m₄:ℕh₂:Reachable (m₄ + 1 + 1) (n₄ + 1)ih₂:2 ≤ m₄ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₄ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₄ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₄ + 1 + 1 ∨ m₁ * m₂ = m₄ + 1 + 1)hm:2 ≤ (m₃ + 1 + 1) * (m₄ + 1 + 1)⊢ 0 < m₄ + 2mul.succ.succ.refine_2.refine_2 m:ℕn:ℕn₃:ℕn₄:ℕm₃:ℕh₁:Reachable (m₃ + 1 + 1) (n₃ + 1)ih₁:2 ≤ m₃ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₃ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₃ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₃ + 1),
∃ n₂,
∃ (_ : n₂ < n₃ + 1),
n₁ + n₂ = n₃ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₃ + 1 + 1 ∨ m₁ * m₂ = m₃ + 1 + 1)m₄:ℕh₂:Reachable (m₄ + 1 + 1) (n₄ + 1)ih₂:2 ≤ m₄ + 1 + 1 →
∃ m₁,
∃ (_ : m₁ < m₄ + 1 + 1),
∃ m₂,
∃ (_ : m₂ < m₄ + 1 + 1),
∃ n₁,
∃ (_ : n₁ < n₄ + 1),
∃ n₂,
∃ (_ : n₂ < n₄ + 1),
n₁ + n₂ = n₄ + 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m₄ + 1 + 1 ∨ m₁ * m₂ = m₄ + 1 + 1)hm:2 ≤ (m₃ + 1 + 1) * (m₄ + 1 + 1)⊢ 1 < m₃ + 1 + 1 omega All goals completed! 🐙
all_goals omega All goals completed! 🐙
Auxiliary decision procedure for Reachable, taking a fuel argument f bounding m.
reachable_iff_of_two_le reduces Reachable m n for 2 ≤ m to statements Reachable m' n' with
m' < m, so one unit of fuel per unit of m always suffices. Recursing on the fuel rather than on
m makes this structural, so Reachable.decide below avoids well-founded recursion.
def Reachable.decAux : ∀ (f m n : ℕ), m ≤ f → Decidable (Reachable m n)
| _, 0, n, _ => isFalse (not_reachable_zero_fst n)
| _, 1, 0, _ => isFalse (not_reachable_zero_snd 1)
| _, 1, _ + 1, _ => isTrue (Reachable.one.le (by x✝¹:ℕn✝:ℕx✝:1 ≤ x✝¹⊢ 1 ≤ n✝ + 1 lia All goals completed! 🐙))
| 0, _ + 2, _, hf => absurd hf (by n✝:ℕx✝:ℕhf:n✝ + 2 ≤ 0⊢ ¬n✝ + 2 ≤ 0 lia All goals completed! 🐙)
| f + 1, m + 2, n, hf => f:ℕm:ℕn:ℕhf:m + 2 ≤ f + 1⊢ Decidable (Reachable (m + 2) n) by f:ℕm:ℕn:ℕhf:m + 2 ≤ f + 1⊢ Decidable (Reachable (m + 2) n)
let d : ∀ {m₁} (h : m₁ < m + 2) {n}, Decidable (Reachable m₁ n) :=
fun h ↦ Reachable.decAux f _ _ (by f:ℕm:ℕn:ℕhf:m + 2 ≤ f + 1m₁✝:ℕh:m₁✝ < m + 2n✝:ℕ⊢ m₁✝ ≤ f f:ℕm:ℕn:ℕhf:m + 2 ≤ f + 1d:{m₁ : ℕ} → m₁ < m + 2 → {n : ℕ} → Decidable (Reachable m₁ n) := fun {m₁} h {n} ↦ decAux f m₁ n ⋯⊢ Decidable (Reachable (m + 2) n) lia All goals completed! 🐙 f:ℕm:ℕn:ℕhf:m + 2 ≤ f + 1d:{m₁ : ℕ} → m₁ < m + 2 → {n : ℕ} → Decidable (Reachable m₁ n) := fun {m₁} h {n} ↦ decAux f m₁ n ⋯⊢ Decidable (Reachable (m + 2) n)) f:ℕm:ℕn:ℕhf:m + 2 ≤ f + 1d:{m₁ : ℕ} → m₁ < m + 2 → {n : ℕ} → Decidable (Reachable m₁ n) := fun {m₁} h {n} ↦ decAux f m₁ n ⋯⊢ Decidable (Reachable (m + 2) n)
refine @decidable_of_iff' _ _ (reachable_iff_of_two_le (m+2) n (by f:ℕm:ℕn:ℕhf:m + 2 ≤ f + 1d:{m₁ : ℕ} → m₁ < m + 2 → {n : ℕ} → Decidable (Reachable m₁ n) := fun {m₁} h {n} ↦ decAux f m₁ n ⋯⊢ 2 ≤ m + 2 lia All goals completed! 🐙)) ?_
refine Nat.decidableExistsLT' (I := fun m₁ hm₁ ↦ ?_) f:ℕm:ℕn:ℕhf:m + 2 ≤ f + 1d:{m₁ : ℕ} → m₁ < m + 2 → {n : ℕ} → Decidable (Reachable m₁ n) := fun {m₁} h {n} ↦ decAux f m₁ n ⋯m₁:ℕhm₁:m₁ < m + 2⊢ Decidable
(∃ m₂,
∃ (_ : m₂ < m + 2),
∃ n₁,
∃ (_ : n₁ < n),
∃ n₂, ∃ (_ : n₂ < n), n₁ + n₂ = n ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m + 2 ∨ m₁ * m₂ = m + 2))
refine Nat.decidableExistsLT' (I := fun m₂ hm₂ ↦ ?_) f:ℕm:ℕn:ℕhf:m + 2 ≤ f + 1d:{m₁ : ℕ} → m₁ < m + 2 → {n : ℕ} → Decidable (Reachable m₁ n) := fun {m₁} h {n} ↦ decAux f m₁ n ⋯m₁:ℕhm₁:m₁ < m + 2m₂:ℕhm₂:m₂ < m + 2⊢ Decidable
(∃ n₁,
∃ (_ : n₁ < n),
∃ n₂, ∃ (_ : n₂ < n), n₁ + n₂ = n ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m + 2 ∨ m₁ * m₂ = m + 2))
refine Nat.decidableExistsLT' (I := fun n₁ hn₁ ↦ ?_) f:ℕm:ℕn:ℕhf:m + 2 ≤ f + 1d:{m₁ : ℕ} → m₁ < m + 2 → {n : ℕ} → Decidable (Reachable m₁ n) := fun {m₁} h {n} ↦ decAux f m₁ n ⋯m₁:ℕhm₁:m₁ < m + 2m₂:ℕhm₂:m₂ < m + 2n₁:ℕhn₁:n₁ < n⊢ Decidable (∃ n₂, ∃ (_ : n₂ < n), n₁ + n₂ = n ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m + 2 ∨ m₁ * m₂ = m + 2))
refine Nat.decidableExistsLT' (I := fun n₂ hn₂ ↦ ?_) f:ℕm:ℕn:ℕhf:m + 2 ≤ f + 1d:{m₁ : ℕ} → m₁ < m + 2 → {n : ℕ} → Decidable (Reachable m₁ n) := fun {m₁} h {n} ↦ decAux f m₁ n ⋯m₁:ℕhm₁:m₁ < m + 2m₂:ℕhm₂:m₂ < m + 2n₁:ℕhn₁:n₁ < nn₂:ℕhn₂:n₂ < n⊢ Decidable (n₁ + n₂ = n ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m + 2 ∨ m₁ * m₂ = m + 2))
refine instDecidableAnd (dq := ?_) f:ℕm:ℕn:ℕhf:m + 2 ≤ f + 1d:{m₁ : ℕ} → m₁ < m + 2 → {n : ℕ} → Decidable (Reachable m₁ n) := fun {m₁} h {n} ↦ decAux f m₁ n ⋯m₁:ℕhm₁:m₁ < m + 2m₂:ℕhm₂:m₂ < m + 2n₁:ℕhn₁:n₁ < nn₂:ℕhn₂:n₂ < n⊢ Decidable (Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = m + 2 ∨ m₁ * m₂ = m + 2))
refine instDecidableAnd (dp := d hm₁) (dq := ?_) f:ℕm:ℕn:ℕhf:m + 2 ≤ f + 1d:{m₁ : ℕ} → m₁ < m + 2 → {n : ℕ} → Decidable (Reachable m₁ n) := fun {m₁} h {n} ↦ decAux f m₁ n ⋯m₁:ℕhm₁:m₁ < m + 2m₂:ℕhm₂:m₂ < m + 2n₁:ℕhn₁:n₁ < nn₂:ℕhn₂:n₂ < n⊢ Decidable (Reachable m₂ n₂ ∧ (m₁ + m₂ = m + 2 ∨ m₁ * m₂ = m + 2))
exact instDecidableAnd (dp := d hm₂) All goals completed! 🐙
termination_by structural f => finstance Reachable.decide (m n : ℕ) : Decidable (Reachable m n) := Reachable.decAux m m n le_rfl
The (Mahler-Popken) complexity of n:
the minimum number of 1s needed to express a given number using only addition and
multiplication. E.g. 2 = 1 + 1, so complexity 2 = 2.
def complexity (n : ℕ) : ℕ :=
if h : n = 0 then 0 else Nat.find ⟨n, Reachable.self n <| n.pos_of_ne_zero h⟩@[category test, AMS 11]
theorem Reachable.complexity_le {m n : ℕ} (h : Reachable m n) : complexity m ≤ n := by m:ℕn:ℕh:Reachable m n⊢ complexity m ≤ n
unfold complexity m:ℕn:ℕh:Reachable m n⊢ (if h : m = 0 then 0 else Nat.find ⋯) ≤ n
split_ifs with h' pos m:ℕn:ℕh:Reachable m nh':m = 0⊢ 0 ≤ nneg m:ℕn:ℕh:Reachable m nh':¬m = 0⊢ Nat.find ⋯ ≤ n
· pos m:ℕn:ℕh:Reachable m nh':m = 0⊢ 0 ≤ n subst h' pos n:ℕh:Reachable 0 n⊢ 0 ≤ n; exact absurd h (not_reachable_zero_fst n) All goals completed! 🐙
exact Nat.find_min' _ h All goals completed! 🐙@[category test, AMS 11]
theorem Reachable.complexity_eq {m n : ℕ} (h : Reachable m n)
(min : ∀ n' < n, ¬ Reachable m n') : complexity m = n := by m:ℕn:ℕh:Reachable m nmin:∀ n' < n, ¬Reachable m n'⊢ complexity m = n
refine le_antisymm h.complexity_le ?_ m:ℕn:ℕh:Reachable m nmin:∀ n' < n, ¬Reachable m n'⊢ n ≤ complexity m
unfold complexity m:ℕn:ℕh:Reachable m nmin:∀ n' < n, ¬Reachable m n'⊢ n ≤ if h : m = 0 then 0 else Nat.find ⋯
split_ifs with h' pos m:ℕn:ℕh:Reachable m nmin:∀ n' < n, ¬Reachable m n'h':m = 0⊢ n ≤ 0neg m:ℕn:ℕh:Reachable m nmin:∀ n' < n, ¬Reachable m n'h':¬m = 0⊢ n ≤ Nat.find ⋯
· pos m:ℕn:ℕh:Reachable m nmin:∀ n' < n, ¬Reachable m n'h':m = 0⊢ n ≤ 0 subst h' pos n:ℕh:Reachable 0 nmin:∀ n' < n, ¬Reachable 0 n'⊢ n ≤ 0; exact absurd h (not_reachable_zero_fst n) All goals completed! 🐙
exact (Nat.le_find_iff _ _).2 min All goals completed! 🐙
@[category test, AMS 11]
theorem Reachable.complexity {n : ℕ} (hn : 0 < n) : Reachable n (complexity n) := by n:ℕhn:0 < n⊢ Reachable n (Mathoverflow75792.complexity n)
unfold Mathoverflow75792.complexity n:ℕhn:0 < n⊢ Reachable n (if h : n = 0 then 0 else Nat.find ⋯)
rw [dif_neg (ne_of_gt hn) n:ℕhn:0 < n⊢ Reachable n (Nat.find ⋯) n:ℕhn:0 < n⊢ Reachable n (Nat.find ⋯)] n:ℕhn:0 < n⊢ Reachable n (Nat.find ⋯)
exact Nat.find_spec _ All goals completed! 🐙@[category test, AMS 11]
theorem complexity_zero : complexity 0 = 0 := rfl
@[category test, AMS 11]
theorem complexity_one : complexity 1 = 1 :=
Reachable.one.complexity_eq fun n' hn' ↦ by n':ℕhn':n' < 1⊢ ¬Reachable 1 n'
have : n' = 0 := by omega n':ℕhn':n' < 1this:n' = 0⊢ ¬Reachable 1 n' n':ℕhn':n' < 1this:n' = 0⊢ ¬Reachable 1 n'
subst this hn':0 < 1⊢ ¬Reachable 1 0; exact not_reachable_zero_snd 1 All goals completed! 🐙
@[category test, AMS 11]
theorem complexity_two : complexity 2 = 2 :=
(Reachable.add .one .one).complexity_eq fun n' hn' ↦ by n':ℕhn':n' < 1 + 1⊢ ¬Reachable (1 + 1) n'
interval_cases n' «0» n':ℕhn':0 < 1 + 1⊢ ¬Reachable (1 + 1) 0«1» n':ℕhn':1 < 1 + 1⊢ ¬Reachable (1 + 1) 1
· «0» n':ℕhn':0 < 1 + 1⊢ ¬Reachable (1 + 1) 0 exact not_reachable_zero_snd 2 All goals completed! 🐙
· «1» n':ℕhn':1 < 1 + 1⊢ ¬Reachable (1 + 1) 1 rw [reachable_iff_of_two_le 2 1 (by n':ℕhn':1 < 1 + 1⊢ 2 ≤ 2 «1» n':ℕhn':1 < 1 + 1⊢ ¬∃ m₁,
∃ (_ : m₁ < 2),
∃ m₂,
∃ (_ : m₂ < 2),
∃ n₁,
∃ (_ : n₁ < 1),
∃ n₂, ∃ (_ : n₂ < 1), n₁ + n₂ = 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = 2 ∨ m₁ * m₂ = 2) omega All goals completed! 🐙 «1» n':ℕhn':1 < 1 + 1⊢ ¬∃ m₁,
∃ (_ : m₁ < 2),
∃ m₂,
∃ (_ : m₂ < 2),
∃ n₁,
∃ (_ : n₁ < 1),
∃ n₂, ∃ (_ : n₂ < 1), n₁ + n₂ = 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = 2 ∨ m₁ * m₂ = 2))]«1» n':ℕhn':1 < 1 + 1⊢ ¬∃ m₁,
∃ (_ : m₁ < 2),
∃ m₂,
∃ (_ : m₂ < 2),
∃ n₁,
∃ (_ : n₁ < 1),
∃ n₂, ∃ (_ : n₂ < 1), n₁ + n₂ = 1 ∧ Reachable m₁ n₁ ∧ Reachable m₂ n₂ ∧ (m₁ + m₂ = 2 ∨ m₁ * m₂ = 2)
rintro ⟨m₁, hm₁, m₂, hm₂, n₁, hn₁, n₂, hn₂, h₁, -⟩ «1» n':ℕhn':1 < 1 + 1m₁:ℕhm₁:m₁ < 2m₂:ℕhm₂:m₂ < 2n₁:ℕhn₁:n₁ < 1n₂:ℕhn₂:n₂ < 1h₁:n₁ + n₂ = 1⊢ False
omega All goals completed! 🐙@[category test, AMS 11]
theorem Reachable.pow (m n : ℕ) (hm : 0 < m) (hn : 0 < n) : Reachable (m ^ n) (m * n) := by m:ℕn:ℕhm:0 < mhn:0 < n⊢ Reachable (m ^ n) (m * n)
induction hn with
| refl => refl m:ℕn:ℕhm:0 < m⊢ Reachable (m ^ Nat.succ 0) (m * Nat.succ 0) convert Reachable.self m hm e'_1 m:ℕn:ℕhm:0 < m⊢ m ^ Nat.succ 0 = me'_2 m:ℕn:ℕhm:0 < m⊢ m * Nat.succ 0 = m <;> e'_1 m:ℕn:ℕhm:0 < m⊢ m ^ Nat.succ 0 = me'_2 m:ℕn:ℕhm:0 < m⊢ m * Nat.succ 0 = m simp All goals completed! 🐙
| step hn ih => step m:ℕn:ℕhm:0 < mm✝:ℕhn:(Nat.succ 0).le m✝ih:Reachable (m ^ m✝) (m * m✝)⊢ Reachable (m ^ m✝.succ) (m * m✝.succ) exact .mul ih (.self m hm) All goals completed! 🐙@[category test, AMS 11]
theorem Reachable.pow' (m n : ℕ+) : Reachable (m ^ (n : ℕ) : ℕ) (m * n) :=
.pow _ _ m.pos n.pos
5^6 = 15625 = 1 + 2^3 * 3^2 * (1 + 2^3 * 3^3)!
@[category test, AMS 11]
theorem Reachable.five_pow_six : Reachable (5^6) 29 :=
have h8 : Reachable 8 6 := .pow' 2 3
have h9 : Reachable 9 6 := .pow' 3 2
have h27 : Reachable 27 9 := .pow' 3 3
.add .one <| .mul h8 <| .mul h9 <| .add .one <| .mul h8 h27
Is 5n the complexity of 5^n for 0 < n? Answer: No.
@[category research solved, AMS 11]
theorem complexity_five_pow : answer(False) ↔ ∀ n : ℕ, 0 < n → complexity (5 ^ n) = 5 * n := by ⊢ False ↔ ∀ (n : ℕ), 0 < n → complexity (5 ^ n) = 5 * n
show False ↔ _ ⊢ False ↔ ∀ (n : ℕ), 0 < n → complexity (5 ^ n) = 5 * n
simp [false_iff, not_forall] ⊢ ∃ x, 0 < x ∧ ¬complexity (5 ^ x) = 5 * x
exact ⟨6, by ⊢ 0 < 6 decide All goals completed! 🐙, fun h ↦ absurd (h ▸ Reachable.five_pow_six.complexity_le) (by h:complexity (5 ^ 6) = 5 * 6⊢ ¬5 * 6 ≤ 29 decide All goals completed! 🐙)⟩
Is 3n the complexity of 3^n for 0 < n? Answer: Yes, by John Selfridge.
Reference: https://arxiv.org/abs/1207.4841
@[category research solved, AMS 11]
theorem complexity_three_pow : answer(True) ↔ ∀ n : ℕ, 0 < n → complexity (3 ^ n) = 3 * n := by ⊢ True ↔ ∀ (n : ℕ), 0 < n → complexity (3 ^ n) = 3 * n
sorry All goals completed! 🐙
Is 2n the complexity of 2^n for 0 < n?
@[category research open, AMS 11]
theorem complexity_two_pow : answer(sorry) ↔ ∀ n : ℕ, 0 < n → complexity (2 ^ n) = 2 * n := by ⊢ True ↔ ∀ (n : ℕ), 0 < n → complexity (2 ^ n) = 2 * n
sorry All goals completed! 🐙end Mathoverflow75792