Imports
/-
Copyright (c) 2026 Terence Rokop. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Terence Rokop
-/
module
public import Geb.Prototypes.Computability.BitTree.Elias.MachineModelset_option doc.verso trueSpace and transition accounting for the Elias scanner
The scalar phase and its two binary words advance together. Their lengths grow by at most one per input bit, bounding both work space and the cost of each complete bit transition.
Main definitions
-
accountrecords scalar state and binary words at each input boundary. -
runCostsums the machine's transition costs.
Tags
Elias delta code, complexity, binary counter
@[expose] public sectionnamespace Geb.BitTree.Elias.MachineBinary-word updates implement the scalar phase update.
theorem words_step (s : Scanner.State) (bs cs : List Bool) (b : Bool)
(ha : Scanner.Active s) (hw : Words s.1 bs cs) :
Words (Scanner.step s b).1 (nextWords s.1 bs cs b).1 (nextWords s.1 bs cs b).2 := s:Scanner.Statebs:List Boolcs:List Boolb:Boolha:Scanner.Active shw:Words s.1 bs cs⊢ Words (Scanner.step s b).1 (nextWords s.1 bs cs b).1 (nextWords s.1 bs cs b).2
bs:List Boolcs:List Boolb:Boolm:Scanner.Moden:ℕha:Scanner.Active (m, n)hw:Words (m, n).1 bs cs⊢ Words (Scanner.step (m, n) b).1 (nextWords (m, n).1 bs cs b).1 (nextWords (m, n).1 bs cs b).2
cases m with
bs:List Boolcs:List Boolb:Booln:ℕha:Scanner.Active (Scanner.Mode.tree, n)hw:Words (Scanner.Mode.tree, n).1 bs cs⊢ Words (Scanner.step (Scanner.Mode.tree, n) b).1 (nextWords (Scanner.Mode.tree, n).1 bs cs b).1
(nextWords (Scanner.Mode.tree, n).1 bs cs b).2 cases b with
bs:List Boolcs:List Booln:ℕha:Scanner.Active (Scanner.Mode.tree, n)hw:Words (Scanner.Mode.tree, n).1 bs cs⊢ Words (Scanner.step (Scanner.Mode.tree, n) false).1 (nextWords (Scanner.Mode.tree, n).1 bs cs false).1
(nextWords (Scanner.Mode.tree, n).1 bs cs false).2 All goals completed! 🐙
bs:List Boolcs:List Booln:ℕha:Scanner.Active (Scanner.Mode.tree, n)hw:Words (Scanner.Mode.tree, n).1 bs cs⊢ Words (Scanner.step (Scanner.Mode.tree, n) true).1 (nextWords (Scanner.Mode.tree, n).1 bs cs true).1
(nextWords (Scanner.Mode.tree, n).1 bs cs true).2 All goals completed! 🐙
bs:List Boolcs:List Boolb:Booln:ℕz:ℕha:Scanner.Active (Scanner.Mode.zeros z, n)hw:Words (Scanner.Mode.zeros z, n).1 bs cs⊢ Words (Scanner.step (Scanner.Mode.zeros z, n) b).1 (nextWords (Scanner.Mode.zeros z, n).1 bs cs b).1
(nextWords (Scanner.Mode.zeros z, n).1 bs cs b).2
cases b with
bs:List Boolcs:List Booln:ℕz:ℕha:Scanner.Active (Scanner.Mode.zeros z, n)hw:Words (Scanner.Mode.zeros z, n).1 bs cs⊢ Words (Scanner.step (Scanner.Mode.zeros z, n) false).1 (nextWords (Scanner.Mode.zeros z, n).1 bs cs false).1
(nextWords (Scanner.Mode.zeros z, n).1 bs cs false).2 All goals completed! 🐙
bs:List Boolcs:List Booln:ℕz:ℕha:Scanner.Active (Scanner.Mode.zeros z, n)hw:Words (Scanner.Mode.zeros z, n).1 bs cs⊢ Words (Scanner.step (Scanner.Mode.zeros z, n) true).1 (nextWords (Scanner.Mode.zeros z, n).1 bs cs true).1
(nextWords (Scanner.Mode.zeros z, n).1 bs cs true).2
bs:List Boolcs:List Booln:ℕz:ℕha:Scanner.Active (Scanner.Mode.zeros z, n)hw:Words (Scanner.Mode.zeros z, n).1 bs cshz:z = 0⊢ Words (Scanner.step (Scanner.Mode.zeros z, n) true).1 (nextWords (Scanner.Mode.zeros z, n).1 bs cs true).1
(nextWords (Scanner.Mode.zeros z, n).1 bs cs true).2bs:List Boolcs:List Booln:ℕz:ℕha:Scanner.Active (Scanner.Mode.zeros z, n)hw:Words (Scanner.Mode.zeros z, n).1 bs cshz:¬z = 0⊢ Words (Scanner.step (Scanner.Mode.zeros z, n) true).1 (nextWords (Scanner.Mode.zeros z, n).1 bs cs true).1
(nextWords (Scanner.Mode.zeros z, n).1 bs cs true).2
bs:List Boolcs:List Booln:ℕz:ℕha:Scanner.Active (Scanner.Mode.zeros z, n)hw:Words (Scanner.Mode.zeros z, n).1 bs cshz:z = 0⊢ Words (Scanner.step (Scanner.Mode.zeros z, n) true).1 (nextWords (Scanner.Mode.zeros z, n).1 bs cs true).1
(nextWords (Scanner.Mode.zeros z, n).1 bs cs true).2 bs:List Boolcs:List Booln:ℕz:ℕha:Scanner.Active (Scanner.Mode.zeros z, n)hw:Words (Scanner.Mode.zeros z, n).1 bs cshz:z = 0⊢ Words (Scanner.finish n).1 [] []
bs:List Boolcs:List Booln:ℕz:ℕha:Scanner.Active (Scanner.Mode.zeros z, n)hw:Words (Scanner.Mode.zeros z, n).1 bs cshz:z = 0⊢ Words (if n = 1 then (Scanner.Mode.done, 0) else (Scanner.Mode.tree, n - 1)).1 [] []
bs:List Boolcs:List Booln:ℕz:ℕha:Scanner.Active (Scanner.Mode.zeros z, n)hw:Words (Scanner.Mode.zeros z, n).1 bs cshz:z = 0h✝:n = 1⊢ Words (Scanner.Mode.done, 0).1 [] []bs:List Boolcs:List Booln:ℕz:ℕha:Scanner.Active (Scanner.Mode.zeros z, n)hw:Words (Scanner.Mode.zeros z, n).1 bs cshz:z = 0h✝:¬n = 1⊢ Words (Scanner.Mode.tree, n - 1).1 [] [] bs:List Boolcs:List Booln:ℕz:ℕha:Scanner.Active (Scanner.Mode.zeros z, n)hw:Words (Scanner.Mode.zeros z, n).1 bs cshz:z = 0h✝:n = 1⊢ Words (Scanner.Mode.done, 0).1 [] []bs:List Boolcs:List Booln:ℕz:ℕha:Scanner.Active (Scanner.Mode.zeros z, n)hw:Words (Scanner.Mode.zeros z, n).1 bs cshz:z = 0h✝:¬n = 1⊢ Words (Scanner.Mode.tree, n - 1).1 [] [] All goals completed! 🐙
bs:List Boolcs:List Booln:ℕz:ℕha:Scanner.Active (Scanner.Mode.zeros z, n)hw:Words (Scanner.Mode.zeros z, n).1 bs cshz:¬z = 0⊢ Words (Scanner.step (Scanner.Mode.zeros z, n) true).1 (nextWords (Scanner.Mode.zeros z, n).1 bs cs true).1
(nextWords (Scanner.Mode.zeros z, n).1 bs cs true).2 bs:List Boolcs:List Booln:ℕz:ℕha:Scanner.Active (Scanner.Mode.zeros z, n)hw:Words (Scanner.Mode.zeros z, n).1 bs cshz:¬z = 0⊢ Counter.value [true] = 1 ∧ cs = [true]
All goals completed! 🐙
bs:List Boolcs:List Boolb:Booln:ℕr:ℕv:ℕha:Scanner.Active (Scanner.Mode.size r v, n)hw:Words (Scanner.Mode.size r v, n).1 bs cs⊢ Words (Scanner.step (Scanner.Mode.size r v, n) b).1 (nextWords (Scanner.Mode.size r v, n).1 bs cs b).1
(nextWords (Scanner.Mode.size r v, n).1 bs cs b).2
bs:List Boolcs:List Boolb:Booln:ℕr:ℕv:ℕhw:Words (Scanner.Mode.size r v, n).1 bs cshn:0 < nhr:0 < rhv:0 < v⊢ Words (Scanner.step (Scanner.Mode.size r v, n) b).1 (nextWords (Scanner.Mode.size r v, n).1 bs cs b).1
(nextWords (Scanner.Mode.size r v, n).1 bs cs b).2
bs:List Boolcs:List Boolb:Booln:ℕr:ℕv:ℕhn:0 < nhr:0 < rhv:0 < vhb:Counter.value bs = vhc:cs = [true]⊢ Words (Scanner.step (Scanner.Mode.size r v, n) b).1 (nextWords (Scanner.Mode.size r v, n).1 bs cs b).1
(nextWords (Scanner.Mode.size r v, n).1 bs cs b).2
size bs:List Boolcs:List Boolb:Booln:ℕr:ℕv:ℕhn:0 < nhr:0 < rhv:0 < vhb:Counter.value bs = vhc:cs = [true]hp:0 < Counter.value (b :: bs)⊢ Words (Scanner.step (Scanner.Mode.size r v, n) b).1 (nextWords (Scanner.Mode.size r v, n).1 bs cs b).1
(nextWords (Scanner.Mode.size r v, n).1 bs cs b).2
by_cases he : r = 1 pos bs:List Boolcs:List Boolb:Booln:ℕr:ℕv:ℕhn:0 < nhr:0 < rhv:0 < vhb:Counter.value bs = vhc:cs = [true]hp:0 < Counter.value (b :: bs)he:r = 1⊢ Words (Scanner.step (Scanner.Mode.size r v, n) b).1 (nextWords (Scanner.Mode.size r v, n).1 bs cs b).1
(nextWords (Scanner.Mode.size r v, n).1 bs cs b).2neg bs:List Boolcs:List Boolb:Booln:ℕr:ℕv:ℕhn:0 < nhr:0 < rhv:0 < vhb:Counter.value bs = vhc:cs = [true]hp:0 < Counter.value (b :: bs)he:¬r = 1⊢ Words (Scanner.step (Scanner.Mode.size r v, n) b).1 (nextWords (Scanner.Mode.size r v, n).1 bs cs b).1
(nextWords (Scanner.Mode.size r v, n).1 bs cs b).2
· pos bs:List Boolcs:List Boolb:Booln:ℕr:ℕv:ℕhn:0 < nhr:0 < rhv:0 < vhb:Counter.value bs = vhc:cs = [true]hp:0 < Counter.value (b :: bs)he:r = 1⊢ Words (Scanner.step (Scanner.Mode.size r v, n) b).1 (nextWords (Scanner.Mode.size r v, n).1 bs cs b).1
(nextWords (Scanner.Mode.size r v, n).1 bs cs b).2 simp only [Scanner.step, nextWords, he, ↓reduceIte, Words,
Counter.value_decrement _ hp, Counter.value_cons, hb, hc, Nat.bit_val] pos bs:List Boolcs:List Boolb:Booln:ℕr:ℕv:ℕhn:0 < nhr:0 < rhv:0 < vhb:Counter.value bs = vhc:cs = [true]hp:0 < Counter.value (b :: bs)he:r = 1⊢ True ∧ 2 * Counter.value [] + true.toNat = 1
exact ⟨trivial, rfl⟩ All goals completed! 🐙
· neg bs:List Boolcs:List Boolb:Booln:ℕr:ℕv:ℕhn:0 < nhr:0 < rhv:0 < vhb:Counter.value bs = vhc:cs = [true]hp:0 < Counter.value (b :: bs)he:¬r = 1⊢ Words (Scanner.step (Scanner.Mode.size r v, n) b).1 (nextWords (Scanner.Mode.size r v, n).1 bs cs b).1
(nextWords (Scanner.Mode.size r v, n).1 bs cs b).2 simp only [Scanner.step, nextWords, he, ↓reduceIte, Words, Counter.value_cons,
hb, Nat.bit_val] neg bs:List Boolcs:List Boolb:Booln:ℕr:ℕv:ℕhn:0 < nhr:0 < rhv:0 < vhb:Counter.value bs = vhc:cs = [true]hp:0 < Counter.value (b :: bs)he:¬r = 1⊢ True ∧ cs = [true]
exact ⟨trivial, hc⟩ All goals completed! 🐙
| length r v => length bs:List Boolcs:List Boolb:Booln:ℕr:ℕv:ℕha:Scanner.Active (Scanner.Mode.length r v, n)hw:Words (Scanner.Mode.length r v, n).1 bs cs⊢ Words (Scanner.step (Scanner.Mode.length r v, n) b).1 (nextWords (Scanner.Mode.length r v, n).1 bs cs b).1
(nextWords (Scanner.Mode.length r v, n).1 bs cs b).2
obtain ⟨hn, hr, hv⟩ := ha length bs:List Boolcs:List Boolb:Booln:ℕr:ℕv:ℕhw:Words (Scanner.Mode.length r v, n).1 bs cshn:0 < nhr:0 < rhv:0 < v⊢ Words (Scanner.step (Scanner.Mode.length r v, n) b).1 (nextWords (Scanner.Mode.length r v, n).1 bs cs b).1
(nextWords (Scanner.Mode.length r v, n).1 bs cs b).2
obtain ⟨hb, hc⟩ := hw length bs:List Boolcs:List Boolb:Booln:ℕr:ℕv:ℕhn:0 < nhr:0 < rhv:0 < vhb:Counter.value bs = rhc:Counter.value cs = v⊢ Words (Scanner.step (Scanner.Mode.length r v, n) b).1 (nextWords (Scanner.Mode.length r v, n).1 bs cs b).1
(nextWords (Scanner.Mode.length r v, n).1 bs cs b).2
have hp : 0 < Counter.value (b :: cs) := by s:Scanner.Statebs:List Boolcs:List Boolb:Boolha:Scanner.Active shw:Words s.1 bs cs⊢ Words (Scanner.step s b).1 (nextWords s.1 bs cs b).1 (nextWords s.1 bs cs b).2
rw [Counter.value_cons, bs:List Boolcs:List Boolb:Booln:ℕr:ℕv:ℕhn:0 < nhr:0 < rhv:0 < vhb:Counter.value bs = rhc:Counter.value cs = v⊢ 0 < 2 * Counter.value cs + b.toNat hc bs:List Boolcs:List Boolb:Booln:ℕr:ℕv:ℕhn:0 < nhr:0 < rhv:0 < vhb:Counter.value bs = rhc:Counter.value cs = v⊢ 0 < 2 * v + b.toNat] bs:List Boolcs:List Boolb:Booln:ℕr:ℕv:ℕhn:0 < nhr:0 < rhv:0 < vhb:Counter.value bs = rhc:Counter.value cs = v⊢ 0 < 2 * v + b.toNat
omega length bs:List Boolcs:List Boolb:Booln:ℕr:ℕv:ℕhn:0 < nhr:0 < rhv:0 < vhb:Counter.value bs = rhc:Counter.value cs = vhp:0 < Counter.value (b :: cs)⊢ Words (Scanner.step (Scanner.Mode.length r v, n) b).1 (nextWords (Scanner.Mode.length r v, n).1 bs cs b).1
(nextWords (Scanner.Mode.length r v, n).1 bs cs b).2
have hbs : 0 < Counter.value bs := by s:Scanner.Statebs:List Boolcs:List Boolb:Boolha:Scanner.Active shw:Words s.1 bs cs⊢ Words (Scanner.step s b).1 (nextWords s.1 bs cs b).1 (nextWords s.1 bs cs b).2 rw [hb bs:List Boolcs:List Boolb:Booln:ℕr:ℕv:ℕhn:0 < nhr:0 < rhv:0 < vhb:Counter.value bs = rhc:Counter.value cs = vhp:0 < Counter.value (b :: cs)⊢ 0 < r] bs:List Boolcs:List Boolb:Booln:ℕr:ℕv:ℕhn:0 < nhr:0 < rhv:0 < vhb:Counter.value bs = rhc:Counter.value cs = vhp:0 < Counter.value (b :: cs)⊢ 0 < r; exact hr length bs:List Boolcs:List Boolb:Booln:ℕr:ℕv:ℕhn:0 < nhr:0 < rhv:0 < vhb:Counter.value bs = rhc:Counter.value cs = vhp:0 < Counter.value (b :: cs)hbs:0 < Counter.value bs⊢ Words (Scanner.step (Scanner.Mode.length r v, n) b).1 (nextWords (Scanner.Mode.length r v, n).1 bs cs b).1
(nextWords (Scanner.Mode.length r v, n).1 bs cs b).2
by_cases he : r = 1 pos bs:List Boolcs:List Boolb:Booln:ℕr:ℕv:ℕhn:0 < nhr:0 < rhv:0 < vhb:Counter.value bs = rhc:Counter.value cs = vhp:0 < Counter.value (b :: cs)hbs:0 < Counter.value bshe:r = 1⊢ Words (Scanner.step (Scanner.Mode.length r v, n) b).1 (nextWords (Scanner.Mode.length r v, n).1 bs cs b).1
(nextWords (Scanner.Mode.length r v, n).1 bs cs b).2neg bs:List Boolcs:List Boolb:Booln:ℕr:ℕv:ℕhn:0 < nhr:0 < rhv:0 < vhb:Counter.value bs = rhc:Counter.value cs = vhp:0 < Counter.value (b :: cs)hbs:0 < Counter.value bshe:¬r = 1⊢ Words (Scanner.step (Scanner.Mode.length r v, n) b).1 (nextWords (Scanner.Mode.length r v, n).1 bs cs b).1
(nextWords (Scanner.Mode.length r v, n).1 bs cs b).2
· pos bs:List Boolcs:List Boolb:Booln:ℕr:ℕv:ℕhn:0 < nhr:0 < rhv:0 < vhb:Counter.value bs = rhc:Counter.value cs = vhp:0 < Counter.value (b :: cs)hbs:0 < Counter.value bshe:r = 1⊢ Words (Scanner.step (Scanner.Mode.length r v, n) b).1 (nextWords (Scanner.Mode.length r v, n).1 bs cs b).1
(nextWords (Scanner.Mode.length r v, n).1 bs cs b).2 simp only [Scanner.step, nextWords, he, ↓reduceIte, Words,
Counter.value_decrement _ hbs, Counter.value_decrement _ hp,
Counter.value_cons, hb, hc, Nat.bit_val] pos bs:List Boolcs:List Boolb:Booln:ℕr:ℕv:ℕhn:0 < nhr:0 < rhv:0 < vhb:Counter.value bs = rhc:Counter.value cs = vhp:0 < Counter.value (b :: cs)hbs:0 < Counter.value bshe:r = 1⊢ True ∧ True
exact ⟨trivial, trivial⟩ All goals completed! 🐙
· neg bs:List Boolcs:List Boolb:Booln:ℕr:ℕv:ℕhn:0 < nhr:0 < rhv:0 < vhb:Counter.value bs = rhc:Counter.value cs = vhp:0 < Counter.value (b :: cs)hbs:0 < Counter.value bshe:¬r = 1⊢ Words (Scanner.step (Scanner.Mode.length r v, n) b).1 (nextWords (Scanner.Mode.length r v, n).1 bs cs b).1
(nextWords (Scanner.Mode.length r v, n).1 bs cs b).2 simp only [Scanner.step, nextWords, he, ↓reduceIte, Words,
Counter.value_decrement _ hbs, Counter.value_cons, hb, hc, Nat.bit_val] neg bs:List Boolcs:List Boolb:Booln:ℕr:ℕv:ℕhn:0 < nhr:0 < rhv:0 < vhb:Counter.value bs = rhc:Counter.value cs = vhp:0 < Counter.value (b :: cs)hbs:0 < Counter.value bshe:¬r = 1⊢ True ∧ True
exact ⟨trivial, trivial⟩ All goals completed! 🐙
| payload r => payload bs:List Boolcs:List Boolb:Booln:ℕr:ℕha:Scanner.Active (Scanner.Mode.payload r, n)hw:Words (Scanner.Mode.payload r, n).1 bs cs⊢ Words (Scanner.step (Scanner.Mode.payload r, n) b).1 (nextWords (Scanner.Mode.payload r, n).1 bs cs b).1
(nextWords (Scanner.Mode.payload r, n).1 bs cs b).2
obtain ⟨hn, hr⟩ := ha payload bs:List Boolcs:List Boolb:Booln:ℕr:ℕhw:Words (Scanner.Mode.payload r, n).1 bs cshn:0 < nhr:0 < r⊢ Words (Scanner.step (Scanner.Mode.payload r, n) b).1 (nextWords (Scanner.Mode.payload r, n).1 bs cs b).1
(nextWords (Scanner.Mode.payload r, n).1 bs cs b).2
obtain ⟨hb, hc⟩ := hw payload bs:List Boolcs:List Boolb:Booln:ℕr:ℕhn:0 < nhr:0 < rhb:Counter.value bs = 0hc:Counter.value cs = r⊢ Words (Scanner.step (Scanner.Mode.payload r, n) b).1 (nextWords (Scanner.Mode.payload r, n).1 bs cs b).1
(nextWords (Scanner.Mode.payload r, n).1 bs cs b).2
by_cases he : r = 1 pos bs:List Boolcs:List Boolb:Booln:ℕr:ℕhn:0 < nhr:0 < rhb:Counter.value bs = 0hc:Counter.value cs = rhe:r = 1⊢ Words (Scanner.step (Scanner.Mode.payload r, n) b).1 (nextWords (Scanner.Mode.payload r, n).1 bs cs b).1
(nextWords (Scanner.Mode.payload r, n).1 bs cs b).2neg bs:List Boolcs:List Boolb:Booln:ℕr:ℕhn:0 < nhr:0 < rhb:Counter.value bs = 0hc:Counter.value cs = rhe:¬r = 1⊢ Words (Scanner.step (Scanner.Mode.payload r, n) b).1 (nextWords (Scanner.Mode.payload r, n).1 bs cs b).1
(nextWords (Scanner.Mode.payload r, n).1 bs cs b).2
· pos bs:List Boolcs:List Boolb:Booln:ℕr:ℕhn:0 < nhr:0 < rhb:Counter.value bs = 0hc:Counter.value cs = rhe:r = 1⊢ Words (Scanner.step (Scanner.Mode.payload r, n) b).1 (nextWords (Scanner.Mode.payload r, n).1 bs cs b).1
(nextWords (Scanner.Mode.payload r, n).1 bs cs b).2 simp only [Scanner.step, nextWords, he, ↓reduceIte] pos bs:List Boolcs:List Boolb:Booln:ℕr:ℕhn:0 < nhr:0 < rhb:Counter.value bs = 0hc:Counter.value cs = rhe:r = 1⊢ Words (Scanner.finish n).1 [] []
unfold Scanner.finish pos bs:List Boolcs:List Boolb:Booln:ℕr:ℕhn:0 < nhr:0 < rhb:Counter.value bs = 0hc:Counter.value cs = rhe:r = 1⊢ Words (if n = 1 then (Scanner.Mode.done, 0) else (Scanner.Mode.tree, n - 1)).1 [] []
split pos.isTrue bs:List Boolcs:List Boolb:Booln:ℕr:ℕhn:0 < nhr:0 < rhb:Counter.value bs = 0hc:Counter.value cs = rhe:r = 1h✝:n = 1⊢ Words (Scanner.Mode.done, 0).1 [] []pos.isFalse bs:List Boolcs:List Boolb:Booln:ℕr:ℕhn:0 < nhr:0 < rhb:Counter.value bs = 0hc:Counter.value cs = rhe:r = 1h✝:¬n = 1⊢ Words (Scanner.Mode.tree, n - 1).1 [] [] <;> pos.isTrue bs:List Boolcs:List Boolb:Booln:ℕr:ℕhn:0 < nhr:0 < rhb:Counter.value bs = 0hc:Counter.value cs = rhe:r = 1h✝:n = 1⊢ Words (Scanner.Mode.done, 0).1 [] []pos.isFalse bs:List Boolcs:List Boolb:Booln:ℕr:ℕhn:0 < nhr:0 < rhb:Counter.value bs = 0hc:Counter.value cs = rhe:r = 1h✝:¬n = 1⊢ Words (Scanner.Mode.tree, n - 1).1 [] [] exact ⟨rfl, rfl⟩ All goals completed! 🐙
· neg bs:List Boolcs:List Boolb:Booln:ℕr:ℕhn:0 < nhr:0 < rhb:Counter.value bs = 0hc:Counter.value cs = rhe:¬r = 1⊢ Words (Scanner.step (Scanner.Mode.payload r, n) b).1 (nextWords (Scanner.Mode.payload r, n).1 bs cs b).1
(nextWords (Scanner.Mode.payload r, n).1 bs cs b).2 have hp : 0 < Counter.value cs := by s:Scanner.Statebs:List Boolcs:List Boolb:Boolha:Scanner.Active shw:Words s.1 bs cs⊢ Words (Scanner.step s b).1 (nextWords s.1 bs cs b).1 (nextWords s.1 bs cs b).2 rw [hc bs:List Boolcs:List Boolb:Booln:ℕr:ℕhn:0 < nhr:0 < rhb:Counter.value bs = 0hc:Counter.value cs = rhe:¬r = 1⊢ 0 < r] bs:List Boolcs:List Boolb:Booln:ℕr:ℕhn:0 < nhr:0 < rhb:Counter.value bs = 0hc:Counter.value cs = rhe:¬r = 1⊢ 0 < r; exact hr neg bs:List Boolcs:List Boolb:Booln:ℕr:ℕhn:0 < nhr:0 < rhb:Counter.value bs = 0hc:Counter.value cs = rhe:¬r = 1hp:0 < Counter.value cs⊢ Words (Scanner.step (Scanner.Mode.payload r, n) b).1 (nextWords (Scanner.Mode.payload r, n).1 bs cs b).1
(nextWords (Scanner.Mode.payload r, n).1 bs cs b).2
simp only [Scanner.step, nextWords, he, ↓reduceIte, Words,
Counter.value_decrement _ hp, hc] neg bs:List Boolcs:List Boolb:Booln:ℕr:ℕhn:0 < nhr:0 < rhb:Counter.value bs = 0hc:Counter.value cs = rhe:¬r = 1hp:0 < Counter.value cs⊢ Counter.value bs = 0 ∧ True
exact ⟨hb, trivial⟩ All goals completed! 🐙
| done => done bs:List Boolcs:List Boolb:Booln:ℕha:Scanner.Active (Scanner.Mode.done, n)hw:Words (Scanner.Mode.done, n).1 bs cs⊢ Words (Scanner.step (Scanner.Mode.done, n) b).1 (nextWords (Scanner.Mode.done, n).1 bs cs b).1
(nextWords (Scanner.Mode.done, n).1 bs cs b).2 exact hw All goals completed! 🐙
| dead => dead bs:List Boolcs:List Boolb:Booln:ℕha:Scanner.Active (Scanner.Mode.dead, n)hw:Words (Scanner.Mode.dead, n).1 bs cs⊢ Words (Scanner.step (Scanner.Mode.dead, n) b).1 (nextWords (Scanner.Mode.dead, n).1 bs cs b).1
(nextWords (Scanner.Mode.dead, n).1 bs cs b).2 exact hw All goals completed! 🐙A scalar state paired with its two finite binary words.
abbrev Account := Scanner.State × (List Bool × List Bool)One pending root and initially empty binary fields.
Advance the scalar state and both binary fields by one input bit.
def accountStep (s : Account) (b : Bool) : Account :=
(Scanner.step s.1 b, nextWords s.1.1 s.2.1 s.2.2 b)State and fields after a finite input prefix.
def account (w : List Bool) : Account := w.foldl accountStep initialAccountThe two descriptions agree at every boundary.
def AccountValid (s : Account) : Prop := Scanner.Active s.1 ∧ Words s.1.1 s.2.1 s.2.2A complete bit transition preserves scalar and binary-word invariants.
theorem accountStep_valid (s : Account) (b : Bool) (h : AccountValid s) :
AccountValid (accountStep s b) :=
⟨Scanner.active_step s.1 b h.1, words_step s.1 s.2.1 s.2.2 b h.1 h.2⟩The invariant is preserved across any input suffix.
theorem account_foldl_valid (w : List Bool) : ∀ s, AccountValid s →
AccountValid (w.foldl accountStep s) :=
List.rec (fun _ h ↦ h) (fun b _ ih s h ↦ ih _ (accountStep_valid s b h)) wProjection commutes with scanning any suffix.
theorem account_foldl_project (w : List Bool) : ∀ s,
(w.foldl accountStep s).1 = w.foldl Scanner.step s.1 :=
List.rec (fun _ ↦ rfl) (fun b _ ih s ↦ ih (accountStep s b)) wThe scalar account component is the streaming scanner state.
theorem account_project (w : List Bool) : (account w).1 = Scanner.scan w :=
account_foldl_project w initialAccountThe account invariant holds after every input prefix.
theorem account_valid (w : List Bool) : AccountValid (account w) :=
account_foldl_valid w initialAccount ⟨show 0 < 1 by All goals completed! 🐙 decide All goals completed! 🐙, rfl, rfl⟩The scalar component remains active or terminal.
theorem account_active (w : List Bool) : Scanner.Active (account w).1 :=
(account_valid w).1Both finite words represent their scalar phase values.
theorem account_words (w : List Bool) :
Words (account w).1.1 (account w).2.1 (account w).2.2 := (account_valid w).2Each binary word grows by at most one per input bit.
theorem nextWords_lengths_le (m : Scanner.Mode) (bs cs : List Bool) (b : Bool) :
(nextWords m bs cs b).1.length ≤ bs.length + 1 ∧
(nextWords m bs cs b).2.length ≤ cs.length + 1 := by m:Scanner.Modebs:List Boolcs:List Boolb:Bool⊢ (nextWords m bs cs b).1.length ≤ bs.length + 1 ∧ (nextWords m bs cs b).2.length ≤ cs.length + 1
cases m tree bs:List Boolcs:List Boolb:Bool⊢ (nextWords Scanner.Mode.tree bs cs b).1.length ≤ bs.length + 1 ∧
(nextWords Scanner.Mode.tree bs cs b).2.length ≤ cs.length + 1zeros bs:List Boolcs:List Boolb:Boolcount✝:ℕ⊢ (nextWords (Scanner.Mode.zeros count✝) bs cs b).1.length ≤ bs.length + 1 ∧
(nextWords (Scanner.Mode.zeros count✝) bs cs b).2.length ≤ cs.length + 1size bs:List Boolcs:List Boolb:Boolremaining✝:ℕvalue✝:ℕ⊢ (nextWords (Scanner.Mode.size remaining✝ value✝) bs cs b).1.length ≤ bs.length + 1 ∧
(nextWords (Scanner.Mode.size remaining✝ value✝) bs cs b).2.length ≤ cs.length + 1length bs:List Boolcs:List Boolb:Boolremaining✝:ℕvalue✝:ℕ⊢ (nextWords (Scanner.Mode.length remaining✝ value✝) bs cs b).1.length ≤ bs.length + 1 ∧
(nextWords (Scanner.Mode.length remaining✝ value✝) bs cs b).2.length ≤ cs.length + 1payload bs:List Boolcs:List Boolb:Boolremaining✝:ℕ⊢ (nextWords (Scanner.Mode.payload remaining✝) bs cs b).1.length ≤ bs.length + 1 ∧
(nextWords (Scanner.Mode.payload remaining✝) bs cs b).2.length ≤ cs.length + 1done bs:List Boolcs:List Boolb:Bool⊢ (nextWords Scanner.Mode.done bs cs b).1.length ≤ bs.length + 1 ∧
(nextWords Scanner.Mode.done bs cs b).2.length ≤ cs.length + 1dead bs:List Boolcs:List Boolb:Bool⊢ (nextWords Scanner.Mode.dead bs cs b).1.length ≤ bs.length + 1 ∧
(nextWords Scanner.Mode.dead bs cs b).2.length ≤ cs.length + 1 <;> tree bs:List Boolcs:List Boolb:Bool⊢ (nextWords Scanner.Mode.tree bs cs b).1.length ≤ bs.length + 1 ∧
(nextWords Scanner.Mode.tree bs cs b).2.length ≤ cs.length + 1zeros bs:List Boolcs:List Boolb:Boolcount✝:ℕ⊢ (nextWords (Scanner.Mode.zeros count✝) bs cs b).1.length ≤ bs.length + 1 ∧
(nextWords (Scanner.Mode.zeros count✝) bs cs b).2.length ≤ cs.length + 1size bs:List Boolcs:List Boolb:Boolremaining✝:ℕvalue✝:ℕ⊢ (nextWords (Scanner.Mode.size remaining✝ value✝) bs cs b).1.length ≤ bs.length + 1 ∧
(nextWords (Scanner.Mode.size remaining✝ value✝) bs cs b).2.length ≤ cs.length + 1length bs:List Boolcs:List Boolb:Boolremaining✝:ℕvalue✝:ℕ⊢ (nextWords (Scanner.Mode.length remaining✝ value✝) bs cs b).1.length ≤ bs.length + 1 ∧
(nextWords (Scanner.Mode.length remaining✝ value✝) bs cs b).2.length ≤ cs.length + 1payload bs:List Boolcs:List Boolb:Boolremaining✝:ℕ⊢ (nextWords (Scanner.Mode.payload remaining✝) bs cs b).1.length ≤ bs.length + 1 ∧
(nextWords (Scanner.Mode.payload remaining✝) bs cs b).2.length ≤ cs.length + 1done bs:List Boolcs:List Boolb:Bool⊢ (nextWords Scanner.Mode.done bs cs b).1.length ≤ bs.length + 1 ∧
(nextWords Scanner.Mode.done bs cs b).2.length ≤ cs.length + 1dead bs:List Boolcs:List Boolb:Bool⊢ (nextWords Scanner.Mode.dead bs cs b).1.length ≤ bs.length + 1 ∧
(nextWords Scanner.Mode.dead bs cs b).2.length ≤ cs.length + 1 cases b dead.false bs:List Boolcs:List Bool⊢ (nextWords Scanner.Mode.dead bs cs false).1.length ≤ bs.length + 1 ∧
(nextWords Scanner.Mode.dead bs cs false).2.length ≤ cs.length + 1dead.true bs:List Boolcs:List Bool⊢ (nextWords Scanner.Mode.dead bs cs true).1.length ≤ bs.length + 1 ∧
(nextWords Scanner.Mode.dead bs cs true).2.length ≤ cs.length + 1 <;> tree.false bs:List Boolcs:List Bool⊢ (nextWords Scanner.Mode.tree bs cs false).1.length ≤ bs.length + 1 ∧
(nextWords Scanner.Mode.tree bs cs false).2.length ≤ cs.length + 1tree.true bs:List Boolcs:List Bool⊢ (nextWords Scanner.Mode.tree bs cs true).1.length ≤ bs.length + 1 ∧
(nextWords Scanner.Mode.tree bs cs true).2.length ≤ cs.length + 1zeros.false bs:List Boolcs:List Boolcount✝:ℕ⊢ (nextWords (Scanner.Mode.zeros count✝) bs cs false).1.length ≤ bs.length + 1 ∧
(nextWords (Scanner.Mode.zeros count✝) bs cs false).2.length ≤ cs.length + 1zeros.true bs:List Boolcs:List Boolcount✝:ℕ⊢ (nextWords (Scanner.Mode.zeros count✝) bs cs true).1.length ≤ bs.length + 1 ∧
(nextWords (Scanner.Mode.zeros count✝) bs cs true).2.length ≤ cs.length + 1size.false bs:List Boolcs:List Boolremaining✝:ℕvalue✝:ℕ⊢ (nextWords (Scanner.Mode.size remaining✝ value✝) bs cs false).1.length ≤ bs.length + 1 ∧
(nextWords (Scanner.Mode.size remaining✝ value✝) bs cs false).2.length ≤ cs.length + 1size.true bs:List Boolcs:List Boolremaining✝:ℕvalue✝:ℕ⊢ (nextWords (Scanner.Mode.size remaining✝ value✝) bs cs true).1.length ≤ bs.length + 1 ∧
(nextWords (Scanner.Mode.size remaining✝ value✝) bs cs true).2.length ≤ cs.length + 1length.false bs:List Boolcs:List Boolremaining✝:ℕvalue✝:ℕ⊢ (nextWords (Scanner.Mode.length remaining✝ value✝) bs cs false).1.length ≤ bs.length + 1 ∧
(nextWords (Scanner.Mode.length remaining✝ value✝) bs cs false).2.length ≤ cs.length + 1length.true bs:List Boolcs:List Boolremaining✝:ℕvalue✝:ℕ⊢ (nextWords (Scanner.Mode.length remaining✝ value✝) bs cs true).1.length ≤ bs.length + 1 ∧
(nextWords (Scanner.Mode.length remaining✝ value✝) bs cs true).2.length ≤ cs.length + 1payload.false bs:List Boolcs:List Boolremaining✝:ℕ⊢ (nextWords (Scanner.Mode.payload remaining✝) bs cs false).1.length ≤ bs.length + 1 ∧
(nextWords (Scanner.Mode.payload remaining✝) bs cs false).2.length ≤ cs.length + 1payload.true bs:List Boolcs:List Boolremaining✝:ℕ⊢ (nextWords (Scanner.Mode.payload remaining✝) bs cs true).1.length ≤ bs.length + 1 ∧
(nextWords (Scanner.Mode.payload remaining✝) bs cs true).2.length ≤ cs.length + 1done.false bs:List Boolcs:List Bool⊢ (nextWords Scanner.Mode.done bs cs false).1.length ≤ bs.length + 1 ∧
(nextWords Scanner.Mode.done bs cs false).2.length ≤ cs.length + 1done.true bs:List Boolcs:List Bool⊢ (nextWords Scanner.Mode.done bs cs true).1.length ≤ bs.length + 1 ∧
(nextWords Scanner.Mode.done bs cs true).2.length ≤ cs.length + 1dead.false bs:List Boolcs:List Bool⊢ (nextWords Scanner.Mode.dead bs cs false).1.length ≤ bs.length + 1 ∧
(nextWords Scanner.Mode.dead bs cs false).2.length ≤ cs.length + 1dead.true bs:List Boolcs:List Bool⊢ (nextWords Scanner.Mode.dead bs cs true).1.length ≤ bs.length + 1 ∧
(nextWords Scanner.Mode.dead bs cs true).2.length ≤ cs.length + 1 simp only [nextWords] dead.true bs:List Boolcs:List Bool⊢ bs.length ≤ bs.length + 1 ∧ cs.length ≤ cs.length + 1 <;> tree.false bs:List Boolcs:List Bool⊢ [].length ≤ bs.length + 1 ∧ [true].length ≤ cs.length + 1tree.true bs:List Boolcs:List Bool⊢ bs.length ≤ bs.length + 1 ∧ cs.length ≤ cs.length + 1zeros.false bs:List Boolcs:List Boolcount✝:ℕ⊢ bs.length ≤ bs.length + 1 ∧ cs.length ≤ cs.length + 1zeros.true bs:List Boolcs:List Boolcount✝:ℕ⊢ (if count✝ = 0 then ([], []) else ([true], cs)).1.length ≤ bs.length + 1 ∧
(if count✝ = 0 then ([], []) else ([true], cs)).2.length ≤ cs.length + 1size.false bs:List Boolcs:List Boolremaining✝:ℕvalue✝:ℕ⊢ (if remaining✝ = 1 then (Counter.decrement (false :: bs), cs) else (false :: bs, cs)).1.length ≤ bs.length + 1 ∧
(if remaining✝ = 1 then (Counter.decrement (false :: bs), cs) else (false :: bs, cs)).2.length ≤ cs.length + 1size.true bs:List Boolcs:List Boolremaining✝:ℕvalue✝:ℕ⊢ (if remaining✝ = 1 then (Counter.decrement (true :: bs), cs) else (true :: bs, cs)).1.length ≤ bs.length + 1 ∧
(if remaining✝ = 1 then (Counter.decrement (true :: bs), cs) else (true :: bs, cs)).2.length ≤ cs.length + 1length.false bs:List Boolcs:List Boolremaining✝:ℕvalue✝:ℕ⊢ (Counter.decrement bs).length ≤ bs.length + 1 ∧
(if remaining✝ = 1 then Counter.decrement (false :: cs) else false :: cs).length ≤ cs.length + 1length.true bs:List Boolcs:List Boolremaining✝:ℕvalue✝:ℕ⊢ (Counter.decrement bs).length ≤ bs.length + 1 ∧
(if remaining✝ = 1 then Counter.decrement (true :: cs) else true :: cs).length ≤ cs.length + 1payload.false bs:List Boolcs:List Boolremaining✝:ℕ⊢ (if remaining✝ = 1 then ([], []) else (bs, Counter.decrement cs)).1.length ≤ bs.length + 1 ∧
(if remaining✝ = 1 then ([], []) else (bs, Counter.decrement cs)).2.length ≤ cs.length + 1payload.true bs:List Boolcs:List Boolremaining✝:ℕ⊢ (if remaining✝ = 1 then ([], []) else (bs, Counter.decrement cs)).1.length ≤ bs.length + 1 ∧
(if remaining✝ = 1 then ([], []) else (bs, Counter.decrement cs)).2.length ≤ cs.length + 1done.false bs:List Boolcs:List Bool⊢ bs.length ≤ bs.length + 1 ∧ cs.length ≤ cs.length + 1done.true bs:List Boolcs:List Bool⊢ bs.length ≤ bs.length + 1 ∧ cs.length ≤ cs.length + 1dead.false bs:List Boolcs:List Bool⊢ bs.length ≤ bs.length + 1 ∧ cs.length ≤ cs.length + 1dead.true bs:List Boolcs:List Bool⊢ bs.length ≤ bs.length + 1 ∧ cs.length ≤ cs.length + 1
first | (constructor dead.true.left bs:List Boolcs:List Bool⊢ bs.length ≤ bs.length + 1dead.true.right bs:List Boolcs:List Bool⊢ cs.length ≤ cs.length + 1 <;> dead.true.left bs:List Boolcs:List Bool⊢ bs.length ≤ bs.length + 1dead.true.right bs:List Boolcs:List Bool⊢ cs.length ≤ cs.length + 1 omega All goals completed! 🐙) |
(split payload.true.isTrue bs:List Boolcs:List Boolremaining✝:ℕh✝:remaining✝ = 1⊢ ([], []).1.length ≤ bs.length + 1 ∧ ([], []).2.length ≤ cs.length + 1payload.true.isFalse bs:List Boolcs:List Boolremaining✝:ℕh✝:¬remaining✝ = 1⊢ (bs, Counter.decrement cs).1.length ≤ bs.length + 1 ∧ (bs, Counter.decrement cs).2.length ≤ cs.length + 1 <;> payload.true.isTrue bs:List Boolcs:List Boolremaining✝:ℕh✝:remaining✝ = 1⊢ ([], []).1.length ≤ bs.length + 1 ∧ ([], []).2.length ≤ cs.length + 1payload.true.isFalse bs:List Boolcs:List Boolremaining✝:ℕh✝:¬remaining✝ = 1⊢ (bs, Counter.decrement cs).1.length ≤ bs.length + 1 ∧ (bs, Counter.decrement cs).2.length ≤ cs.length + 1 constructor payload.true.isFalse.left bs:List Boolcs:List Boolremaining✝:ℕh✝:¬remaining✝ = 1⊢ (bs, Counter.decrement cs).1.length ≤ bs.length + 1payload.true.isFalse.right bs:List Boolcs:List Boolremaining✝:ℕh✝:¬remaining✝ = 1⊢ (bs, Counter.decrement cs).2.length ≤ cs.length + 1 <;> payload.true.isTrue.left bs:List Boolcs:List Boolremaining✝:ℕh✝:remaining✝ = 1⊢ ([], []).1.length ≤ bs.length + 1payload.true.isTrue.right bs:List Boolcs:List Boolremaining✝:ℕh✝:remaining✝ = 1⊢ ([], []).2.length ≤ cs.length + 1payload.true.isFalse.left bs:List Boolcs:List Boolremaining✝:ℕh✝:¬remaining✝ = 1⊢ (bs, Counter.decrement cs).1.length ≤ bs.length + 1payload.true.isFalse.right bs:List Boolcs:List Boolremaining✝:ℕh✝:¬remaining✝ = 1⊢ (bs, Counter.decrement cs).2.length ≤ cs.length + 1 simp only [List.length_nil, List.length_cons,
Counter.length_decrement] payload.true.isFalse.right bs:List Boolcs:List Boolremaining✝:ℕh✝:¬remaining✝ = 1⊢ cs.length ≤ cs.length + 1 <;> payload.true.isTrue.left bs:List Boolcs:List Boolremaining✝:ℕh✝:remaining✝ = 1⊢ 0 ≤ bs.length + 1payload.true.isTrue.right bs:List Boolcs:List Boolremaining✝:ℕh✝:remaining✝ = 1⊢ 0 ≤ cs.length + 1payload.true.isFalse.left bs:List Boolcs:List Boolremaining✝:ℕh✝:¬remaining✝ = 1⊢ bs.length ≤ bs.length + 1payload.true.isFalse.right bs:List Boolcs:List Boolremaining✝:ℕh✝:¬remaining✝ = 1⊢ cs.length ≤ cs.length + 1 omega All goals completed! 🐙) |
(constructor tree.false.left bs:List Boolcs:List Bool⊢ [].length ≤ bs.length + 1tree.false.right bs:List Boolcs:List Bool⊢ [true].length ≤ cs.length + 1 <;> tree.false.left bs:List Boolcs:List Bool⊢ [].length ≤ bs.length + 1tree.false.right bs:List Boolcs:List Bool⊢ [true].length ≤ cs.length + 1 simp only [List.length_nil, List.length_cons] tree.false.right bs:List Boolcs:List Bool⊢ 0 + 1 ≤ cs.length + 1 <;> tree.false.left bs:List Boolcs:List Bool⊢ 0 ≤ bs.length + 1tree.false.right bs:List Boolcs:List Bool⊢ 0 + 1 ≤ cs.length + 1 omega All goals completed! 🐙)The unary header counter grows by at most one per input bit.
theorem step_zeros_le (s : Scanner.State) (b : Bool) :
zeroCount (Scanner.step s b).1 ≤ zeroCount s.1 + 1 := by s:Scanner.Stateb:Bool⊢ zeroCount (Scanner.step s b).1 ≤ zeroCount s.1 + 1
rcases s with ⟨m, n⟩ b:Boolm:Scanner.Moden:ℕ⊢ zeroCount (Scanner.step (m, n) b).1 ≤ zeroCount (m, n).1 + 1
cases m tree b:Booln:ℕ⊢ zeroCount (Scanner.step (Scanner.Mode.tree, n) b).1 ≤ zeroCount (Scanner.Mode.tree, n).1 + 1zeros b:Booln:ℕcount✝:ℕ⊢ zeroCount (Scanner.step (Scanner.Mode.zeros count✝, n) b).1 ≤ zeroCount (Scanner.Mode.zeros count✝, n).1 + 1size b:Booln:ℕremaining✝:ℕvalue✝:ℕ⊢ zeroCount (Scanner.step (Scanner.Mode.size remaining✝ value✝, n) b).1 ≤
zeroCount (Scanner.Mode.size remaining✝ value✝, n).1 + 1length b:Booln:ℕremaining✝:ℕvalue✝:ℕ⊢ zeroCount (Scanner.step (Scanner.Mode.length remaining✝ value✝, n) b).1 ≤
zeroCount (Scanner.Mode.length remaining✝ value✝, n).1 + 1payload b:Booln:ℕremaining✝:ℕ⊢ zeroCount (Scanner.step (Scanner.Mode.payload remaining✝, n) b).1 ≤ zeroCount (Scanner.Mode.payload remaining✝, n).1 + 1done b:Booln:ℕ⊢ zeroCount (Scanner.step (Scanner.Mode.done, n) b).1 ≤ zeroCount (Scanner.Mode.done, n).1 + 1dead b:Booln:ℕ⊢ zeroCount (Scanner.step (Scanner.Mode.dead, n) b).1 ≤ zeroCount (Scanner.Mode.dead, n).1 + 1 <;> tree b:Booln:ℕ⊢ zeroCount (Scanner.step (Scanner.Mode.tree, n) b).1 ≤ zeroCount (Scanner.Mode.tree, n).1 + 1zeros b:Booln:ℕcount✝:ℕ⊢ zeroCount (Scanner.step (Scanner.Mode.zeros count✝, n) b).1 ≤ zeroCount (Scanner.Mode.zeros count✝, n).1 + 1size b:Booln:ℕremaining✝:ℕvalue✝:ℕ⊢ zeroCount (Scanner.step (Scanner.Mode.size remaining✝ value✝, n) b).1 ≤
zeroCount (Scanner.Mode.size remaining✝ value✝, n).1 + 1length b:Booln:ℕremaining✝:ℕvalue✝:ℕ⊢ zeroCount (Scanner.step (Scanner.Mode.length remaining✝ value✝, n) b).1 ≤
zeroCount (Scanner.Mode.length remaining✝ value✝, n).1 + 1payload b:Booln:ℕremaining✝:ℕ⊢ zeroCount (Scanner.step (Scanner.Mode.payload remaining✝, n) b).1 ≤ zeroCount (Scanner.Mode.payload remaining✝, n).1 + 1done b:Booln:ℕ⊢ zeroCount (Scanner.step (Scanner.Mode.done, n) b).1 ≤ zeroCount (Scanner.Mode.done, n).1 + 1dead b:Booln:ℕ⊢ zeroCount (Scanner.step (Scanner.Mode.dead, n) b).1 ≤ zeroCount (Scanner.Mode.dead, n).1 + 1 cases b dead.false n:ℕ⊢ zeroCount (Scanner.step (Scanner.Mode.dead, n) false).1 ≤ zeroCount (Scanner.Mode.dead, n).1 + 1dead.true n:ℕ⊢ zeroCount (Scanner.step (Scanner.Mode.dead, n) true).1 ≤ zeroCount (Scanner.Mode.dead, n).1 + 1 <;> tree.false n:ℕ⊢ zeroCount (Scanner.step (Scanner.Mode.tree, n) false).1 ≤ zeroCount (Scanner.Mode.tree, n).1 + 1tree.true n:ℕ⊢ zeroCount (Scanner.step (Scanner.Mode.tree, n) true).1 ≤ zeroCount (Scanner.Mode.tree, n).1 + 1zeros.false n:ℕcount✝:ℕ⊢ zeroCount (Scanner.step (Scanner.Mode.zeros count✝, n) false).1 ≤ zeroCount (Scanner.Mode.zeros count✝, n).1 + 1zeros.true n:ℕcount✝:ℕ⊢ zeroCount (Scanner.step (Scanner.Mode.zeros count✝, n) true).1 ≤ zeroCount (Scanner.Mode.zeros count✝, n).1 + 1size.false n:ℕremaining✝:ℕvalue✝:ℕ⊢ zeroCount (Scanner.step (Scanner.Mode.size remaining✝ value✝, n) false).1 ≤
zeroCount (Scanner.Mode.size remaining✝ value✝, n).1 + 1size.true n:ℕremaining✝:ℕvalue✝:ℕ⊢ zeroCount (Scanner.step (Scanner.Mode.size remaining✝ value✝, n) true).1 ≤
zeroCount (Scanner.Mode.size remaining✝ value✝, n).1 + 1length.false n:ℕremaining✝:ℕvalue✝:ℕ⊢ zeroCount (Scanner.step (Scanner.Mode.length remaining✝ value✝, n) false).1 ≤
zeroCount (Scanner.Mode.length remaining✝ value✝, n).1 + 1length.true n:ℕremaining✝:ℕvalue✝:ℕ⊢ zeroCount (Scanner.step (Scanner.Mode.length remaining✝ value✝, n) true).1 ≤
zeroCount (Scanner.Mode.length remaining✝ value✝, n).1 + 1payload.false n:ℕremaining✝:ℕ⊢ zeroCount (Scanner.step (Scanner.Mode.payload remaining✝, n) false).1 ≤
zeroCount (Scanner.Mode.payload remaining✝, n).1 + 1payload.true n:ℕremaining✝:ℕ⊢ zeroCount (Scanner.step (Scanner.Mode.payload remaining✝, n) true).1 ≤
zeroCount (Scanner.Mode.payload remaining✝, n).1 + 1done.false n:ℕ⊢ zeroCount (Scanner.step (Scanner.Mode.done, n) false).1 ≤ zeroCount (Scanner.Mode.done, n).1 + 1done.true n:ℕ⊢ zeroCount (Scanner.step (Scanner.Mode.done, n) true).1 ≤ zeroCount (Scanner.Mode.done, n).1 + 1dead.false n:ℕ⊢ zeroCount (Scanner.step (Scanner.Mode.dead, n) false).1 ≤ zeroCount (Scanner.Mode.dead, n).1 + 1dead.true n:ℕ⊢ zeroCount (Scanner.step (Scanner.Mode.dead, n) true).1 ≤ zeroCount (Scanner.Mode.dead, n).1 + 1 simp only [Scanner.step] dead.true n:ℕ⊢ zeroCount Scanner.Mode.dead ≤ zeroCount Scanner.Mode.dead + 1 <;> tree.false n:ℕ⊢ zeroCount (Scanner.Mode.zeros 0) ≤ zeroCount Scanner.Mode.tree + 1tree.true n:ℕ⊢ zeroCount Scanner.Mode.tree ≤ zeroCount Scanner.Mode.tree + 1zeros.false n:ℕcount✝:ℕ⊢ zeroCount (Scanner.Mode.zeros (count✝ + 1)) ≤ zeroCount (Scanner.Mode.zeros count✝) + 1zeros.true n:ℕcount✝:ℕ⊢ zeroCount (if count✝ = 0 then Scanner.finish n else (Scanner.Mode.size count✝ 1, n)).1 ≤
zeroCount (Scanner.Mode.zeros count✝) + 1size.false n:ℕremaining✝:ℕvalue✝:ℕ⊢ zeroCount
(if remaining✝ = 1 then (Scanner.Mode.length (Nat.bit false value✝ - 1) 1, n)
else (Scanner.Mode.size (remaining✝ - 1) (Nat.bit false value✝), n)).1 ≤
zeroCount (Scanner.Mode.size remaining✝ value✝) + 1size.true n:ℕremaining✝:ℕvalue✝:ℕ⊢ zeroCount
(if remaining✝ = 1 then (Scanner.Mode.length (Nat.bit true value✝ - 1) 1, n)
else (Scanner.Mode.size (remaining✝ - 1) (Nat.bit true value✝), n)).1 ≤
zeroCount (Scanner.Mode.size remaining✝ value✝) + 1length.false n:ℕremaining✝:ℕvalue✝:ℕ⊢ zeroCount
(if remaining✝ = 1 then (Scanner.Mode.payload (Nat.bit false value✝ - 1), n)
else (Scanner.Mode.length (remaining✝ - 1) (Nat.bit false value✝), n)).1 ≤
zeroCount (Scanner.Mode.length remaining✝ value✝) + 1length.true n:ℕremaining✝:ℕvalue✝:ℕ⊢ zeroCount
(if remaining✝ = 1 then (Scanner.Mode.payload (Nat.bit true value✝ - 1), n)
else (Scanner.Mode.length (remaining✝ - 1) (Nat.bit true value✝), n)).1 ≤
zeroCount (Scanner.Mode.length remaining✝ value✝) + 1payload.false n:ℕremaining✝:ℕ⊢ zeroCount (if remaining✝ = 1 then Scanner.finish n else (Scanner.Mode.payload (remaining✝ - 1), n)).1 ≤
zeroCount (Scanner.Mode.payload remaining✝) + 1payload.true n:ℕremaining✝:ℕ⊢ zeroCount (if remaining✝ = 1 then Scanner.finish n else (Scanner.Mode.payload (remaining✝ - 1), n)).1 ≤
zeroCount (Scanner.Mode.payload remaining✝) + 1done.false n:ℕ⊢ zeroCount Scanner.Mode.dead ≤ zeroCount Scanner.Mode.done + 1done.true n:ℕ⊢ zeroCount Scanner.Mode.dead ≤ zeroCount Scanner.Mode.done + 1dead.false n:ℕ⊢ zeroCount Scanner.Mode.dead ≤ zeroCount Scanner.Mode.dead + 1dead.true n:ℕ⊢ zeroCount Scanner.Mode.dead ≤ zeroCount Scanner.Mode.dead + 1
first | (simp only [zeroCount] dead.true n:ℕ⊢ 0 ≤ 0 + 1; omega All goals completed! 🐙) |
(split payload.true.isTrue n:ℕremaining✝:ℕh✝:remaining✝ = 1⊢ zeroCount (Scanner.finish n).1 ≤ zeroCount (Scanner.Mode.payload remaining✝) + 1payload.true.isFalse n:ℕremaining✝:ℕh✝:¬remaining✝ = 1⊢ zeroCount (Scanner.Mode.payload (remaining✝ - 1), n).1 ≤ zeroCount (Scanner.Mode.payload remaining✝) + 1 <;> payload.true.isTrue n:ℕremaining✝:ℕh✝:remaining✝ = 1⊢ zeroCount (Scanner.finish n).1 ≤ zeroCount (Scanner.Mode.payload remaining✝) + 1payload.true.isFalse n:ℕremaining✝:ℕh✝:¬remaining✝ = 1⊢ zeroCount (Scanner.Mode.payload (remaining✝ - 1), n).1 ≤ zeroCount (Scanner.Mode.payload remaining✝) + 1 first | (simp only [zeroCount] payload.true.isFalse n:ℕremaining✝:ℕh✝:¬remaining✝ = 1⊢ 0 ≤ 0 + 1; omega All goals completed! 🐙) |
(unfold Scanner.finish payload.true.isTrue n:ℕremaining✝:ℕh✝:remaining✝ = 1⊢ zeroCount (if n = 1 then (Scanner.Mode.done, 0) else (Scanner.Mode.tree, n - 1)).1 ≤
zeroCount (Scanner.Mode.payload remaining✝) + 1; split payload.true.isTrue.isTrue n:ℕremaining✝:ℕh✝¹:remaining✝ = 1h✝:n = 1⊢ zeroCount (Scanner.Mode.done, 0).1 ≤ zeroCount (Scanner.Mode.payload remaining✝) + 1payload.true.isTrue.isFalse n:ℕremaining✝:ℕh✝¹:remaining✝ = 1h✝:¬n = 1⊢ zeroCount (Scanner.Mode.tree, n - 1).1 ≤ zeroCount (Scanner.Mode.payload remaining✝) + 1 <;> payload.true.isTrue.isTrue n:ℕremaining✝:ℕh✝¹:remaining✝ = 1h✝:n = 1⊢ zeroCount (Scanner.Mode.done, 0).1 ≤ zeroCount (Scanner.Mode.payload remaining✝) + 1payload.true.isTrue.isFalse n:ℕremaining✝:ℕh✝¹:remaining✝ = 1h✝:¬n = 1⊢ zeroCount (Scanner.Mode.tree, n - 1).1 ≤ zeroCount (Scanner.Mode.payload remaining✝) + 1 simp only [zeroCount] payload.true.isTrue.isFalse n:ℕremaining✝:ℕh✝¹:remaining✝ = 1h✝:¬n = 1⊢ 0 ≤ 0 + 1 <;> payload.true.isTrue.isTrue n:ℕremaining✝:ℕh✝¹:remaining✝ = 1h✝:n = 1⊢ 0 ≤ 0 + 1payload.true.isTrue.isFalse n:ℕremaining✝:ℕh✝¹:remaining✝ = 1h✝:¬n = 1⊢ 0 ≤ 0 + 1 omega All goals completed! 🐙))Any suffix adds at most its length to both word widths and the unary header counter.
theorem account_foldl_bounds (w : List Bool) : ∀ s,
(w.foldl accountStep s).2.1.length ≤ s.2.1.length + w.length ∧
(w.foldl accountStep s).2.2.length ≤ s.2.2.length + w.length ∧
zeroCount (w.foldl accountStep s).1.1 ≤ zeroCount s.1.1 + w.length :=
List.rec (fun s ↦ ⟨Nat.le_refl _, Nat.le_refl _, Nat.le_refl _⟩)
(fun b bs ih s ↦ by w:List Boolb:Boolbs:List Boolih:∀ (s : Account),
(List.foldl accountStep s bs).2.1.length ≤ s.2.1.length + bs.length ∧
(List.foldl accountStep s bs).2.2.length ≤ s.2.2.length + bs.length ∧
zeroCount (List.foldl accountStep s bs).1.1 ≤ zeroCount s.1.1 + bs.lengths:Account⊢ (List.foldl accountStep s (b :: bs)).2.1.length ≤ s.2.1.length + (b :: bs).length ∧
(List.foldl accountStep s (b :: bs)).2.2.length ≤ s.2.2.length + (b :: bs).length ∧
zeroCount (List.foldl accountStep s (b :: bs)).1.1 ≤ zeroCount s.1.1 + (b :: bs).length
obtain ⟨hb, hc, hz⟩ := ih (accountStep s b) w:List Boolb:Boolbs:List Boolih:∀ (s : Account),
(List.foldl accountStep s bs).2.1.length ≤ s.2.1.length + bs.length ∧
(List.foldl accountStep s bs).2.2.length ≤ s.2.2.length + bs.length ∧
zeroCount (List.foldl accountStep s bs).1.1 ≤ zeroCount s.1.1 + bs.lengths:Accounthb:(List.foldl accountStep (accountStep s b) bs).2.1.length ≤ (accountStep s b).2.1.length + bs.lengthhc:(List.foldl accountStep (accountStep s b) bs).2.2.length ≤ (accountStep s b).2.2.length + bs.lengthhz:zeroCount (List.foldl accountStep (accountStep s b) bs).1.1 ≤ zeroCount (accountStep s b).1.1 + bs.length⊢ (List.foldl accountStep s (b :: bs)).2.1.length ≤ s.2.1.length + (b :: bs).length ∧
(List.foldl accountStep s (b :: bs)).2.2.length ≤ s.2.2.length + (b :: bs).length ∧
zeroCount (List.foldl accountStep s (b :: bs)).1.1 ≤ zeroCount s.1.1 + (b :: bs).length
obtain ⟨hbs, hcs⟩ := nextWords_lengths_le s.1.1 s.2.1 s.2.2 b w:List Boolb:Boolbs:List Boolih:∀ (s : Account),
(List.foldl accountStep s bs).2.1.length ≤ s.2.1.length + bs.length ∧
(List.foldl accountStep s bs).2.2.length ≤ s.2.2.length + bs.length ∧
zeroCount (List.foldl accountStep s bs).1.1 ≤ zeroCount s.1.1 + bs.lengths:Accounthb:(List.foldl accountStep (accountStep s b) bs).2.1.length ≤ (accountStep s b).2.1.length + bs.lengthhc:(List.foldl accountStep (accountStep s b) bs).2.2.length ≤ (accountStep s b).2.2.length + bs.lengthhz:zeroCount (List.foldl accountStep (accountStep s b) bs).1.1 ≤ zeroCount (accountStep s b).1.1 + bs.lengthhbs:(nextWords s.1.1 s.2.1 s.2.2 b).1.length ≤ s.2.1.length + 1hcs:(nextWords s.1.1 s.2.1 s.2.2 b).2.length ≤ s.2.2.length + 1⊢ (List.foldl accountStep s (b :: bs)).2.1.length ≤ s.2.1.length + (b :: bs).length ∧
(List.foldl accountStep s (b :: bs)).2.2.length ≤ s.2.2.length + (b :: bs).length ∧
zeroCount (List.foldl accountStep s (b :: bs)).1.1 ≤ zeroCount s.1.1 + (b :: bs).length
have hzs := step_zeros_le s.1 b w:List Boolb:Boolbs:List Boolih:∀ (s : Account),
(List.foldl accountStep s bs).2.1.length ≤ s.2.1.length + bs.length ∧
(List.foldl accountStep s bs).2.2.length ≤ s.2.2.length + bs.length ∧
zeroCount (List.foldl accountStep s bs).1.1 ≤ zeroCount s.1.1 + bs.lengths:Accounthb:(List.foldl accountStep (accountStep s b) bs).2.1.length ≤ (accountStep s b).2.1.length + bs.lengthhc:(List.foldl accountStep (accountStep s b) bs).2.2.length ≤ (accountStep s b).2.2.length + bs.lengthhz:zeroCount (List.foldl accountStep (accountStep s b) bs).1.1 ≤ zeroCount (accountStep s b).1.1 + bs.lengthhbs:(nextWords s.1.1 s.2.1 s.2.2 b).1.length ≤ s.2.1.length + 1hcs:(nextWords s.1.1 s.2.1 s.2.2 b).2.length ≤ s.2.2.length + 1hzs:zeroCount (Scanner.step s.1 b).1 ≤ zeroCount s.1.1 + 1⊢ (List.foldl accountStep s (b :: bs)).2.1.length ≤ s.2.1.length + (b :: bs).length ∧
(List.foldl accountStep s (b :: bs)).2.2.length ≤ s.2.2.length + (b :: bs).length ∧
zeroCount (List.foldl accountStep s (b :: bs)).1.1 ≤ zeroCount s.1.1 + (b :: bs).length
simp only [List.foldl_cons, List.length_cons] w:List Boolb:Boolbs:List Boolih:∀ (s : Account),
(List.foldl accountStep s bs).2.1.length ≤ s.2.1.length + bs.length ∧
(List.foldl accountStep s bs).2.2.length ≤ s.2.2.length + bs.length ∧
zeroCount (List.foldl accountStep s bs).1.1 ≤ zeroCount s.1.1 + bs.lengths:Accounthb:(List.foldl accountStep (accountStep s b) bs).2.1.length ≤ (accountStep s b).2.1.length + bs.lengthhc:(List.foldl accountStep (accountStep s b) bs).2.2.length ≤ (accountStep s b).2.2.length + bs.lengthhz:zeroCount (List.foldl accountStep (accountStep s b) bs).1.1 ≤ zeroCount (accountStep s b).1.1 + bs.lengthhbs:(nextWords s.1.1 s.2.1 s.2.2 b).1.length ≤ s.2.1.length + 1hcs:(nextWords s.1.1 s.2.1 s.2.2 b).2.length ≤ s.2.2.length + 1hzs:zeroCount (Scanner.step s.1 b).1 ≤ zeroCount s.1.1 + 1⊢ (List.foldl accountStep (accountStep s b) bs).2.1.length ≤ s.2.1.length + (bs.length + 1) ∧
(List.foldl accountStep (accountStep s b) bs).2.2.length ≤ s.2.2.length + (bs.length + 1) ∧
zeroCount (List.foldl accountStep (accountStep s b) bs).1.1 ≤ zeroCount s.1.1 + (bs.length + 1)
change _ ≤ _ at hb hc hz w:List Boolb:Boolbs:List Boolih:∀ (s : Account),
(List.foldl accountStep s bs).2.1.length ≤ s.2.1.length + bs.length ∧
(List.foldl accountStep s bs).2.2.length ≤ s.2.2.length + bs.length ∧
zeroCount (List.foldl accountStep s bs).1.1 ≤ zeroCount s.1.1 + bs.lengths:Accounthbs:(nextWords s.1.1 s.2.1 s.2.2 b).1.length ≤ s.2.1.length + 1hcs:(nextWords s.1.1 s.2.1 s.2.2 b).2.length ≤ s.2.2.length + 1hzs:zeroCount (Scanner.step s.1 b).1 ≤ zeroCount s.1.1 + 1hb:(List.foldl accountStep (accountStep s b) bs).2.1.length ≤ (accountStep s b).2.1.length + bs.lengthhc:(List.foldl accountStep (accountStep s b) bs).2.2.length ≤ (accountStep s b).2.2.length + bs.lengthhz:zeroCount (List.foldl accountStep (accountStep s b) bs).1.1 ≤ zeroCount (accountStep s b).1.1 + bs.length⊢ (List.foldl accountStep (accountStep s b) bs).2.1.length ≤ s.2.1.length + (bs.length + 1) ∧
(List.foldl accountStep (accountStep s b) bs).2.2.length ≤ s.2.2.length + (bs.length + 1) ∧
zeroCount (List.foldl accountStep (accountStep s b) bs).1.1 ≤ zeroCount s.1.1 + (bs.length + 1)
dsimp only [accountStep] at hb hc hz ⊢ w:List Boolb:Boolbs:List Boolih:∀ (s : Account),
(List.foldl accountStep s bs).2.1.length ≤ s.2.1.length + bs.length ∧
(List.foldl accountStep s bs).2.2.length ≤ s.2.2.length + bs.length ∧
zeroCount (List.foldl accountStep s bs).1.1 ≤ zeroCount s.1.1 + bs.lengths:Accounthbs:(nextWords s.1.1 s.2.1 s.2.2 b).1.length ≤ s.2.1.length + 1hcs:(nextWords s.1.1 s.2.1 s.2.2 b).2.length ≤ s.2.2.length + 1hzs:zeroCount (Scanner.step s.1 b).1 ≤ zeroCount s.1.1 + 1hb:(List.foldl accountStep (Scanner.step s.1 b, nextWords s.1.1 s.2.1 s.2.2 b) bs).2.1.length ≤
(nextWords s.1.1 s.2.1 s.2.2 b).1.length + bs.lengthhc:(List.foldl accountStep (Scanner.step s.1 b, nextWords s.1.1 s.2.1 s.2.2 b) bs).2.2.length ≤
(nextWords s.1.1 s.2.1 s.2.2 b).2.length + bs.lengthhz:zeroCount (List.foldl accountStep (Scanner.step s.1 b, nextWords s.1.1 s.2.1 s.2.2 b) bs).1.1 ≤
zeroCount (Scanner.step s.1 b).1 + bs.length⊢ (List.foldl accountStep (Scanner.step s.1 b, nextWords s.1.1 s.2.1 s.2.2 b) bs).2.1.length ≤
s.2.1.length + (bs.length + 1) ∧
(List.foldl accountStep (Scanner.step s.1 b, nextWords s.1.1 s.2.1 s.2.2 b) bs).2.2.length ≤
s.2.2.length + (bs.length + 1) ∧
zeroCount (List.foldl accountStep (Scanner.step s.1 b, nextWords s.1.1 s.2.1 s.2.2 b) bs).1.1 ≤
zeroCount s.1.1 + (bs.length + 1)
exact ⟨by w:List Boolb:Boolbs:List Boolih:∀ (s : Account),
(List.foldl accountStep s bs).2.1.length ≤ s.2.1.length + bs.length ∧
(List.foldl accountStep s bs).2.2.length ≤ s.2.2.length + bs.length ∧
zeroCount (List.foldl accountStep s bs).1.1 ≤ zeroCount s.1.1 + bs.lengths:Accounthbs:(nextWords s.1.1 s.2.1 s.2.2 b).1.length ≤ s.2.1.length + 1hcs:(nextWords s.1.1 s.2.1 s.2.2 b).2.length ≤ s.2.2.length + 1hzs:zeroCount (Scanner.step s.1 b).1 ≤ zeroCount s.1.1 + 1hb:(List.foldl accountStep (Scanner.step s.1 b, nextWords s.1.1 s.2.1 s.2.2 b) bs).2.1.length ≤
(nextWords s.1.1 s.2.1 s.2.2 b).1.length + bs.lengthhc:(List.foldl accountStep (Scanner.step s.1 b, nextWords s.1.1 s.2.1 s.2.2 b) bs).2.2.length ≤
(nextWords s.1.1 s.2.1 s.2.2 b).2.length + bs.lengthhz:zeroCount (List.foldl accountStep (Scanner.step s.1 b, nextWords s.1.1 s.2.1 s.2.2 b) bs).1.1 ≤
zeroCount (Scanner.step s.1 b).1 + bs.length⊢ (List.foldl accountStep (Scanner.step s.1 b, nextWords s.1.1 s.2.1 s.2.2 b) bs).2.1.length ≤
s.2.1.length + (bs.length + 1) omega All goals completed! 🐙, by w:List Boolb:Boolbs:List Boolih:∀ (s : Account),
(List.foldl accountStep s bs).2.1.length ≤ s.2.1.length + bs.length ∧
(List.foldl accountStep s bs).2.2.length ≤ s.2.2.length + bs.length ∧
zeroCount (List.foldl accountStep s bs).1.1 ≤ zeroCount s.1.1 + bs.lengths:Accounthbs:(nextWords s.1.1 s.2.1 s.2.2 b).1.length ≤ s.2.1.length + 1hcs:(nextWords s.1.1 s.2.1 s.2.2 b).2.length ≤ s.2.2.length + 1hzs:zeroCount (Scanner.step s.1 b).1 ≤ zeroCount s.1.1 + 1hb:(List.foldl accountStep (Scanner.step s.1 b, nextWords s.1.1 s.2.1 s.2.2 b) bs).2.1.length ≤
(nextWords s.1.1 s.2.1 s.2.2 b).1.length + bs.lengthhc:(List.foldl accountStep (Scanner.step s.1 b, nextWords s.1.1 s.2.1 s.2.2 b) bs).2.2.length ≤
(nextWords s.1.1 s.2.1 s.2.2 b).2.length + bs.lengthhz:zeroCount (List.foldl accountStep (Scanner.step s.1 b, nextWords s.1.1 s.2.1 s.2.2 b) bs).1.1 ≤
zeroCount (Scanner.step s.1 b).1 + bs.length⊢ (List.foldl accountStep (Scanner.step s.1 b, nextWords s.1.1 s.2.1 s.2.2 b) bs).2.2.length ≤
s.2.2.length + (bs.length + 1) omega All goals completed! 🐙, by w:List Boolb:Boolbs:List Boolih:∀ (s : Account),
(List.foldl accountStep s bs).2.1.length ≤ s.2.1.length + bs.length ∧
(List.foldl accountStep s bs).2.2.length ≤ s.2.2.length + bs.length ∧
zeroCount (List.foldl accountStep s bs).1.1 ≤ zeroCount s.1.1 + bs.lengths:Accounthbs:(nextWords s.1.1 s.2.1 s.2.2 b).1.length ≤ s.2.1.length + 1hcs:(nextWords s.1.1 s.2.1 s.2.2 b).2.length ≤ s.2.2.length + 1hzs:zeroCount (Scanner.step s.1 b).1 ≤ zeroCount s.1.1 + 1hb:(List.foldl accountStep (Scanner.step s.1 b, nextWords s.1.1 s.2.1 s.2.2 b) bs).2.1.length ≤
(nextWords s.1.1 s.2.1 s.2.2 b).1.length + bs.lengthhc:(List.foldl accountStep (Scanner.step s.1 b, nextWords s.1.1 s.2.1 s.2.2 b) bs).2.2.length ≤
(nextWords s.1.1 s.2.1 s.2.2 b).2.length + bs.lengthhz:zeroCount (List.foldl accountStep (Scanner.step s.1 b, nextWords s.1.1 s.2.1 s.2.2 b) bs).1.1 ≤
zeroCount (Scanner.step s.1 b).1 + bs.length⊢ zeroCount (List.foldl accountStep (Scanner.step s.1 b, nextWords s.1.1 s.2.1 s.2.2 b) bs).1.1 ≤
zeroCount s.1.1 + (bs.length + 1) omega All goals completed! 🐙⟩) wEach binary field uses at most the input length.
theorem account_lengths_le (w : List Bool) :
(account w).2.1.length ≤ w.length ∧ (account w).2.2.length ≤ w.length := by w:List Bool⊢ (account w).2.1.length ≤ w.length ∧ (account w).2.2.length ≤ w.length
obtain ⟨hb, hc, _⟩ := account_foldl_bounds w initialAccount w:List Boolhb:(List.foldl accountStep initialAccount w).2.1.length ≤ initialAccount.2.1.length + w.lengthhc:(List.foldl accountStep initialAccount w).2.2.length ≤ initialAccount.2.2.length + w.lengthright✝:zeroCount (List.foldl accountStep initialAccount w).1.1 ≤ zeroCount initialAccount.1.1 + w.length⊢ (account w).2.1.length ≤ w.length ∧ (account w).2.2.length ≤ w.length
simpa only [account, initialAccount, List.length_nil, Nat.zero_add] using And.intro hb hc All goals completed! 🐙The unary header counter is bounded by the input length.
theorem account_zeros_le (w : List Bool) : zeroCount (account w).1.1 ≤ w.length := by w:List Bool⊢ zeroCount (account w).1.1 ≤ w.length
simpa only [account, initialAccount, zeroCount, Nat.zero_add] using
(account_foldl_bounds w initialAccount).2.2 All goals completed! 🐙Pending subtrees use at most one plus the input length.
theorem account_pending_le (w : List Bool) : (account w).1.2 ≤ w.length + 1 := by w:List Bool⊢ (account w).1.2 ≤ w.length + 1
rw [account_project w:List Bool⊢ (Scanner.scan w).2 ≤ w.length + 1] w:List Bool⊢ (Scanner.scan w).2 ≤ w.length + 1
exact Scanner.scan_pending_le w All goals completed! 🐙Appending one bit advances the account once.
theorem account_append (w : List Bool) (b : Bool) :
account (w ++ [b]) = accountStep (account w) b := by w:List Boolb:Bool⊢ account (w ++ [b]) = accountStep (account w) b
simp only [account, List.foldl_append, List.foldl_cons, List.foldl_nil] All goals completed! 🐙Machine time for one complete input transition.
Advance the account while accumulating machine time.
def costStep (s : Account × ℕ) (b : Bool) : Account × ℕ :=
(accountStep s.1 b, s.2 + macroCost s.1 b)Time accounting leaves the account projection unchanged.
theorem cost_foldl_fst (w : List Bool) : ∀ s c,
(w.foldl costStep (s, c)).1 = w.foldl accountStep s :=
List.rec (fun _ _ ↦ rfl) (fun b _ ih s c ↦ ih (accountStep s b) (c + macroCost s b)) wTotal transition time before the final end-marker decision.
def runCost (w : List Bool) : ℕ := (w.foldl costStep (initialAccount, 0)).2Appending one input bit adds its exact macro cost.
theorem runCost_append (w : List Bool) (b : Bool) :
runCost (w ++ [b]) = runCost w + macroCost (account w) b := by w:List Boolb:Bool⊢ runCost (w ++ [b]) = runCost w + macroCost (account w) b
simp only [runCost, List.foldl_append, List.foldl_cons, List.foldl_nil, costStep,
cost_foldl_fst, account] All goals completed! 🐙A width bound gives a uniform linear bound for one macro transition.
theorem bitCost_le (m : Scanner.Mode) (bs cs : List Bool) (b : Bool) (width : ℕ)
(hb : bs.length ≤ width) (hc : cs.length ≤ width) :
bitCost m bs cs b ≤ 5 * width + 16 := by m:Scanner.Modebs:List Boolcs:List Boolb:Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ width⊢ bitCost m bs cs b ≤ 5 * width + 16
cases m tree bs:List Boolcs:List Boolb:Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ width⊢ bitCost Scanner.Mode.tree bs cs b ≤ 5 * width + 16zeros bs:List Boolcs:List Boolb:Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ widthcount✝:ℕ⊢ bitCost (Scanner.Mode.zeros count✝) bs cs b ≤ 5 * width + 16size bs:List Boolcs:List Boolb:Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ widthremaining✝:ℕvalue✝:ℕ⊢ bitCost (Scanner.Mode.size remaining✝ value✝) bs cs b ≤ 5 * width + 16length bs:List Boolcs:List Boolb:Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ widthremaining✝:ℕvalue✝:ℕ⊢ bitCost (Scanner.Mode.length remaining✝ value✝) bs cs b ≤ 5 * width + 16payload bs:List Boolcs:List Boolb:Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ widthremaining✝:ℕ⊢ bitCost (Scanner.Mode.payload remaining✝) bs cs b ≤ 5 * width + 16done bs:List Boolcs:List Boolb:Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ width⊢ bitCost Scanner.Mode.done bs cs b ≤ 5 * width + 16dead bs:List Boolcs:List Boolb:Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ width⊢ bitCost Scanner.Mode.dead bs cs b ≤ 5 * width + 16 <;> tree bs:List Boolcs:List Boolb:Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ width⊢ bitCost Scanner.Mode.tree bs cs b ≤ 5 * width + 16zeros bs:List Boolcs:List Boolb:Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ widthcount✝:ℕ⊢ bitCost (Scanner.Mode.zeros count✝) bs cs b ≤ 5 * width + 16size bs:List Boolcs:List Boolb:Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ widthremaining✝:ℕvalue✝:ℕ⊢ bitCost (Scanner.Mode.size remaining✝ value✝) bs cs b ≤ 5 * width + 16length bs:List Boolcs:List Boolb:Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ widthremaining✝:ℕvalue✝:ℕ⊢ bitCost (Scanner.Mode.length remaining✝ value✝) bs cs b ≤ 5 * width + 16payload bs:List Boolcs:List Boolb:Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ widthremaining✝:ℕ⊢ bitCost (Scanner.Mode.payload remaining✝) bs cs b ≤ 5 * width + 16done bs:List Boolcs:List Boolb:Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ width⊢ bitCost Scanner.Mode.done bs cs b ≤ 5 * width + 16dead bs:List Boolcs:List Boolb:Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ width⊢ bitCost Scanner.Mode.dead bs cs b ≤ 5 * width + 16 cases b dead.false bs:List Boolcs:List Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ width⊢ bitCost Scanner.Mode.dead bs cs false ≤ 5 * width + 16dead.true bs:List Boolcs:List Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ width⊢ bitCost Scanner.Mode.dead bs cs true ≤ 5 * width + 16 <;> tree.false bs:List Boolcs:List Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ width⊢ bitCost Scanner.Mode.tree bs cs false ≤ 5 * width + 16tree.true bs:List Boolcs:List Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ width⊢ bitCost Scanner.Mode.tree bs cs true ≤ 5 * width + 16zeros.false bs:List Boolcs:List Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ widthcount✝:ℕ⊢ bitCost (Scanner.Mode.zeros count✝) bs cs false ≤ 5 * width + 16zeros.true bs:List Boolcs:List Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ widthcount✝:ℕ⊢ bitCost (Scanner.Mode.zeros count✝) bs cs true ≤ 5 * width + 16size.false bs:List Boolcs:List Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ widthremaining✝:ℕvalue✝:ℕ⊢ bitCost (Scanner.Mode.size remaining✝ value✝) bs cs false ≤ 5 * width + 16size.true bs:List Boolcs:List Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ widthremaining✝:ℕvalue✝:ℕ⊢ bitCost (Scanner.Mode.size remaining✝ value✝) bs cs true ≤ 5 * width + 16length.false bs:List Boolcs:List Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ widthremaining✝:ℕvalue✝:ℕ⊢ bitCost (Scanner.Mode.length remaining✝ value✝) bs cs false ≤ 5 * width + 16length.true bs:List Boolcs:List Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ widthremaining✝:ℕvalue✝:ℕ⊢ bitCost (Scanner.Mode.length remaining✝ value✝) bs cs true ≤ 5 * width + 16payload.false bs:List Boolcs:List Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ widthremaining✝:ℕ⊢ bitCost (Scanner.Mode.payload remaining✝) bs cs false ≤ 5 * width + 16payload.true bs:List Boolcs:List Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ widthremaining✝:ℕ⊢ bitCost (Scanner.Mode.payload remaining✝) bs cs true ≤ 5 * width + 16done.false bs:List Boolcs:List Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ width⊢ bitCost Scanner.Mode.done bs cs false ≤ 5 * width + 16done.true bs:List Boolcs:List Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ width⊢ bitCost Scanner.Mode.done bs cs true ≤ 5 * width + 16dead.false bs:List Boolcs:List Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ width⊢ bitCost Scanner.Mode.dead bs cs false ≤ 5 * width + 16dead.true bs:List Boolcs:List Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ width⊢ bitCost Scanner.Mode.dead bs cs true ≤ 5 * width + 16 simp only [bitCost] dead.true bs:List Boolcs:List Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ width⊢ 1 ≤ 5 * width + 16 <;> tree.false bs:List Boolcs:List Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ width⊢ 1 ≤ 5 * width + 16tree.true bs:List Boolcs:List Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ width⊢ 1 ≤ 5 * width + 16zeros.false bs:List Boolcs:List Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ widthcount✝:ℕ⊢ 1 ≤ 5 * width + 16zeros.true bs:List Boolcs:List Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ widthcount✝:ℕ⊢ (if count✝ = 0 then 16 else 2) ≤ 5 * width + 16size.false bs:List Boolcs:List Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ widthremaining✝:ℕvalue✝:ℕ⊢ (if remaining✝ = 1 then 2 * bs.length + 7 else 2) ≤ 5 * width + 16size.true bs:List Boolcs:List Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ widthremaining✝:ℕvalue✝:ℕ⊢ (if remaining✝ = 1 then 2 * bs.length + 7 else 2) ≤ 5 * width + 16length.false bs:List Boolcs:List Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ widthremaining✝:ℕvalue✝:ℕ⊢ (if remaining✝ = 1 then 2 * bs.length + 2 * cs.length + 9 else 2 * bs.length + 4) ≤ 5 * width + 16length.true bs:List Boolcs:List Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ widthremaining✝:ℕvalue✝:ℕ⊢ (if remaining✝ = 1 then 2 * bs.length + 2 * cs.length + 9 else 2 * bs.length + 4) ≤ 5 * width + 16payload.false bs:List Boolcs:List Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ widthremaining✝:ℕ⊢ (if remaining✝ = 1 then 2 * cs.length + max bs.length cs.length + 7 else 2 * cs.length + 4) ≤ 5 * width + 16payload.true bs:List Boolcs:List Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ widthremaining✝:ℕ⊢ (if remaining✝ = 1 then 2 * cs.length + max bs.length cs.length + 7 else 2 * cs.length + 4) ≤ 5 * width + 16done.false bs:List Boolcs:List Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ width⊢ 1 ≤ 5 * width + 16done.true bs:List Boolcs:List Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ width⊢ 1 ≤ 5 * width + 16dead.false bs:List Boolcs:List Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ width⊢ 1 ≤ 5 * width + 16dead.true bs:List Boolcs:List Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ width⊢ 1 ≤ 5 * width + 16
first | omega All goals completed! 🐙 | (split payload.true.isTrue bs:List Boolcs:List Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ widthremaining✝:ℕh✝:remaining✝ = 1⊢ 2 * cs.length + max bs.length cs.length + 7 ≤ 5 * width + 16payload.true.isFalse bs:List Boolcs:List Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ widthremaining✝:ℕh✝:¬remaining✝ = 1⊢ 2 * cs.length + 4 ≤ 5 * width + 16 <;> payload.true.isTrue bs:List Boolcs:List Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ widthremaining✝:ℕh✝:remaining✝ = 1⊢ 2 * cs.length + max bs.length cs.length + 7 ≤ 5 * width + 16payload.true.isFalse bs:List Boolcs:List Boolwidth:ℕhb:bs.length ≤ widthhc:cs.length ≤ widthremaining✝:ℕh✝:¬remaining✝ = 1⊢ 2 * cs.length + 4 ≤ 5 * width + 16 omega All goals completed! 🐙)Every transition cost is positive.
theorem macroCost_pos (s : Account) (b : Bool) : 0 < macroCost s b := by s:Accountb:Bool⊢ 0 < macroCost s b
rcases s with ⟨⟨m, n⟩, bs, cs⟩ b:Boolm:Scanner.Moden:ℕbs:List Boolcs:List Bool⊢ 0 < macroCost ((m, n), bs, cs) b
cases m tree b:Booln:ℕbs:List Boolcs:List Bool⊢ 0 < macroCost ((Scanner.Mode.tree, n), bs, cs) bzeros b:Booln:ℕbs:List Boolcs:List Boolcount✝:ℕ⊢ 0 < macroCost ((Scanner.Mode.zeros count✝, n), bs, cs) bsize b:Booln:ℕbs:List Boolcs:List Boolremaining✝:ℕvalue✝:ℕ⊢ 0 < macroCost ((Scanner.Mode.size remaining✝ value✝, n), bs, cs) blength b:Booln:ℕbs:List Boolcs:List Boolremaining✝:ℕvalue✝:ℕ⊢ 0 < macroCost ((Scanner.Mode.length remaining✝ value✝, n), bs, cs) bpayload b:Booln:ℕbs:List Boolcs:List Boolremaining✝:ℕ⊢ 0 < macroCost ((Scanner.Mode.payload remaining✝, n), bs, cs) bdone b:Booln:ℕbs:List Boolcs:List Bool⊢ 0 < macroCost ((Scanner.Mode.done, n), bs, cs) bdead b:Booln:ℕbs:List Boolcs:List Bool⊢ 0 < macroCost ((Scanner.Mode.dead, n), bs, cs) b <;> tree b:Booln:ℕbs:List Boolcs:List Bool⊢ 0 < macroCost ((Scanner.Mode.tree, n), bs, cs) bzeros b:Booln:ℕbs:List Boolcs:List Boolcount✝:ℕ⊢ 0 < macroCost ((Scanner.Mode.zeros count✝, n), bs, cs) bsize b:Booln:ℕbs:List Boolcs:List Boolremaining✝:ℕvalue✝:ℕ⊢ 0 < macroCost ((Scanner.Mode.size remaining✝ value✝, n), bs, cs) blength b:Booln:ℕbs:List Boolcs:List Boolremaining✝:ℕvalue✝:ℕ⊢ 0 < macroCost ((Scanner.Mode.length remaining✝ value✝, n), bs, cs) bpayload b:Booln:ℕbs:List Boolcs:List Boolremaining✝:ℕ⊢ 0 < macroCost ((Scanner.Mode.payload remaining✝, n), bs, cs) bdone b:Booln:ℕbs:List Boolcs:List Bool⊢ 0 < macroCost ((Scanner.Mode.done, n), bs, cs) bdead b:Booln:ℕbs:List Boolcs:List Bool⊢ 0 < macroCost ((Scanner.Mode.dead, n), bs, cs) b cases b dead.false n:ℕbs:List Boolcs:List Bool⊢ 0 < macroCost ((Scanner.Mode.dead, n), bs, cs) falsedead.true n:ℕbs:List Boolcs:List Bool⊢ 0 < macroCost ((Scanner.Mode.dead, n), bs, cs) true <;> tree.false n:ℕbs:List Boolcs:List Bool⊢ 0 < macroCost ((Scanner.Mode.tree, n), bs, cs) falsetree.true n:ℕbs:List Boolcs:List Bool⊢ 0 < macroCost ((Scanner.Mode.tree, n), bs, cs) truezeros.false n:ℕbs:List Boolcs:List Boolcount✝:ℕ⊢ 0 < macroCost ((Scanner.Mode.zeros count✝, n), bs, cs) falsezeros.true n:ℕbs:List Boolcs:List Boolcount✝:ℕ⊢ 0 < macroCost ((Scanner.Mode.zeros count✝, n), bs, cs) truesize.false n:ℕbs:List Boolcs:List Boolremaining✝:ℕvalue✝:ℕ⊢ 0 < macroCost ((Scanner.Mode.size remaining✝ value✝, n), bs, cs) falsesize.true n:ℕbs:List Boolcs:List Boolremaining✝:ℕvalue✝:ℕ⊢ 0 < macroCost ((Scanner.Mode.size remaining✝ value✝, n), bs, cs) truelength.false n:ℕbs:List Boolcs:List Boolremaining✝:ℕvalue✝:ℕ⊢ 0 < macroCost ((Scanner.Mode.length remaining✝ value✝, n), bs, cs) falselength.true n:ℕbs:List Boolcs:List Boolremaining✝:ℕvalue✝:ℕ⊢ 0 < macroCost ((Scanner.Mode.length remaining✝ value✝, n), bs, cs) truepayload.false n:ℕbs:List Boolcs:List Boolremaining✝:ℕ⊢ 0 < macroCost ((Scanner.Mode.payload remaining✝, n), bs, cs) falsepayload.true n:ℕbs:List Boolcs:List Boolremaining✝:ℕ⊢ 0 < macroCost ((Scanner.Mode.payload remaining✝, n), bs, cs) truedone.false n:ℕbs:List Boolcs:List Bool⊢ 0 < macroCost ((Scanner.Mode.done, n), bs, cs) falsedone.true n:ℕbs:List Boolcs:List Bool⊢ 0 < macroCost ((Scanner.Mode.done, n), bs, cs) truedead.false n:ℕbs:List Boolcs:List Bool⊢ 0 < macroCost ((Scanner.Mode.dead, n), bs, cs) falsedead.true n:ℕbs:List Boolcs:List Bool⊢ 0 < macroCost ((Scanner.Mode.dead, n), bs, cs) true simp only [macroCost, bitCost] dead.true n:ℕbs:List Boolcs:List Bool⊢ 0 < 1 <;> tree.false n:ℕbs:List Boolcs:List Bool⊢ 0 < 1tree.true n:ℕbs:List Boolcs:List Bool⊢ 0 < 1zeros.false n:ℕbs:List Boolcs:List Boolcount✝:ℕ⊢ 0 < 1zeros.true n:ℕbs:List Boolcs:List Boolcount✝:ℕ⊢ 0 < if count✝ = 0 then 16 else 2size.false n:ℕbs:List Boolcs:List Boolremaining✝:ℕvalue✝:ℕ⊢ 0 < if remaining✝ = 1 then 2 * bs.length + 7 else 2size.true n:ℕbs:List Boolcs:List Boolremaining✝:ℕvalue✝:ℕ⊢ 0 < if remaining✝ = 1 then 2 * bs.length + 7 else 2length.false n:ℕbs:List Boolcs:List Boolremaining✝:ℕvalue✝:ℕ⊢ 0 < if remaining✝ = 1 then 2 * bs.length + 2 * cs.length + 9 else 2 * bs.length + 4length.true n:ℕbs:List Boolcs:List Boolremaining✝:ℕvalue✝:ℕ⊢ 0 < if remaining✝ = 1 then 2 * bs.length + 2 * cs.length + 9 else 2 * bs.length + 4payload.false n:ℕbs:List Boolcs:List Boolremaining✝:ℕ⊢ 0 < if remaining✝ = 1 then 2 * cs.length + max bs.length cs.length + 7 else 2 * cs.length + 4payload.true n:ℕbs:List Boolcs:List Boolremaining✝:ℕ⊢ 0 < if remaining✝ = 1 then 2 * cs.length + max bs.length cs.length + 7 else 2 * cs.length + 4done.false n:ℕbs:List Boolcs:List Bool⊢ 0 < 1done.true n:ℕbs:List Boolcs:List Bool⊢ 0 < 1dead.false n:ℕbs:List Boolcs:List Bool⊢ 0 < 1dead.true n:ℕbs:List Boolcs:List Bool⊢ 0 < 1
first | omega All goals completed! 🐙 | (split payload.true.isTrue n:ℕbs:List Boolcs:List Boolremaining✝:ℕh✝:remaining✝ = 1⊢ 0 < 2 * cs.length + max bs.length cs.length + 7payload.true.isFalse n:ℕbs:List Boolcs:List Boolremaining✝:ℕh✝:¬remaining✝ = 1⊢ 0 < 2 * cs.length + 4 <;> payload.true.isTrue n:ℕbs:List Boolcs:List Boolremaining✝:ℕh✝:remaining✝ = 1⊢ 0 < 2 * cs.length + max bs.length cs.length + 7payload.true.isFalse n:ℕbs:List Boolcs:List Boolremaining✝:ℕh✝:¬remaining✝ = 1⊢ 0 < 2 * cs.length + 4 omega All goals completed! 🐙)The total macro time is bounded by a quadratic polynomial in input length.
theorem runCost_le (w : List Bool) : runCost w ≤ 5 * w.length ^ 2 + 16 * w.length := by w:List Bool⊢ runCost w ≤ 5 * w.length ^ 2 + 16 * w.length
refine List.reverseRecOn w ?_ ?_ refine_1 w:List Bool⊢ runCost [] ≤ 5 * [].length ^ 2 + 16 * [].lengthrefine_2 w:List Bool⊢ ∀ (l : List Bool) (a : Bool),
runCost l ≤ 5 * l.length ^ 2 + 16 * l.length → runCost (l ++ [a]) ≤ 5 * (l ++ [a]).length ^ 2 + 16 * (l ++ [a]).length
· refine_1 w:List Bool⊢ runCost [] ≤ 5 * [].length ^ 2 + 16 * [].length exact Nat.le_refl 0 All goals completed! 🐙
· refine_2 w:List Bool⊢ ∀ (l : List Bool) (a : Bool),
runCost l ≤ 5 * l.length ^ 2 + 16 * l.length → runCost (l ++ [a]) ≤ 5 * (l ++ [a]).length ^ 2 + 16 * (l ++ [a]).length intro bs b ih refine_2 w:List Boolbs:List Boolb:Boolih:runCost bs ≤ 5 * bs.length ^ 2 + 16 * bs.length⊢ runCost (bs ++ [b]) ≤ 5 * (bs ++ [b]).length ^ 2 + 16 * (bs ++ [b]).length
obtain ⟨hb, hc⟩ := account_lengths_le bs refine_2 w:List Boolbs:List Boolb:Boolih:runCost bs ≤ 5 * bs.length ^ 2 + 16 * bs.lengthhb:(account bs).2.1.length ≤ bs.lengthhc:(account bs).2.2.length ≤ bs.length⊢ runCost (bs ++ [b]) ≤ 5 * (bs ++ [b]).length ^ 2 + 16 * (bs ++ [b]).length
have hcost := bitCost_le (account bs).1.1 (account bs).2.1 (account bs).2.2
b bs.length hb hc refine_2 w:List Boolbs:List Boolb:Boolih:runCost bs ≤ 5 * bs.length ^ 2 + 16 * bs.lengthhb:(account bs).2.1.length ≤ bs.lengthhc:(account bs).2.2.length ≤ bs.lengthhcost:bitCost (account bs).1.1 (account bs).2.1 (account bs).2.2 b ≤ 5 * bs.length + 16⊢ runCost (bs ++ [b]) ≤ 5 * (bs ++ [b]).length ^ 2 + 16 * (bs ++ [b]).length
change macroCost (account bs) b ≤ _ at hcost refine_2 w:List Boolbs:List Boolb:Boolih:runCost bs ≤ 5 * bs.length ^ 2 + 16 * bs.lengthhb:(account bs).2.1.length ≤ bs.lengthhc:(account bs).2.2.length ≤ bs.lengthhcost:macroCost (account bs) b ≤ 5 * bs.length + 16⊢ runCost (bs ++ [b]) ≤ 5 * (bs ++ [b]).length ^ 2 + 16 * (bs ++ [b]).length
rw [runCost_append refine_2 w:List Boolbs:List Boolb:Boolih:runCost bs ≤ 5 * bs.length ^ 2 + 16 * bs.lengthhb:(account bs).2.1.length ≤ bs.lengthhc:(account bs).2.2.length ≤ bs.lengthhcost:macroCost (account bs) b ≤ 5 * bs.length + 16⊢ runCost bs + macroCost (account bs) b ≤ 5 * (bs ++ [b]).length ^ 2 + 16 * (bs ++ [b]).length] refine_2 w:List Boolbs:List Boolb:Boolih:runCost bs ≤ 5 * bs.length ^ 2 + 16 * bs.lengthhb:(account bs).2.1.length ≤ bs.lengthhc:(account bs).2.2.length ≤ bs.lengthhcost:macroCost (account bs) b ≤ 5 * bs.length + 16⊢ runCost bs + macroCost (account bs) b ≤ 5 * (bs ++ [b]).length ^ 2 + 16 * (bs ++ [b]).length
simp only [List.length_append, List.length_cons, List.length_nil, Nat.zero_add,
Nat.pow_two, Nat.add_mul, Nat.mul_add, Nat.mul_one, Nat.one_mul] refine_2 w:List Boolbs:List Boolb:Boolih:runCost bs ≤ 5 * bs.length ^ 2 + 16 * bs.lengthhb:(account bs).2.1.length ≤ bs.lengthhc:(account bs).2.2.length ≤ bs.lengthhcost:macroCost (account bs) b ≤ 5 * bs.length + 16⊢ runCost bs + macroCost (account bs) b ≤
5 * (bs.length * bs.length) + 5 * bs.length + (5 * bs.length + 5) + (16 * bs.length + 16)
rw [Nat.pow_two refine_2 w:List Boolbs:List Boolb:Boolih:runCost bs ≤ 5 * (bs.length * bs.length) + 16 * bs.lengthhb:(account bs).2.1.length ≤ bs.lengthhc:(account bs).2.2.length ≤ bs.lengthhcost:macroCost (account bs) b ≤ 5 * bs.length + 16⊢ runCost bs + macroCost (account bs) b ≤
5 * (bs.length * bs.length) + 5 * bs.length + (5 * bs.length + 5) + (16 * bs.length + 16)] at ih refine_2 w:List Boolbs:List Boolb:Boolih:runCost bs ≤ 5 * (bs.length * bs.length) + 16 * bs.lengthhb:(account bs).2.1.length ≤ bs.lengthhc:(account bs).2.2.length ≤ bs.lengthhcost:macroCost (account bs) b ≤ 5 * bs.length + 16⊢ runCost bs + macroCost (account bs) b ≤
5 * (bs.length * bs.length) + 5 * bs.length + (5 * bs.length + 5) + (16 * bs.length + 16)
omega All goals completed! 🐙The account at the next prefix is a single update of the current account.
theorem account_take_succ (w : List Bool) (t : ℕ) (h : t < w.length) :
account (w.take (t + 1)) = accountStep (account (w.take t)) w[t] := by w:List Boolt:ℕh:t < w.length⊢ account (List.take (t + 1) w) = accountStep (account (List.take t w)) w[t]
rw [List.take_succ_eq_append_getElem h, w:List Boolt:ℕh:t < w.length⊢ account (List.take t w ++ [w[t]]) = accountStep (account (List.take t w)) w[t] account_append w:List Boolt:ℕh:t < w.length⊢ accountStep (account (List.take t w)) w[t] = accountStep (account (List.take t w)) w[t]] All goals completed! 🐙The next prefix adds exactly one complete transition cost.
theorem runCost_take_succ (w : List Bool) (t : ℕ) (h : t < w.length) :
runCost (w.take (t + 1)) =
runCost (w.take t) + macroCost (account (w.take t)) w[t] := by w:List Boolt:ℕh:t < w.length⊢ runCost (List.take (t + 1) w) = runCost (List.take t w) + macroCost (account (List.take t w)) w[t]
rw [List.take_succ_eq_append_getElem h, w:List Boolt:ℕh:t < w.length⊢ runCost (List.take t w ++ [w[t]]) = runCost (List.take t w) + macroCost (account (List.take t w)) w[t] runCost_append w:List Boolt:ℕh:t < w.length⊢ runCost (List.take t w) + macroCost (account (List.take t w)) w[t] =
runCost (List.take t w) + macroCost (account (List.take t w)) w[t]] All goals completed! 🐙Binary fields at any prefix fit within the length of the whole input.
theorem prefix_lengths_le (w : List Bool) (t : ℕ) :
(account (w.take t)).2.1.length ≤ w.length ∧
(account (w.take t)).2.2.length ≤ w.length := by w:List Boolt:ℕ⊢ (account (List.take t w)).2.1.length ≤ w.length ∧ (account (List.take t w)).2.2.length ≤ w.length
obtain ⟨hb, hc⟩ := account_lengths_le (w.take t) w:List Boolt:ℕhb:(account (List.take t w)).2.1.length ≤ (List.take t w).lengthhc:(account (List.take t w)).2.2.length ≤ (List.take t w).length⊢ (account (List.take t w)).2.1.length ≤ w.length ∧ (account (List.take t w)).2.2.length ≤ w.length
have ht : (w.take t).length ≤ w.length := by simp only [List.length_take] w:List Boolt:ℕhb:(account (List.take t w)).2.1.length ≤ (List.take t w).lengthhc:(account (List.take t w)).2.2.length ≤ (List.take t w).length⊢ min t w.length ≤ w.length; omega w:List Boolt:ℕhb:(account (List.take t w)).2.1.length ≤ (List.take t w).lengthhc:(account (List.take t w)).2.2.length ≤ (List.take t w).lengthht:(List.take t w).length ≤ w.length⊢ (account (List.take t w)).2.1.length ≤ w.length ∧ (account (List.take t w)).2.2.length ≤ w.length
exact ⟨Nat.le_trans hb ht, Nat.le_trans hc ht⟩ All goals completed! 🐙end Geb.BitTree.Elias.Machine