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.MachineModel
set_option doc.verso true

Space 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

  • account records scalar state and binary words at each input boundary.

  • runCost sums the machine's transition costs.

Tags

Elias delta code, complexity, binary counter

@[expose] public sectionnamespace Geb.BitTree.Elias.Machine

Binary-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 csWords (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 csWords (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 csWords (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 csWords (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 csWords (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 csWords (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 csWords (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 csWords (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 = 0Words (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 = 0Words (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 = 0Words (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 = 0Words (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 = 0Words (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 = 1Words (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 = 1Words (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 = 1Words (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 = 1Words (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 = 0Words (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 = 0Counter.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 csWords (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 < vWords (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 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 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 = 1Words (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).2bs: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 = 1Words (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]hp:0 < Counter.value (b :: bs)he:r = 1Words (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]hp:0 < Counter.value (b :: bs)he:r = 1True 2 * Counter.value [] + true.toNat = 1 All goals completed! 🐙 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 = 1Words (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]hp:0 < Counter.value (b :: bs)he:¬r = 1True cs = [true] All goals completed! 🐙 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 csWords (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 bs:List Boolcs:List Boolb:Booln:r:v:hw:Words (Scanner.Mode.length r v, n).1 bs cshn:0 < nhr:0 < rhv:0 < vWords (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 bs:List Boolcs:List Boolb:Booln:r:v:hn:0 < nhr:0 < rhv:0 < vhb:Counter.value bs = rhc:Counter.value cs = vWords (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 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 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 bsWords (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 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 = 1Words (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).2bs: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 = 1Words (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 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 = 1Words (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 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 = 1True True All goals completed! 🐙 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 = 1Words (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 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 = 1True True All goals completed! 🐙 bs:List Boolcs:List Boolb:Booln:r:ha:Scanner.Active (Scanner.Mode.payload r, n)hw:Words (Scanner.Mode.payload r, n).1 bs csWords (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 bs:List Boolcs:List Boolb:Booln:r:hw:Words (Scanner.Mode.payload r, n).1 bs cshn:0 < nhr:0 < rWords (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 bs:List Boolcs:List Boolb:Booln:r:hn:0 < nhr:0 < rhb:Counter.value bs = 0hc:Counter.value cs = rWords (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 bs:List Boolcs:List Boolb:Booln:r:hn:0 < nhr:0 < rhb:Counter.value bs = 0hc:Counter.value cs = rhe:r = 1Words (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).2bs:List Boolcs:List Boolb:Booln:r:hn:0 < nhr:0 < rhb:Counter.value bs = 0hc:Counter.value cs = rhe:¬r = 1Words (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 bs:List Boolcs:List Boolb:Booln:r:hn:0 < nhr:0 < rhb:Counter.value bs = 0hc:Counter.value cs = rhe:r = 1Words (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 bs:List Boolcs:List Boolb:Booln:r:hn:0 < nhr:0 < rhb:Counter.value bs = 0hc:Counter.value cs = rhe:r = 1Words (Scanner.finish n).1 [] [] bs:List Boolcs:List Boolb:Booln:r:hn:0 < nhr:0 < rhb:Counter.value bs = 0hc:Counter.value cs = rhe:r = 1Words (if n = 1 then (Scanner.Mode.done, 0) else (Scanner.Mode.tree, n - 1)).1 [] [] bs:List Boolcs:List Boolb:Booln:r:hn:0 < nhr:0 < rhb:Counter.value bs = 0hc:Counter.value cs = rhe:r = 1h✝:n = 1Words (Scanner.Mode.done, 0).1 [] []bs:List Boolcs:List Boolb:Booln:r:hn:0 < nhr:0 < rhb:Counter.value bs = 0hc:Counter.value cs = rhe:r = 1h✝:¬n = 1Words (Scanner.Mode.tree, n - 1).1 [] [] bs:List Boolcs:List Boolb:Booln:r:hn:0 < nhr:0 < rhb:Counter.value bs = 0hc:Counter.value cs = rhe:r = 1h✝:n = 1Words (Scanner.Mode.done, 0).1 [] []bs:List Boolcs:List Boolb:Booln:r:hn:0 < nhr:0 < rhb:Counter.value bs = 0hc:Counter.value cs = rhe:r = 1h✝:¬n = 1Words (Scanner.Mode.tree, n - 1).1 [] [] All goals completed! 🐙 bs:List Boolcs:List Boolb:Booln:r:hn:0 < nhr:0 < rhb:Counter.value bs = 0hc:Counter.value cs = rhe:¬r = 1Words (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 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 csWords (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 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 csCounter.value bs = 0 True All goals completed! 🐙 bs:List Boolcs:List Boolb:Booln:ha:Scanner.Active (Scanner.Mode.done, n)hw:Words (Scanner.Mode.done, n).1 bs csWords (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 All goals completed! 🐙 bs:List Boolcs:List Boolb:Booln:ha:Scanner.Active (Scanner.Mode.dead, n)hw:Words (Scanner.Mode.dead, n).1 bs csWords (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 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.

def initialAccount : Account := ((.tree, 1), [], [])

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 initialAccount

The two descriptions agree at every boundary.

def AccountValid (s : Account) : Prop := Scanner.Active s.1 Words s.1.1 s.2.1 s.2.2

A 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)) w

Projection 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)) w

The scalar account component is the streaming scanner state.

theorem account_project (w : List Bool) : (account w).1 = Scanner.scan w := account_foldl_project w initialAccount

The account invariant holds after every input prefix.

theorem account_valid (w : List Bool) : AccountValid (account w) := account_foldl_valid w initialAccount show 0 < 1 All goals completed! 🐙 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).1

Both 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).2

Each 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 := 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 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 + 1bs: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 + 1bs: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 + 1bs: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 + 1bs: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 + 1bs: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 + 1bs: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 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 + 1bs: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 + 1bs: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 + 1bs: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 + 1bs: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 + 1bs: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 + 1bs: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 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 + 1bs: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 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 + 1bs: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 + 1bs: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 + 1bs: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 + 1bs: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 + 1bs: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 + 1bs: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 + 1bs: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 + 1bs: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 + 1bs: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 + 1bs: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 + 1bs: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 + 1bs: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 + 1bs: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 bs:List Boolcs:List Boolbs.length bs.length + 1 cs.length cs.length + 1 bs:List Boolcs:List Bool[].length bs.length + 1 [true].length cs.length + 1bs:List Boolcs:List Boolbs.length bs.length + 1 cs.length cs.length + 1bs:List Boolcs:List Boolcount✝:bs.length bs.length + 1 cs.length cs.length + 1bs: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 + 1bs: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 + 1bs: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 + 1bs: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 + 1bs: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 + 1bs: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 + 1bs: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 + 1bs:List Boolcs:List Boolbs.length bs.length + 1 cs.length cs.length + 1bs:List Boolcs:List Boolbs.length bs.length + 1 cs.length cs.length + 1bs:List Boolcs:List Boolbs.length bs.length + 1 cs.length cs.length + 1bs:List Boolcs:List Boolbs.length bs.length + 1 cs.length cs.length + 1 first | (bs:List Boolcs:List Boolbs.length bs.length + 1bs:List Boolcs:List Boolcs.length cs.length + 1 bs:List Boolcs:List Boolbs.length bs.length + 1bs:List Boolcs:List Boolcs.length cs.length + 1 All goals completed! 🐙) | (bs:List Boolcs:List Boolremaining✝:h✝:remaining✝ = 1([], []).1.length bs.length + 1 ([], []).2.length cs.length + 1bs: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 bs:List Boolcs:List Boolremaining✝:h✝:remaining✝ = 1([], []).1.length bs.length + 1 ([], []).2.length cs.length + 1bs: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 bs:List Boolcs:List Boolremaining✝:h✝:¬remaining✝ = 1(bs, Counter.decrement cs).1.length bs.length + 1bs:List Boolcs:List Boolremaining✝:h✝:¬remaining✝ = 1(bs, Counter.decrement cs).2.length cs.length + 1 bs:List Boolcs:List Boolremaining✝:h✝:remaining✝ = 1([], []).1.length bs.length + 1bs:List Boolcs:List Boolremaining✝:h✝:remaining✝ = 1([], []).2.length cs.length + 1bs:List Boolcs:List Boolremaining✝:h✝:¬remaining✝ = 1(bs, Counter.decrement cs).1.length bs.length + 1bs:List Boolcs:List Boolremaining✝:h✝:¬remaining✝ = 1(bs, Counter.decrement cs).2.length cs.length + 1 bs:List Boolcs:List Boolremaining✝:h✝:¬remaining✝ = 1cs.length cs.length + 1 bs:List Boolcs:List Boolremaining✝:h✝:remaining✝ = 10 bs.length + 1bs:List Boolcs:List Boolremaining✝:h✝:remaining✝ = 10 cs.length + 1bs:List Boolcs:List Boolremaining✝:h✝:¬remaining✝ = 1bs.length bs.length + 1bs:List Boolcs:List Boolremaining✝:h✝:¬remaining✝ = 1cs.length cs.length + 1 All goals completed! 🐙) | (bs:List Boolcs:List Bool[].length bs.length + 1bs:List Boolcs:List Bool[true].length cs.length + 1 bs:List Boolcs:List Bool[].length bs.length + 1bs:List Boolcs:List Bool[true].length cs.length + 1 bs:List Boolcs:List Bool0 + 1 cs.length + 1 bs:List Boolcs:List Bool0 bs.length + 1bs:List Boolcs:List Bool0 + 1 cs.length + 1 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 := s:Scanner.Stateb:BoolzeroCount (Scanner.step s b).1 zeroCount s.1 + 1 b:Boolm:Scanner.Moden:zeroCount (Scanner.step (m, n) b).1 zeroCount (m, n).1 + 1 b:Booln:zeroCount (Scanner.step (Scanner.Mode.tree, n) b).1 zeroCount (Scanner.Mode.tree, n).1 + 1b:Booln:count✝:zeroCount (Scanner.step (Scanner.Mode.zeros count✝, n) b).1 zeroCount (Scanner.Mode.zeros count✝, n).1 + 1b:Booln:remaining✝:value✝:zeroCount (Scanner.step (Scanner.Mode.size remaining✝ value✝, n) b).1 zeroCount (Scanner.Mode.size remaining✝ value✝, n).1 + 1b:Booln:remaining✝:value✝:zeroCount (Scanner.step (Scanner.Mode.length remaining✝ value✝, n) b).1 zeroCount (Scanner.Mode.length remaining✝ value✝, n).1 + 1b:Booln:remaining✝:zeroCount (Scanner.step (Scanner.Mode.payload remaining✝, n) b).1 zeroCount (Scanner.Mode.payload remaining✝, n).1 + 1b:Booln:zeroCount (Scanner.step (Scanner.Mode.done, n) b).1 zeroCount (Scanner.Mode.done, n).1 + 1b:Booln:zeroCount (Scanner.step (Scanner.Mode.dead, n) b).1 zeroCount (Scanner.Mode.dead, n).1 + 1 b:Booln:zeroCount (Scanner.step (Scanner.Mode.tree, n) b).1 zeroCount (Scanner.Mode.tree, n).1 + 1b:Booln:count✝:zeroCount (Scanner.step (Scanner.Mode.zeros count✝, n) b).1 zeroCount (Scanner.Mode.zeros count✝, n).1 + 1b:Booln:remaining✝:value✝:zeroCount (Scanner.step (Scanner.Mode.size remaining✝ value✝, n) b).1 zeroCount (Scanner.Mode.size remaining✝ value✝, n).1 + 1b:Booln:remaining✝:value✝:zeroCount (Scanner.step (Scanner.Mode.length remaining✝ value✝, n) b).1 zeroCount (Scanner.Mode.length remaining✝ value✝, n).1 + 1b:Booln:remaining✝:zeroCount (Scanner.step (Scanner.Mode.payload remaining✝, n) b).1 zeroCount (Scanner.Mode.payload remaining✝, n).1 + 1b:Booln:zeroCount (Scanner.step (Scanner.Mode.done, n) b).1 zeroCount (Scanner.Mode.done, n).1 + 1b:Booln:zeroCount (Scanner.step (Scanner.Mode.dead, n) b).1 zeroCount (Scanner.Mode.dead, n).1 + 1 n:zeroCount (Scanner.step (Scanner.Mode.dead, n) false).1 zeroCount (Scanner.Mode.dead, n).1 + 1n:zeroCount (Scanner.step (Scanner.Mode.dead, n) true).1 zeroCount (Scanner.Mode.dead, n).1 + 1 n:zeroCount (Scanner.step (Scanner.Mode.tree, n) false).1 zeroCount (Scanner.Mode.tree, n).1 + 1n:zeroCount (Scanner.step (Scanner.Mode.tree, n) true).1 zeroCount (Scanner.Mode.tree, n).1 + 1n:count✝:zeroCount (Scanner.step (Scanner.Mode.zeros count✝, n) false).1 zeroCount (Scanner.Mode.zeros count✝, n).1 + 1n:count✝:zeroCount (Scanner.step (Scanner.Mode.zeros count✝, n) true).1 zeroCount (Scanner.Mode.zeros count✝, n).1 + 1n:remaining✝:value✝:zeroCount (Scanner.step (Scanner.Mode.size remaining✝ value✝, n) false).1 zeroCount (Scanner.Mode.size remaining✝ value✝, n).1 + 1n:remaining✝:value✝:zeroCount (Scanner.step (Scanner.Mode.size remaining✝ value✝, n) true).1 zeroCount (Scanner.Mode.size remaining✝ value✝, n).1 + 1n:remaining✝:value✝:zeroCount (Scanner.step (Scanner.Mode.length remaining✝ value✝, n) false).1 zeroCount (Scanner.Mode.length remaining✝ value✝, n).1 + 1n:remaining✝:value✝:zeroCount (Scanner.step (Scanner.Mode.length remaining✝ value✝, n) true).1 zeroCount (Scanner.Mode.length remaining✝ value✝, n).1 + 1n:remaining✝:zeroCount (Scanner.step (Scanner.Mode.payload remaining✝, n) false).1 zeroCount (Scanner.Mode.payload remaining✝, n).1 + 1n:remaining✝:zeroCount (Scanner.step (Scanner.Mode.payload remaining✝, n) true).1 zeroCount (Scanner.Mode.payload remaining✝, n).1 + 1n:zeroCount (Scanner.step (Scanner.Mode.done, n) false).1 zeroCount (Scanner.Mode.done, n).1 + 1n:zeroCount (Scanner.step (Scanner.Mode.done, n) true).1 zeroCount (Scanner.Mode.done, n).1 + 1n:zeroCount (Scanner.step (Scanner.Mode.dead, n) false).1 zeroCount (Scanner.Mode.dead, n).1 + 1n:zeroCount (Scanner.step (Scanner.Mode.dead, n) true).1 zeroCount (Scanner.Mode.dead, n).1 + 1 n:zeroCount Scanner.Mode.dead zeroCount Scanner.Mode.dead + 1 n:zeroCount (Scanner.Mode.zeros 0) zeroCount Scanner.Mode.tree + 1n:zeroCount Scanner.Mode.tree zeroCount Scanner.Mode.tree + 1n:count✝:zeroCount (Scanner.Mode.zeros (count✝ + 1)) zeroCount (Scanner.Mode.zeros count✝) + 1n:count✝:zeroCount (if count✝ = 0 then Scanner.finish n else (Scanner.Mode.size count✝ 1, n)).1 zeroCount (Scanner.Mode.zeros count✝) + 1n: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✝) + 1n: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✝) + 1n: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✝) + 1n: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✝) + 1n:remaining✝:zeroCount (if remaining✝ = 1 then Scanner.finish n else (Scanner.Mode.payload (remaining✝ - 1), n)).1 zeroCount (Scanner.Mode.payload remaining✝) + 1n:remaining✝:zeroCount (if remaining✝ = 1 then Scanner.finish n else (Scanner.Mode.payload (remaining✝ - 1), n)).1 zeroCount (Scanner.Mode.payload remaining✝) + 1n:zeroCount Scanner.Mode.dead zeroCount Scanner.Mode.done + 1n:zeroCount Scanner.Mode.dead zeroCount Scanner.Mode.done + 1n:zeroCount Scanner.Mode.dead zeroCount Scanner.Mode.dead + 1n:zeroCount Scanner.Mode.dead zeroCount Scanner.Mode.dead + 1 first | (n:0 0 + 1; All goals completed! 🐙) | (n:remaining✝:h✝:remaining✝ = 1zeroCount (Scanner.finish n).1 zeroCount (Scanner.Mode.payload remaining✝) + 1n:remaining✝:h✝:¬remaining✝ = 1zeroCount (Scanner.Mode.payload (remaining✝ - 1), n).1 zeroCount (Scanner.Mode.payload remaining✝) + 1 n:remaining✝:h✝:remaining✝ = 1zeroCount (Scanner.finish n).1 zeroCount (Scanner.Mode.payload remaining✝) + 1n:remaining✝:h✝:¬remaining✝ = 1zeroCount (Scanner.Mode.payload (remaining✝ - 1), n).1 zeroCount (Scanner.Mode.payload remaining✝) + 1 first | (n:remaining✝:h✝:¬remaining✝ = 10 0 + 1; All goals completed! 🐙) | (n:remaining✝:h✝:remaining✝ = 1zeroCount (if n = 1 then (Scanner.Mode.done, 0) else (Scanner.Mode.tree, n - 1)).1 zeroCount (Scanner.Mode.payload remaining✝) + 1; n:remaining✝:h✝¹:remaining✝ = 1h✝:n = 1zeroCount (Scanner.Mode.done, 0).1 zeroCount (Scanner.Mode.payload remaining✝) + 1n:remaining✝:h✝¹:remaining✝ = 1h✝:¬n = 1zeroCount (Scanner.Mode.tree, n - 1).1 zeroCount (Scanner.Mode.payload remaining✝) + 1 n:remaining✝:h✝¹:remaining✝ = 1h✝:n = 1zeroCount (Scanner.Mode.done, 0).1 zeroCount (Scanner.Mode.payload remaining✝) + 1n:remaining✝:h✝¹:remaining✝ = 1h✝:¬n = 1zeroCount (Scanner.Mode.tree, n - 1).1 zeroCount (Scanner.Mode.payload remaining✝) + 1 n:remaining✝:h✝¹:remaining✝ = 1h✝:¬n = 10 0 + 1 n:remaining✝:h✝¹:remaining✝ = 1h✝:n = 10 0 + 1n:remaining✝:h✝¹:remaining✝ = 1h✝:¬n = 10 0 + 1 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 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 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 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 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 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) 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) 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 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) All goals completed! 🐙, 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) All goals completed! 🐙, 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.lengthzeroCount (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) All goals completed! 🐙) w

Each 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 := w:List Bool(account w).2.1.length w.length (account w).2.2.length w.length 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 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 := w:List BoolzeroCount (account w).1.1 w.length 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 := w:List Bool(account w).1.2 w.length + 1 w:List Bool(Scanner.scan w).2 w.length + 1 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 := w:List Boolb:Boolaccount (w ++ [b]) = accountStep (account w) b All goals completed! 🐙

Machine time for one complete input transition.

def macroCost (s : Account) (b : Bool) : := bitCost s.1.1 s.2.1 s.2.2 b

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)) w

Total transition time before the final end-marker decision.

def runCost (w : List Bool) : := (w.foldl costStep (initialAccount, 0)).2

Appending 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 := w:List Boolb:BoolrunCost (w ++ [b]) = runCost w + macroCost (account w) b 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 := m:Scanner.Modebs:List Boolcs:List Boolb:Boolwidth:hb:bs.length widthhc:cs.length widthbitCost m bs cs b 5 * width + 16 bs:List Boolcs:List Boolb:Boolwidth:hb:bs.length widthhc:cs.length widthbitCost Scanner.Mode.tree bs cs b 5 * width + 16bs:List Boolcs:List Boolb:Boolwidth:hb:bs.length widthhc:cs.length widthcount✝:bitCost (Scanner.Mode.zeros count✝) bs cs b 5 * width + 16bs:List Boolcs:List Boolb:Boolwidth:hb:bs.length widthhc:cs.length widthremaining✝:value✝:bitCost (Scanner.Mode.size remaining✝ value✝) bs cs b 5 * width + 16bs:List Boolcs:List Boolb:Boolwidth:hb:bs.length widthhc:cs.length widthremaining✝:value✝:bitCost (Scanner.Mode.length remaining✝ value✝) bs cs b 5 * width + 16bs:List Boolcs:List Boolb:Boolwidth:hb:bs.length widthhc:cs.length widthremaining✝:bitCost (Scanner.Mode.payload remaining✝) bs cs b 5 * width + 16bs:List Boolcs:List Boolb:Boolwidth:hb:bs.length widthhc:cs.length widthbitCost Scanner.Mode.done bs cs b 5 * width + 16bs:List Boolcs:List Boolb:Boolwidth:hb:bs.length widthhc:cs.length widthbitCost Scanner.Mode.dead bs cs b 5 * width + 16 bs:List Boolcs:List Boolb:Boolwidth:hb:bs.length widthhc:cs.length widthbitCost Scanner.Mode.tree bs cs b 5 * width + 16bs:List Boolcs:List Boolb:Boolwidth:hb:bs.length widthhc:cs.length widthcount✝:bitCost (Scanner.Mode.zeros count✝) bs cs b 5 * width + 16bs:List Boolcs:List Boolb:Boolwidth:hb:bs.length widthhc:cs.length widthremaining✝:value✝:bitCost (Scanner.Mode.size remaining✝ value✝) bs cs b 5 * width + 16bs:List Boolcs:List Boolb:Boolwidth:hb:bs.length widthhc:cs.length widthremaining✝:value✝:bitCost (Scanner.Mode.length remaining✝ value✝) bs cs b 5 * width + 16bs:List Boolcs:List Boolb:Boolwidth:hb:bs.length widthhc:cs.length widthremaining✝:bitCost (Scanner.Mode.payload remaining✝) bs cs b 5 * width + 16bs:List Boolcs:List Boolb:Boolwidth:hb:bs.length widthhc:cs.length widthbitCost Scanner.Mode.done bs cs b 5 * width + 16bs:List Boolcs:List Boolb:Boolwidth:hb:bs.length widthhc:cs.length widthbitCost Scanner.Mode.dead bs cs b 5 * width + 16 bs:List Boolcs:List Boolwidth:hb:bs.length widthhc:cs.length widthbitCost Scanner.Mode.dead bs cs false 5 * width + 16bs:List Boolcs:List Boolwidth:hb:bs.length widthhc:cs.length widthbitCost Scanner.Mode.dead bs cs true 5 * width + 16 bs:List Boolcs:List Boolwidth:hb:bs.length widthhc:cs.length widthbitCost Scanner.Mode.tree bs cs false 5 * width + 16bs:List Boolcs:List Boolwidth:hb:bs.length widthhc:cs.length widthbitCost Scanner.Mode.tree bs cs true 5 * width + 16bs:List Boolcs:List Boolwidth:hb:bs.length widthhc:cs.length widthcount✝:bitCost (Scanner.Mode.zeros count✝) bs cs false 5 * width + 16bs:List Boolcs:List Boolwidth:hb:bs.length widthhc:cs.length widthcount✝:bitCost (Scanner.Mode.zeros count✝) bs cs true 5 * width + 16bs:List Boolcs:List Boolwidth:hb:bs.length widthhc:cs.length widthremaining✝:value✝:bitCost (Scanner.Mode.size remaining✝ value✝) bs cs false 5 * width + 16bs:List Boolcs:List Boolwidth:hb:bs.length widthhc:cs.length widthremaining✝:value✝:bitCost (Scanner.Mode.size remaining✝ value✝) bs cs true 5 * width + 16bs:List Boolcs:List Boolwidth:hb:bs.length widthhc:cs.length widthremaining✝:value✝:bitCost (Scanner.Mode.length remaining✝ value✝) bs cs false 5 * width + 16bs:List Boolcs:List Boolwidth:hb:bs.length widthhc:cs.length widthremaining✝:value✝:bitCost (Scanner.Mode.length remaining✝ value✝) bs cs true 5 * width + 16bs:List Boolcs:List Boolwidth:hb:bs.length widthhc:cs.length widthremaining✝:bitCost (Scanner.Mode.payload remaining✝) bs cs false 5 * width + 16bs:List Boolcs:List Boolwidth:hb:bs.length widthhc:cs.length widthremaining✝:bitCost (Scanner.Mode.payload remaining✝) bs cs true 5 * width + 16bs:List Boolcs:List Boolwidth:hb:bs.length widthhc:cs.length widthbitCost Scanner.Mode.done bs cs false 5 * width + 16bs:List Boolcs:List Boolwidth:hb:bs.length widthhc:cs.length widthbitCost Scanner.Mode.done bs cs true 5 * width + 16bs:List Boolcs:List Boolwidth:hb:bs.length widthhc:cs.length widthbitCost Scanner.Mode.dead bs cs false 5 * width + 16bs:List Boolcs:List Boolwidth:hb:bs.length widthhc:cs.length widthbitCost Scanner.Mode.dead bs cs true 5 * width + 16 bs:List Boolcs:List Boolwidth:hb:bs.length widthhc:cs.length width1 5 * width + 16 bs:List Boolcs:List Boolwidth:hb:bs.length widthhc:cs.length width1 5 * width + 16bs:List Boolcs:List Boolwidth:hb:bs.length widthhc:cs.length width1 5 * width + 16bs:List Boolcs:List Boolwidth:hb:bs.length widthhc:cs.length widthcount✝:1 5 * width + 16bs:List Boolcs:List Boolwidth:hb:bs.length widthhc:cs.length widthcount✝:(if count✝ = 0 then 16 else 2) 5 * width + 16bs:List Boolcs:List Boolwidth:hb:bs.length widthhc:cs.length widthremaining✝:value✝:(if remaining✝ = 1 then 2 * bs.length + 7 else 2) 5 * width + 16bs:List Boolcs:List Boolwidth:hb:bs.length widthhc:cs.length widthremaining✝:value✝:(if remaining✝ = 1 then 2 * bs.length + 7 else 2) 5 * width + 16bs: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 + 16bs: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 + 16bs: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 + 16bs: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 + 16bs:List Boolcs:List Boolwidth:hb:bs.length widthhc:cs.length width1 5 * width + 16bs:List Boolcs:List Boolwidth:hb:bs.length widthhc:cs.length width1 5 * width + 16bs:List Boolcs:List Boolwidth:hb:bs.length widthhc:cs.length width1 5 * width + 16bs:List Boolcs:List Boolwidth:hb:bs.length widthhc:cs.length width1 5 * width + 16 first | All goals completed! 🐙 | (bs:List Boolcs:List Boolwidth:hb:bs.length widthhc:cs.length widthremaining✝:h✝:remaining✝ = 12 * cs.length + max bs.length cs.length + 7 5 * width + 16bs:List Boolcs:List Boolwidth:hb:bs.length widthhc:cs.length widthremaining✝:h✝:¬remaining✝ = 12 * cs.length + 4 5 * width + 16 bs:List Boolcs:List Boolwidth:hb:bs.length widthhc:cs.length widthremaining✝:h✝:remaining✝ = 12 * cs.length + max bs.length cs.length + 7 5 * width + 16bs:List Boolcs:List Boolwidth:hb:bs.length widthhc:cs.length widthremaining✝:h✝:¬remaining✝ = 12 * cs.length + 4 5 * width + 16 All goals completed! 🐙)

Every transition cost is positive.

theorem macroCost_pos (s : Account) (b : Bool) : 0 < macroCost s b := s:Accountb:Bool0 < macroCost s b b:Boolm:Scanner.Moden:bs:List Boolcs:List Bool0 < macroCost ((m, n), bs, cs) b b:Booln:bs:List Boolcs:List Bool0 < macroCost ((Scanner.Mode.tree, n), bs, cs) bb:Booln:bs:List Boolcs:List Boolcount✝:0 < macroCost ((Scanner.Mode.zeros count✝, n), bs, cs) bb:Booln:bs:List Boolcs:List Boolremaining✝:value✝:0 < macroCost ((Scanner.Mode.size remaining✝ value✝, n), bs, cs) bb:Booln:bs:List Boolcs:List Boolremaining✝:value✝:0 < macroCost ((Scanner.Mode.length remaining✝ value✝, n), bs, cs) bb:Booln:bs:List Boolcs:List Boolremaining✝:0 < macroCost ((Scanner.Mode.payload remaining✝, n), bs, cs) bb:Booln:bs:List Boolcs:List Bool0 < macroCost ((Scanner.Mode.done, n), bs, cs) bb:Booln:bs:List Boolcs:List Bool0 < macroCost ((Scanner.Mode.dead, n), bs, cs) b b:Booln:bs:List Boolcs:List Bool0 < macroCost ((Scanner.Mode.tree, n), bs, cs) bb:Booln:bs:List Boolcs:List Boolcount✝:0 < macroCost ((Scanner.Mode.zeros count✝, n), bs, cs) bb:Booln:bs:List Boolcs:List Boolremaining✝:value✝:0 < macroCost ((Scanner.Mode.size remaining✝ value✝, n), bs, cs) bb:Booln:bs:List Boolcs:List Boolremaining✝:value✝:0 < macroCost ((Scanner.Mode.length remaining✝ value✝, n), bs, cs) bb:Booln:bs:List Boolcs:List Boolremaining✝:0 < macroCost ((Scanner.Mode.payload remaining✝, n), bs, cs) bb:Booln:bs:List Boolcs:List Bool0 < macroCost ((Scanner.Mode.done, n), bs, cs) bb:Booln:bs:List Boolcs:List Bool0 < macroCost ((Scanner.Mode.dead, n), bs, cs) b n:bs:List Boolcs:List Bool0 < macroCost ((Scanner.Mode.dead, n), bs, cs) falsen:bs:List Boolcs:List Bool0 < macroCost ((Scanner.Mode.dead, n), bs, cs) true n:bs:List Boolcs:List Bool0 < macroCost ((Scanner.Mode.tree, n), bs, cs) falsen:bs:List Boolcs:List Bool0 < macroCost ((Scanner.Mode.tree, n), bs, cs) truen:bs:List Boolcs:List Boolcount✝:0 < macroCost ((Scanner.Mode.zeros count✝, n), bs, cs) falsen:bs:List Boolcs:List Boolcount✝:0 < macroCost ((Scanner.Mode.zeros count✝, n), bs, cs) truen:bs:List Boolcs:List Boolremaining✝:value✝:0 < macroCost ((Scanner.Mode.size remaining✝ value✝, n), bs, cs) falsen:bs:List Boolcs:List Boolremaining✝:value✝:0 < macroCost ((Scanner.Mode.size remaining✝ value✝, n), bs, cs) truen:bs:List Boolcs:List Boolremaining✝:value✝:0 < macroCost ((Scanner.Mode.length remaining✝ value✝, n), bs, cs) falsen:bs:List Boolcs:List Boolremaining✝:value✝:0 < macroCost ((Scanner.Mode.length remaining✝ value✝, n), bs, cs) truen:bs:List Boolcs:List Boolremaining✝:0 < macroCost ((Scanner.Mode.payload remaining✝, n), bs, cs) falsen:bs:List Boolcs:List Boolremaining✝:0 < macroCost ((Scanner.Mode.payload remaining✝, n), bs, cs) truen:bs:List Boolcs:List Bool0 < macroCost ((Scanner.Mode.done, n), bs, cs) falsen:bs:List Boolcs:List Bool0 < macroCost ((Scanner.Mode.done, n), bs, cs) truen:bs:List Boolcs:List Bool0 < macroCost ((Scanner.Mode.dead, n), bs, cs) falsen:bs:List Boolcs:List Bool0 < macroCost ((Scanner.Mode.dead, n), bs, cs) true n:bs:List Boolcs:List Bool0 < 1 n:bs:List Boolcs:List Bool0 < 1n:bs:List Boolcs:List Bool0 < 1n:bs:List Boolcs:List Boolcount✝:0 < 1n:bs:List Boolcs:List Boolcount✝:0 < if count✝ = 0 then 16 else 2n:bs:List Boolcs:List Boolremaining✝:value✝:0 < if remaining✝ = 1 then 2 * bs.length + 7 else 2n:bs:List Boolcs:List Boolremaining✝:value✝:0 < if remaining✝ = 1 then 2 * bs.length + 7 else 2n:bs:List Boolcs:List Boolremaining✝:value✝:0 < if remaining✝ = 1 then 2 * bs.length + 2 * cs.length + 9 else 2 * bs.length + 4n:bs:List Boolcs:List Boolremaining✝:value✝:0 < if remaining✝ = 1 then 2 * bs.length + 2 * cs.length + 9 else 2 * bs.length + 4n:bs:List Boolcs:List Boolremaining✝:0 < if remaining✝ = 1 then 2 * cs.length + max bs.length cs.length + 7 else 2 * cs.length + 4n:bs:List Boolcs:List Boolremaining✝:0 < if remaining✝ = 1 then 2 * cs.length + max bs.length cs.length + 7 else 2 * cs.length + 4n:bs:List Boolcs:List Bool0 < 1n:bs:List Boolcs:List Bool0 < 1n:bs:List Boolcs:List Bool0 < 1n:bs:List Boolcs:List Bool0 < 1 first | All goals completed! 🐙 | (n:bs:List Boolcs:List Boolremaining✝:h✝:remaining✝ = 10 < 2 * cs.length + max bs.length cs.length + 7n:bs:List Boolcs:List Boolremaining✝:h✝:¬remaining✝ = 10 < 2 * cs.length + 4 n:bs:List Boolcs:List Boolremaining✝:h✝:remaining✝ = 10 < 2 * cs.length + max bs.length cs.length + 7n:bs:List Boolcs:List Boolremaining✝:h✝:¬remaining✝ = 10 < 2 * cs.length + 4 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 := w:List BoolrunCost w 5 * w.length ^ 2 + 16 * w.length w:List BoolrunCost [] 5 * [].length ^ 2 + 16 * [].lengthw: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 w:List BoolrunCost [] 5 * [].length ^ 2 + 16 * [].length All goals completed! 🐙 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 w:List Boolbs:List Boolb:Boolih:runCost bs 5 * bs.length ^ 2 + 16 * bs.lengthrunCost (bs ++ [b]) 5 * (bs ++ [b]).length ^ 2 + 16 * (bs ++ [b]).length 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.lengthrunCost (bs ++ [b]) 5 * (bs ++ [b]).length ^ 2 + 16 * (bs ++ [b]).length 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 + 16runCost (bs ++ [b]) 5 * (bs ++ [b]).length ^ 2 + 16 * (bs ++ [b]).length 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 + 16runCost (bs ++ [b]) 5 * (bs ++ [b]).length ^ 2 + 16 * (bs ++ [b]).length 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 + 16runCost bs + macroCost (account bs) b 5 * (bs ++ [b]).length ^ 2 + 16 * (bs ++ [b]).length 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 + 16runCost bs + macroCost (account bs) b 5 * (bs.length * bs.length) + 5 * bs.length + (5 * bs.length + 5) + (16 * bs.length + 16) 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 + 16runCost bs + macroCost (account bs) b 5 * (bs.length * bs.length) + 5 * bs.length + (5 * bs.length + 5) + (16 * bs.length + 16) 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] := w:List Boolt:h:t < w.lengthaccount (List.take (t + 1) w) = 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] := w:List Boolt:h:t < w.lengthrunCost (List.take (t + 1) w) = 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 := w:List Boolt:(account (List.take t w)).2.1.length w.length (account (List.take t w)).2.2.length w.length 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 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 All goals completed! 🐙
end Geb.BitTree.Elias.Machine