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.Scanner public import Geb.Prototypes.Computability.BitTree.Elias.Code
set_option doc.verso true

Streaming recognition of Elias delta headers

The scanner reads a unary size prefix and two fixed-width binary fields. Complete fields change phases on their last bit; incomplete fields retain a header phase and cannot accept.

Main statements

  • foldl_header relates successful integer parsing to the streaming header phases.

  • header_reject excludes acceptance when the integer header is incomplete.

Tags

Elias delta code, streaming recognizer, simulation

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

Scanning a unary zero prefix increases the prefix count by its length.

theorem foldl_replicate_false (k z n : ) : (List.replicate k false).foldl step (.zeros z, n) = (.zeros (z + k), n) := k:z:n:List.foldl step (Mode.zeros z, n) (List.replicate k false) = (Mode.zeros (z + k), n) k:n: (z : ), List.foldl step (Mode.zeros z, n) (List.replicate k false) = (Mode.zeros (z + k), n) k:n: (z : ), List.foldl step (Mode.zeros z, n) (List.replicate Nat.zero false) = (Mode.zeros (z + Nat.zero), n)k:n: (n_1 : ), (∀ (z : ), List.foldl step (Mode.zeros z, n) (List.replicate n_1 false) = (Mode.zeros (z + n_1), n)) (z : ), List.foldl step (Mode.zeros z, n) (List.replicate n_1.succ false) = (Mode.zeros (z + n_1.succ), n) k:n: (z : ), List.foldl step (Mode.zeros z, n) (List.replicate Nat.zero false) = (Mode.zeros (z + Nat.zero), n) k:n:z:List.foldl step (Mode.zeros z, n) (List.replicate Nat.zero false) = (Mode.zeros (z + Nat.zero), n) All goals completed! 🐙 k:n: (n_1 : ), (∀ (z : ), List.foldl step (Mode.zeros z, n) (List.replicate n_1 false) = (Mode.zeros (z + n_1), n)) (z : ), List.foldl step (Mode.zeros z, n) (List.replicate n_1.succ false) = (Mode.zeros (z + n_1.succ), n) k✝:n:k:ih: (z : ), List.foldl step (Mode.zeros z, n) (List.replicate k false) = (Mode.zeros (z + k), n)z:List.foldl step (Mode.zeros z, n) (List.replicate k.succ false) = (Mode.zeros (z + k.succ), n) k✝:n:k:ih: (z : ), List.foldl step (Mode.zeros z, n) (List.replicate k false) = (Mode.zeros (z + k), n)z:List.foldl step (step (Mode.zeros z, n) false) (List.replicate k false) = (Mode.zeros (z + k.succ), n) k✝:n:k:ih: (z : ), List.foldl step (Mode.zeros z, n) (List.replicate k false) = (Mode.zeros (z + k), n)z:List.foldl step (Mode.zeros (z + 1), n) (List.replicate k false) = (Mode.zeros (z + k.succ), n) k✝:n:k:ih: (z : ), List.foldl step (Mode.zeros z, n) (List.replicate k false) = (Mode.zeros (z + k), n)z:(Mode.zeros (z + 1 + k), n) = (Mode.zeros (z + k.succ), n) k✝:n:k:ih: (z : ), List.foldl step (Mode.zeros z, n) (List.replicate k false) = (Mode.zeros (z + k), n)z:z + 1 + k = z + k.succ All goals completed! 🐙

A nonempty fixed-width field ends at its final bit, in either binary header phase.

theorem foldl_field (isSize : Bool) (bs : List Bool) : v n, bs [] bs.foldl step ((if isSize then .size bs.length v else .length bs.length v), n) = ((if isSize then .length (bs.foldl (fun a b Nat.bit b a) v - 1) 1 else .payload (bs.foldl (fun a b Nat.bit b a) v - 1)), n) := List.rec (fun _ _ h (h rfl).elim) (fun b bs ih v n _ isSize:Boolbs✝:List Boolb:Boolbs:List Boolih: (v n : ), bs [] List.foldl step (if isSize = true then Mode.size bs.length v else Mode.length bs.length v, n) bs = (if isSize = true then Mode.length (List.foldl (fun a b Nat.bit b a) v bs - 1) 1 else Mode.payload (List.foldl (fun a b Nat.bit b a) v bs - 1), n)v:n:x✝:b :: bs []List.foldl step (if isSize = true then Mode.size (b :: bs).length v else Mode.length (b :: bs).length v, n) (b :: bs) = (if isSize = true then Mode.length (List.foldl (fun a b Nat.bit b a) v (b :: bs) - 1) 1 else Mode.payload (List.foldl (fun a b Nat.bit b a) v (b :: bs) - 1), n) cases bs with isSize:Boolbs:List Boolb:Boolv:n:ih: (v n : ), [] [] List.foldl step (if isSize = true then Mode.size [].length v else Mode.length [].length v, n) [] = (if isSize = true then Mode.length (List.foldl (fun a b Nat.bit b a) v [] - 1) 1 else Mode.payload (List.foldl (fun a b Nat.bit b a) v [] - 1), n)x✝:[b] []List.foldl step (if isSize = true then Mode.size [b].length v else Mode.length [b].length v, n) [b] = (if isSize = true then Mode.length (List.foldl (fun a b Nat.bit b a) v [b] - 1) 1 else Mode.payload (List.foldl (fun a b Nat.bit b a) v [b] - 1), n) bs:List Boolb:Boolv:n:x✝:[b] []ih: (v n : ), [] [] List.foldl step (if false = true then Mode.size [].length v else Mode.length [].length v, n) [] = (if false = true then Mode.length (List.foldl (fun a b Nat.bit b a) v [] - 1) 1 else Mode.payload (List.foldl (fun a b Nat.bit b a) v [] - 1), n)List.foldl step (if false = true then Mode.size [b].length v else Mode.length [b].length v, n) [b] = (if false = true then Mode.length (List.foldl (fun a b Nat.bit b a) v [b] - 1) 1 else Mode.payload (List.foldl (fun a b Nat.bit b a) v [b] - 1), n)bs:List Boolb:Boolv:n:x✝:[b] []ih: (v n : ), [] [] List.foldl step (if true = true then Mode.size [].length v else Mode.length [].length v, n) [] = (if true = true then Mode.length (List.foldl (fun a b Nat.bit b a) v [] - 1) 1 else Mode.payload (List.foldl (fun a b Nat.bit b a) v [] - 1), n)List.foldl step (if true = true then Mode.size [b].length v else Mode.length [b].length v, n) [b] = (if true = true then Mode.length (List.foldl (fun a b Nat.bit b a) v [b] - 1) 1 else Mode.payload (List.foldl (fun a b Nat.bit b a) v [b] - 1), n) bs:List Boolb:Boolv:n:x✝:[b] []ih: (v n : ), [] [] List.foldl step (if false = true then Mode.size [].length v else Mode.length [].length v, n) [] = (if false = true then Mode.length (List.foldl (fun a b Nat.bit b a) v [] - 1) 1 else Mode.payload (List.foldl (fun a b Nat.bit b a) v [] - 1), n)List.foldl step (if false = true then Mode.size [b].length v else Mode.length [b].length v, n) [b] = (if false = true then Mode.length (List.foldl (fun a b Nat.bit b a) v [b] - 1) 1 else Mode.payload (List.foldl (fun a b Nat.bit b a) v [b] - 1), n)bs:List Boolb:Boolv:n:x✝:[b] []ih: (v n : ), [] [] List.foldl step (if true = true then Mode.size [].length v else Mode.length [].length v, n) [] = (if true = true then Mode.length (List.foldl (fun a b Nat.bit b a) v [] - 1) 1 else Mode.payload (List.foldl (fun a b Nat.bit b a) v [] - 1), n)List.foldl step (if true = true then Mode.size [b].length v else Mode.length [b].length v, n) [b] = (if true = true then Mode.length (List.foldl (fun a b Nat.bit b a) v [b] - 1) 1 else Mode.payload (List.foldl (fun a b Nat.bit b a) v [b] - 1), n) All goals completed! 🐙 isSize:Boolbs✝:List Boolb:Boolv:n:c:Boolbs:List Boolih: (v n : ), c :: bs [] List.foldl step (if isSize = true then Mode.size (c :: bs).length v else Mode.length (c :: bs).length v, n) (c :: bs) = (if isSize = true then Mode.length (List.foldl (fun a b Nat.bit b a) v (c :: bs) - 1) 1 else Mode.payload (List.foldl (fun a b Nat.bit b a) v (c :: bs) - 1), n)x✝:b :: c :: bs []List.foldl step (if isSize = true then Mode.size (b :: c :: bs).length v else Mode.length (b :: c :: bs).length v, n) (b :: c :: bs) = (if isSize = true then Mode.length (List.foldl (fun a b Nat.bit b a) v (b :: c :: bs) - 1) 1 else Mode.payload (List.foldl (fun a b Nat.bit b a) v (b :: c :: bs) - 1), n) isSize:Boolbs✝:List Boolb:Boolv:n:c:Boolbs:List Boolih: (v n : ), c :: bs [] List.foldl step (if isSize = true then Mode.size (c :: bs).length v else Mode.length (c :: bs).length v, n) (c :: bs) = (if isSize = true then Mode.length (List.foldl (fun a b Nat.bit b a) v (c :: bs) - 1) 1 else Mode.payload (List.foldl (fun a b Nat.bit b a) v (c :: bs) - 1), n)x✝:b :: c :: bs []he:bs.length + 1 + 1 1List.foldl step (if isSize = true then Mode.size (b :: c :: bs).length v else Mode.length (b :: c :: bs).length v, n) (b :: c :: bs) = (if isSize = true then Mode.length (List.foldl (fun a b Nat.bit b a) v (b :: c :: bs) - 1) 1 else Mode.payload (List.foldl (fun a b Nat.bit b a) v (b :: c :: bs) - 1), n) bs✝:List Boolb:Boolv:n:c:Boolbs:List Boolx✝:b :: c :: bs []he:bs.length + 1 + 1 1ih: (v n : ), c :: bs [] List.foldl step (if false = true then Mode.size (c :: bs).length v else Mode.length (c :: bs).length v, n) (c :: bs) = (if false = true then Mode.length (List.foldl (fun a b Nat.bit b a) v (c :: bs) - 1) 1 else Mode.payload (List.foldl (fun a b Nat.bit b a) v (c :: bs) - 1), n)List.foldl step (if false = true then Mode.size (b :: c :: bs).length v else Mode.length (b :: c :: bs).length v, n) (b :: c :: bs) = (if false = true then Mode.length (List.foldl (fun a b Nat.bit b a) v (b :: c :: bs) - 1) 1 else Mode.payload (List.foldl (fun a b Nat.bit b a) v (b :: c :: bs) - 1), n)bs✝:List Boolb:Boolv:n:c:Boolbs:List Boolx✝:b :: c :: bs []he:bs.length + 1 + 1 1ih: (v n : ), c :: bs [] List.foldl step (if true = true then Mode.size (c :: bs).length v else Mode.length (c :: bs).length v, n) (c :: bs) = (if true = true then Mode.length (List.foldl (fun a b Nat.bit b a) v (c :: bs) - 1) 1 else Mode.payload (List.foldl (fun a b Nat.bit b a) v (c :: bs) - 1), n)List.foldl step (if true = true then Mode.size (b :: c :: bs).length v else Mode.length (b :: c :: bs).length v, n) (b :: c :: bs) = (if true = true then Mode.length (List.foldl (fun a b Nat.bit b a) v (b :: c :: bs) - 1) 1 else Mode.payload (List.foldl (fun a b Nat.bit b a) v (b :: c :: bs) - 1), n) bs✝:List Boolb:Boolv:n:c:Boolbs:List Boolx✝:b :: c :: bs []he:bs.length + 1 + 1 1ih: (v n : ), c :: bs [] List.foldl step (if false = true then Mode.size (c :: bs).length v else Mode.length (c :: bs).length v, n) (c :: bs) = (if false = true then Mode.length (List.foldl (fun a b Nat.bit b a) v (c :: bs) - 1) 1 else Mode.payload (List.foldl (fun a b Nat.bit b a) v (c :: bs) - 1), n)List.foldl step (if false = true then Mode.size (b :: c :: bs).length v else Mode.length (b :: c :: bs).length v, n) (b :: c :: bs) = (if false = true then Mode.length (List.foldl (fun a b Nat.bit b a) v (b :: c :: bs) - 1) 1 else Mode.payload (List.foldl (fun a b Nat.bit b a) v (b :: c :: bs) - 1), n)bs✝:List Boolb:Boolv:n:c:Boolbs:List Boolx✝:b :: c :: bs []he:bs.length + 1 + 1 1ih: (v n : ), c :: bs [] List.foldl step (if true = true then Mode.size (c :: bs).length v else Mode.length (c :: bs).length v, n) (c :: bs) = (if true = true then Mode.length (List.foldl (fun a b Nat.bit b a) v (c :: bs) - 1) 1 else Mode.payload (List.foldl (fun a b Nat.bit b a) v (c :: bs) - 1), n)List.foldl step (if true = true then Mode.size (b :: c :: bs).length v else Mode.length (b :: c :: bs).length v, n) (b :: c :: bs) = (if true = true then Mode.length (List.foldl (fun a b Nat.bit b a) v (b :: c :: bs) - 1) 1 else Mode.payload (List.foldl (fun a b Nat.bit b a) v (b :: c :: bs) - 1), n) simpa only [List.foldl_cons, List.length_cons, step, he, Bool.false_eq_true, reduceIte, Nat.add_sub_cancel] using ih (Nat.bit b v) n (bs✝:List Boolb:Boolv:n:c:Boolbs:List Boolx✝:b :: c :: bs []he:bs.length + 1 + 1 1ih: (v n : ), c :: bs [] List.foldl step (if true = true then Mode.size (c :: bs).length v else Mode.length (c :: bs).length v, n) (c :: bs) = (if true = true then Mode.length (List.foldl (fun a b Nat.bit b a) v (c :: bs) - 1) 1 else Mode.payload (List.foldl (fun a b Nat.bit b a) v (c :: bs) - 1), n)c :: bs [] All goals completed! 🐙)) bs

A field shorter than its remaining width stays in the same header phase.

theorem foldl_short_field (isSize : Bool) (bs : List Bool) : r v n, bs.length < r bs.foldl step ((if isSize then .size r v else .length r v), n) = ((if isSize then .size (r - bs.length) (bs.foldl (fun a b Nat.bit b a) v) else .length (r - bs.length) (bs.foldl (fun a b Nat.bit b a) v)), n) := List.rec (fun _ _ _ _ rfl) (fun b bs ih r v n h isSize:Boolbs✝:List Boolb:Boolbs:List Boolih: (r v n : ), bs.length < r List.foldl step (if isSize = true then Mode.size r v else Mode.length r v, n) bs = (if isSize = true then Mode.size (r - bs.length) (List.foldl (fun a b Nat.bit b a) v bs) else Mode.length (r - bs.length) (List.foldl (fun a b Nat.bit b a) v bs), n)r:v:n:h:(b :: bs).length < rList.foldl step (if isSize = true then Mode.size r v else Mode.length r v, n) (b :: bs) = (if isSize = true then Mode.size (r - (b :: bs).length) (List.foldl (fun a b Nat.bit b a) v (b :: bs)) else Mode.length (r - (b :: bs).length) (List.foldl (fun a b Nat.bit b a) v (b :: bs)), n) isSize:Boolbs✝:List Boolb:Boolbs:List Boolih: (r v n : ), bs.length < r List.foldl step (if isSize = true then Mode.size r v else Mode.length r v, n) bs = (if isSize = true then Mode.size (r - bs.length) (List.foldl (fun a b Nat.bit b a) v bs) else Mode.length (r - bs.length) (List.foldl (fun a b Nat.bit b a) v bs), n)r:v:n:h:(b :: bs).length < rhr:r 1List.foldl step (if isSize = true then Mode.size r v else Mode.length r v, n) (b :: bs) = (if isSize = true then Mode.size (r - (b :: bs).length) (List.foldl (fun a b Nat.bit b a) v (b :: bs)) else Mode.length (r - (b :: bs).length) (List.foldl (fun a b Nat.bit b a) v (b :: bs)), n) isSize:Boolbs✝:List Boolb:Boolbs:List Boolih: (r v n : ), bs.length < r List.foldl step (if isSize = true then Mode.size r v else Mode.length r v, n) bs = (if isSize = true then Mode.size (r - bs.length) (List.foldl (fun a b Nat.bit b a) v bs) else Mode.length (r - bs.length) (List.foldl (fun a b Nat.bit b a) v bs), n)r:v:n:h:(b :: bs).length < rhr:r 1ht:bs.length < r - 1List.foldl step (if isSize = true then Mode.size r v else Mode.length r v, n) (b :: bs) = (if isSize = true then Mode.size (r - (b :: bs).length) (List.foldl (fun a b Nat.bit b a) v (b :: bs)) else Mode.length (r - (b :: bs).length) (List.foldl (fun a b Nat.bit b a) v (b :: bs)), n) isSize:Boolbs✝:List Boolb:Boolbs:List Boolih: (r v n : ), bs.length < r List.foldl step (if isSize = true then Mode.size r v else Mode.length r v, n) bs = (if isSize = true then Mode.size (r - bs.length) (List.foldl (fun a b Nat.bit b a) v bs) else Mode.length (r - bs.length) (List.foldl (fun a b Nat.bit b a) v bs), n)r:v:n:h:(b :: bs).length < rhr:r 1ht:bs.length < r - 1he:r - 1 - bs.length = r - (bs.length + 1)List.foldl step (if isSize = true then Mode.size r v else Mode.length r v, n) (b :: bs) = (if isSize = true then Mode.size (r - (b :: bs).length) (List.foldl (fun a b Nat.bit b a) v (b :: bs)) else Mode.length (r - (b :: bs).length) (List.foldl (fun a b Nat.bit b a) v (b :: bs)), n) bs✝:List Boolb:Boolbs:List Boolr:v:n:h:(b :: bs).length < rhr:r 1ht:bs.length < r - 1he:r - 1 - bs.length = r - (bs.length + 1)ih: (r v n : ), bs.length < r List.foldl step (if false = true then Mode.size r v else Mode.length r v, n) bs = (if false = true then Mode.size (r - bs.length) (List.foldl (fun a b Nat.bit b a) v bs) else Mode.length (r - bs.length) (List.foldl (fun a b Nat.bit b a) v bs), n)List.foldl step (if false = true then Mode.size r v else Mode.length r v, n) (b :: bs) = (if false = true then Mode.size (r - (b :: bs).length) (List.foldl (fun a b Nat.bit b a) v (b :: bs)) else Mode.length (r - (b :: bs).length) (List.foldl (fun a b Nat.bit b a) v (b :: bs)), n)bs✝:List Boolb:Boolbs:List Boolr:v:n:h:(b :: bs).length < rhr:r 1ht:bs.length < r - 1he:r - 1 - bs.length = r - (bs.length + 1)ih: (r v n : ), bs.length < r List.foldl step (if true = true then Mode.size r v else Mode.length r v, n) bs = (if true = true then Mode.size (r - bs.length) (List.foldl (fun a b Nat.bit b a) v bs) else Mode.length (r - bs.length) (List.foldl (fun a b Nat.bit b a) v bs), n)List.foldl step (if true = true then Mode.size r v else Mode.length r v, n) (b :: bs) = (if true = true then Mode.size (r - (b :: bs).length) (List.foldl (fun a b Nat.bit b a) v (b :: bs)) else Mode.length (r - (b :: bs).length) (List.foldl (fun a b Nat.bit b a) v (b :: bs)), n) bs✝:List Boolb:Boolbs:List Boolr:v:n:h:(b :: bs).length < rhr:r 1ht:bs.length < r - 1he:r - 1 - bs.length = r - (bs.length + 1)ih: (r v n : ), bs.length < r List.foldl step (if false = true then Mode.size r v else Mode.length r v, n) bs = (if false = true then Mode.size (r - bs.length) (List.foldl (fun a b Nat.bit b a) v bs) else Mode.length (r - bs.length) (List.foldl (fun a b Nat.bit b a) v bs), n)List.foldl step (if false = true then Mode.size r v else Mode.length r v, n) (b :: bs) = (if false = true then Mode.size (r - (b :: bs).length) (List.foldl (fun a b Nat.bit b a) v (b :: bs)) else Mode.length (r - (b :: bs).length) (List.foldl (fun a b Nat.bit b a) v (b :: bs)), n)bs✝:List Boolb:Boolbs:List Boolr:v:n:h:(b :: bs).length < rhr:r 1ht:bs.length < r - 1he:r - 1 - bs.length = r - (bs.length + 1)ih: (r v n : ), bs.length < r List.foldl step (if true = true then Mode.size r v else Mode.length r v, n) bs = (if true = true then Mode.size (r - bs.length) (List.foldl (fun a b Nat.bit b a) v bs) else Mode.length (r - bs.length) (List.foldl (fun a b Nat.bit b a) v bs), n)List.foldl step (if true = true then Mode.size r v else Mode.length r v, n) (b :: bs) = (if true = true then Mode.size (r - (b :: bs).length) (List.foldl (fun a b Nat.bit b a) v (b :: bs)) else Mode.length (r - (b :: bs).length) (List.foldl (fun a b Nat.bit b a) v (b :: bs)), n) All goals completed! 🐙) bs

A positive integer has an empty binary payload exactly when it is one.

theorem payload_eq_nil_iff (k : ) (hk : k 0) : payload k = [] k = 1 := k:hk:k 0payload k = [] k = 1 k:hk:k 0payload k = [] k = 1k:hk:k 0k = 1 payload k = [] k:hk:k 0payload k = [] k = 1 k:hk:k 0h:payload k = []k = 1 k:hk:k 0h:payload k = []he:fromPayload (payload k) = kk = 1 k:hk:k 0h:payload k = []he:fromPayload [] = kk = 1 All goals completed! 🐙 k:hk:k 0k = 1 payload k = [] hk:1 0payload 1 = [] All goals completed! 🐙

Scanning a gamma prefix either completes zero or starts the remaining length field.

theorem foldl_gamma (k : ) (hk : k 0) (n : ) : (encodeGamma k).foldl step (.zeros 0, n) = if k = 1 then finish n else (.length (k - 1) 1, n) := k:hk:k 0n:List.foldl step (Mode.zeros 0, n) (encodeGamma k) = if k = 1 then finish n else (Mode.length (k - 1) 1, n) k:hk:k 0n:hp:payload k = [] k = 1List.foldl step (Mode.zeros 0, n) (encodeGamma k) = if k = 1 then finish n else (Mode.length (k - 1) 1, n) k:hk:k 0n:hp:payload k = [] k = 1hnil:payload k = []List.foldl step (Mode.zeros 0, n) (encodeGamma k) = if k = 1 then finish n else (Mode.length (k - 1) 1, n)k:hk:k 0n:hp:payload k = [] k = 1hnil:¬payload k = []List.foldl step (Mode.zeros 0, n) (encodeGamma k) = if k = 1 then finish n else (Mode.length (k - 1) 1, n) k:hk:k 0n:hp:payload k = [] k = 1hnil:payload k = []List.foldl step (Mode.zeros 0, n) (encodeGamma k) = if k = 1 then finish n else (Mode.length (k - 1) 1, n) k:hk:k 0n:hp:payload k = [] k = 1hnil:payload k = []he:k = 1List.foldl step (Mode.zeros 0, n) (encodeGamma k) = if k = 1 then finish n else (Mode.length (k - 1) 1, n) n:hk:1 0hp:payload 1 = [] 1 = 1hnil:payload 1 = []List.foldl step (Mode.zeros 0, n) (encodeGamma 1) = if 1 = 1 then finish n else (Mode.length (1 - 1) 1, n) All goals completed! 🐙 k:hk:k 0n:hp:payload k = [] k = 1hnil:¬payload k = []List.foldl step (Mode.zeros 0, n) (encodeGamma k) = if k = 1 then finish n else (Mode.length (k - 1) 1, n) k:hk:k 0n:hp:payload k = [] k = 1hnil:¬payload k = []hlen:(payload k).length 0List.foldl step (Mode.zeros 0, n) (encodeGamma k) = if k = 1 then finish n else (Mode.length (k - 1) 1, n) k:hk:k 0n:hp:payload k = [] k = 1hnil:¬payload k = []hlen:(payload k).length 0hk1:k 1List.foldl step (Mode.zeros 0, n) (encodeGamma k) = if k = 1 then finish n else (Mode.length (k - 1) 1, n) k:hk:k 0n:hp:payload k = [] k = 1hnil:¬payload k = []hlen:(payload k).length 0hk1:k 1List.foldl step (Mode.zeros (0 + (payload k).length), n) (true :: payload k) = if k = 1 then finish n else (Mode.length (k - 1) 1, n) k:hk:k 0n:hp:payload k = [] k = 1hnil:¬payload k = []hlen:(payload k).length 0hk1:k 1List.foldl step (Mode.size (payload k).length 1, n) (payload k) = if k = 1 then finish n else (Mode.length (k - 1) 1, n) k:hk:k 0n:hp:payload k = [] k = 1hnil:¬payload k = []hlen:(payload k).length 0hk1:k 1hf:List.foldl step (if true = true then Mode.size (payload k).length 1 else Mode.length (payload k).length 1, n) (payload k) = (if true = true then Mode.length (List.foldl (fun a b Nat.bit b a) 1 (payload k) - 1) 1 else Mode.payload (List.foldl (fun a b Nat.bit b a) 1 (payload k) - 1), n)List.foldl step (Mode.size (payload k).length 1, n) (payload k) = if k = 1 then finish n else (Mode.length (k - 1) 1, n) k:hk:k 0n:hp:payload k = [] k = 1hnil:¬payload k = []hlen:(payload k).length 0hk1:k 1hf:List.foldl step (Mode.size (payload k).length 1, n) (payload k) = (Mode.length (List.foldl (fun a b Nat.bit b a) 1 (payload k) - 1) 1, n)List.foldl step (Mode.size (payload k).length 1, n) (payload k) = if k = 1 then finish n else (Mode.length (k - 1) 1, n) k:hk:k 0n:hp:payload k = [] k = 1hnil:¬payload k = []hlen:(payload k).length 0hk1:k 1hf:List.foldl step (Mode.size (payload k).length 1, n) (payload k) = (Mode.length (List.foldl (fun a b Nat.bit b a) 1 (payload k) - 1) 1, n)(Mode.length (List.foldl (fun a b Nat.bit b a) 1 (payload k) - 1) 1, n) = if k = 1 then finish n else (Mode.length (k - 1) 1, n) k:hk:k 0n:hp:payload k = [] k = 1hnil:¬payload k = []hlen:(payload k).length 0hk1:k 1hf:List.foldl step (Mode.size (payload k).length 1, n) (payload k) = (Mode.length (List.foldl (fun a b Nat.bit b a) 1 (payload k) - 1) 1, n)(Mode.length (fromPayload (payload k) - 1) 1, n) = if k = 1 then finish n else (Mode.length (k - 1) 1, n) All goals completed! 🐙

Scanning a complete delta code sets its raw-payload countdown.

theorem foldl_encodeNat (m n : ) : (encodeNat m).foldl step (.zeros 0, n) = if m = 0 then finish n else (.payload m, n) := m:n:List.foldl step (Mode.zeros 0, n) (encodeNat m) = if m = 0 then finish n else (Mode.payload m, n) cases m with n:List.foldl step (Mode.zeros 0, n) (encodeNat 0) = if 0 = 0 then finish n else (Mode.payload 0, n) All goals completed! 🐙 n:m:List.foldl step (Mode.zeros 0, n) (encodeNat (m + 1)) = if m + 1 = 0 then finish n else (Mode.payload (m + 1), n) n:m:hp:m + 1 + 1 0List.foldl step (Mode.zeros 0, n) (encodeNat (m + 1)) = if m + 1 = 0 then finish n else (Mode.payload (m + 1), n) n:m:hp:m + 1 + 1 0hs:(m + 1 + 1).size 0List.foldl step (Mode.zeros 0, n) (encodeNat (m + 1)) = if m + 1 = 0 then finish n else (Mode.payload (m + 1), n) n:m:hp:m + 1 + 1 0hs:(m + 1 + 1).size 0hnil:payload (m + 1 + 1) []List.foldl step (Mode.zeros 0, n) (encodeNat (m + 1)) = if m + 1 = 0 then finish n else (Mode.payload (m + 1), n) n:m:hp:m + 1 + 1 0hs:(m + 1 + 1).size 0hnil:payload (m + 1 + 1) []hs1:(m + 1 + 1).size 1List.foldl step (Mode.zeros 0, n) (encodeNat (m + 1)) = if m + 1 = 0 then finish n else (Mode.payload (m + 1), n) n:m:hp:m + 1 + 1 0hs:(m + 1 + 1).size 0hnil:payload (m + 1 + 1) []hs1:(m + 1 + 1).size 1hf:List.foldl step (if false = true then Mode.size (payload (m + 1 + 1)).length 1 else Mode.length (payload (m + 1 + 1)).length 1, n) (payload (m + 1 + 1)) = (if false = true then Mode.length (List.foldl (fun a b Nat.bit b a) 1 (payload (m + 1 + 1)) - 1) 1 else Mode.payload (List.foldl (fun a b Nat.bit b a) 1 (payload (m + 1 + 1)) - 1), n)List.foldl step (Mode.zeros 0, n) (encodeNat (m + 1)) = if m + 1 = 0 then finish n else (Mode.payload (m + 1), n) n:m:hp:m + 1 + 1 0hs:(m + 1 + 1).size 0hnil:payload (m + 1 + 1) []hs1:(m + 1 + 1).size 1hf:List.foldl step (Mode.length (payload (m + 1 + 1)).length 1, n) (payload (m + 1 + 1)) = (Mode.payload (List.foldl (fun a b Nat.bit b a) 1 (payload (m + 1 + 1)) - 1), n)List.foldl step (Mode.zeros 0, n) (encodeNat (m + 1)) = if m + 1 = 0 then finish n else (Mode.payload (m + 1), n) n:m:hp:m + 1 + 1 0hs:(m + 1 + 1).size 0hnil:payload (m + 1 + 1) []hs1:(m + 1 + 1).size 1hf:List.foldl step (Mode.length (payload (m + 1 + 1)).length 1, n) (payload (m + 1 + 1)) = (Mode.payload (List.foldl (fun a b Nat.bit b a) 1 (payload (m + 1 + 1)) - 1), n)(Mode.payload (List.foldl (fun a b Nat.bit b a) 1 (payload (m + 1 + 1)) - 1), n) = if m + 1 = 0 then finish n else (Mode.payload (m + 1), n) n:m:hp:m + 1 + 1 0hs:(m + 1 + 1).size 0hnil:payload (m + 1 + 1) []hs1:(m + 1 + 1).size 1hf:List.foldl step (Mode.length (payload (m + 1 + 1)).length 1, n) (payload (m + 1 + 1)) = (Mode.payload (List.foldl (fun a b Nat.bit b a) 1 (payload (m + 1 + 1)) - 1), n)(Mode.payload (fromPayload (payload (m + 1 + 1)) - 1), n) = if m + 1 = 0 then finish n else (Mode.payload (m + 1), n) n:m:hp:m + 1 + 1 0hs:(m + 1 + 1).size 0hnil:payload (m + 1 + 1) []hs1:(m + 1 + 1).size 1hf:List.foldl step (Mode.length (payload (m + 1 + 1)).length 1, n) (payload (m + 1 + 1)) = (Mode.payload (List.foldl (fun a b Nat.bit b a) 1 (payload (m + 1 + 1)) - 1), n)(Mode.payload (m + 1 + 1 - 1), n) = if m + 1 = 0 then finish n else (Mode.payload (m + 1), n) All goals completed! 🐙

A successfully parsed header has the same effect as its bitwise scan.

theorem foldl_header (w : List Bool) (m : ) (rest : List Bool) (n : ) (h : readNat w = some (m, rest)) : w.foldl step (.zeros 0, n) = rest.foldl step (if m = 0 then finish n else (.payload m, n)) := w:List Boolm:rest:List Booln:h:readNat w = some (m, rest)List.foldl step (Mode.zeros 0, n) w = List.foldl step (if m = 0 then finish n else (Mode.payload m, n)) rest All goals completed! 🐙

A prefix with no terminating one remains in the unary header phase.

theorem foldl_zeros_none (w : List Bool) : z n, readZeros w = none w.foldl step (.zeros z, n) = (.zeros (z + w.length), n) := List.rec (fun _ _ _ rfl) (fun b bs ih z n h w:List Boolb:Boolbs:List Boolih: (z n : ), readZeros bs = none List.foldl step (Mode.zeros z, n) bs = (Mode.zeros (z + bs.length), n)z:n:h:readZeros (b :: bs) = noneList.foldl step (Mode.zeros z, n) (b :: bs) = (Mode.zeros (z + (b :: bs).length), n) cases b with w:List Boolbs:List Boolih: (z n : ), readZeros bs = none List.foldl step (Mode.zeros z, n) bs = (Mode.zeros (z + bs.length), n)z:n:h:readZeros (true :: bs) = noneList.foldl step (Mode.zeros z, n) (true :: bs) = (Mode.zeros (z + (true :: bs).length), n) All goals completed! 🐙 w:List Boolbs:List Boolih: (z n : ), readZeros bs = none List.foldl step (Mode.zeros z, n) bs = (Mode.zeros (z + bs.length), n)z:n:h:readZeros (false :: bs) = noneList.foldl step (Mode.zeros z, n) (false :: bs) = (Mode.zeros (z + (false :: bs).length), n) w:List Boolbs:List Boolih: (z n : ), readZeros bs = none List.foldl step (Mode.zeros z, n) bs = (Mode.zeros (z + bs.length), n)z:n:h:readZeros (false :: bs) = noneht:readZeros bs = noneList.foldl step (Mode.zeros z, n) (false :: bs) = (Mode.zeros (z + (false :: bs).length), n) w:List Boolbs:List Boolih: (z n : ), readZeros bs = none List.foldl step (Mode.zeros z, n) bs = (Mode.zeros (z + bs.length), n)z:n:h:readZeros (false :: bs) = noneht:readZeros bs = noneList.foldl step (step (Mode.zeros z, n) false) bs = (Mode.zeros (z + (false :: bs).length), n) w:List Boolbs:List Boolih: (z n : ), readZeros bs = none List.foldl step (Mode.zeros z, n) bs = (Mode.zeros (z + bs.length), n)z:n:h:readZeros (false :: bs) = noneht:readZeros bs = noneList.foldl step (Mode.zeros (z + 1), n) bs = (Mode.zeros (z + (false :: bs).length), n) w:List Boolbs:List Boolih: (z n : ), readZeros bs = none List.foldl step (Mode.zeros z, n) bs = (Mode.zeros (z + bs.length), n)z:n:h:readZeros (false :: bs) = noneht:readZeros bs = none(Mode.zeros (z + 1 + bs.length), n) = (Mode.zeros (z + (false :: bs).length), n) w:List Boolbs:List Boolih: (z n : ), readZeros bs = none List.foldl step (Mode.zeros z, n) bs = (Mode.zeros (z + bs.length), n)z:n:h:readZeros (false :: bs) = noneht:readZeros bs = nonez + 1 + bs.length = z + (false :: bs).length w:List Boolbs:List Boolih: (z n : ), readZeros bs = none List.foldl step (Mode.zeros z, n) bs = (Mode.zeros (z + bs.length), n)z:n:h:readZeros (false :: bs) = noneht:readZeros bs = nonez + 1 + bs.length = z + (bs.length + 1) All goals completed! 🐙) w

Failure of a fixed-width read means the available input is too short.

theorem readFixed_none_lt (k : ) (w : List Bool) (h : readFixed k w = none) : w.length < k := k:w:List Boolh:readFixed k w = nonew.length < k k:w:List Boolh:(if k w.length then some (fromPayload (List.take k w), List.drop k w) else none) = nonew.length < k k:w:List Boolh✝:k w.lengthh:some (fromPayload (List.take k w), List.drop k w) = nonew.length < kk:w:List Boolh✝:¬k w.lengthh:none = nonew.length < k next k:w:List Boolh✝:k w.lengthh:some (fromPayload (List.take k w), List.drop k w) = nonew.length < k All goals completed! 🐙 next hk k:w:List Boolhk:¬k w.lengthh:none = nonew.length < k All goals completed! 🐙

An incomplete gamma prefix cannot leave the header phases.

theorem gamma_reject (w : List Bool) (n : ) (h : readGamma w = none) : (w.foldl step (.zeros 0, n)).1 .done := w:List Booln:h:readGamma w = none(List.foldl step (Mode.zeros 0, n) w).fst Mode.done cases hz : readZeros w with w:List Booln:h:readGamma w = nonehz:readZeros w = none(List.foldl step (Mode.zeros 0, n) w).fst Mode.done w:List Booln:h:readGamma w = nonehz:readZeros w = none(Mode.zeros (0 + w.length), n).fst Mode.done; w:List Booln:h:readGamma w = nonehz:readZeros w = nonehe:(Mode.zeros (0 + w.length), n).fst = Mode.doneFalse; All goals completed! 🐙 w:List Booln:h:readGamma w = nonep: × List Boolhz:readZeros w = some p(List.foldl step (Mode.zeros 0, n) w).fst Mode.done w:List Booln:h:readGamma w = nonez:suffix:List Boolhz:readZeros w = some (z, suffix)(List.foldl step (Mode.zeros 0, n) w).fst Mode.done w:List Booln:h:readGamma w = nonez:suffix:List Boolhz:readZeros w = some (z, suffix)hf:readFixed z suffix = none(List.foldl step (Mode.zeros 0, n) w).fst Mode.done w:List Booln:h:readGamma w = nonez:suffix:List Boolhz:readZeros w = some (z, suffix)hf:readFixed z suffix = nonehlt:suffix.length < z(List.foldl step (Mode.zeros 0, n) w).fst Mode.done w:List Booln:h:readGamma w = nonez:suffix:List Boolhz:readZeros w = some (z, suffix)hf:readFixed z suffix = nonehlt:suffix.length < zhz0:z 0(List.foldl step (Mode.zeros 0, n) w).fst Mode.done w:List Booln:h:readGamma w = nonez:suffix:List Boolhz:readZeros w = some (z, suffix)hf:readFixed z suffix = nonehlt:suffix.length < zhz0:z 0(List.foldl step (Mode.zeros (0 + z), n) (true :: suffix)).fst Mode.done w:List Booln:h:readGamma w = nonez:suffix:List Boolhz:readZeros w = some (z, suffix)hf:readFixed z suffix = nonehlt:suffix.length < zhz0:z 0(List.foldl step (Mode.size z 1, n) suffix).fst Mode.done w:List Booln:h:readGamma w = nonez:suffix:List Boolhz:readZeros w = some (z, suffix)hf:readFixed z suffix = nonehlt:suffix.length < zhz0:z 0he:List.foldl step (if true = true then Mode.size z 1 else Mode.length z 1, n) suffix = (if true = true then Mode.size (z - suffix.length) (List.foldl (fun a b Nat.bit b a) 1 suffix) else Mode.length (z - suffix.length) (List.foldl (fun a b Nat.bit b a) 1 suffix), n)(List.foldl step (Mode.size z 1, n) suffix).fst Mode.done w:List Booln:h:readGamma w = nonez:suffix:List Boolhz:readZeros w = some (z, suffix)hf:readFixed z suffix = nonehlt:suffix.length < zhz0:z 0he:List.foldl step (Mode.size z 1, n) suffix = (Mode.size (z - suffix.length) (List.foldl (fun a b Nat.bit b a) 1 suffix), n)(List.foldl step (Mode.size z 1, n) suffix).fst Mode.done w:List Booln:h:readGamma w = nonez:suffix:List Boolhz:readZeros w = some (z, suffix)hf:readFixed z suffix = nonehlt:suffix.length < zhz0:z 0he:List.foldl step (Mode.size z 1, n) suffix = (Mode.size (z - suffix.length) (List.foldl (fun a b Nat.bit b a) 1 suffix), n)(Mode.size (z - suffix.length) (List.foldl (fun a b Nat.bit b a) 1 suffix), n).fst Mode.done w:List Booln:h:readGamma w = nonez:suffix:List Boolhz:readZeros w = some (z, suffix)hf:readFixed z suffix = nonehlt:suffix.length < zhz0:z 0he:List.foldl step (Mode.size z 1, n) suffix = (Mode.size (z - suffix.length) (List.foldl (fun a b Nat.bit b a) 1 suffix), n)hh:(Mode.size (z - suffix.length) (List.foldl (fun a b Nat.bit b a) 1 suffix), n).fst = Mode.doneFalse All goals completed! 🐙

An incomplete delta header cannot cause acceptance.

theorem header_reject (w : List Bool) (n : ) (h : readNat w = none) : (w.foldl step (.zeros 0, n)).1 .done := w:List Booln:h:readNat w = none(List.foldl step (Mode.zeros 0, n) w).fst Mode.done cases hg : readGamma w with w:List Booln:h:readNat w = nonehg:readGamma w = none(List.foldl step (Mode.zeros 0, n) w).fst Mode.done All goals completed! 🐙 w:List Booln:h:readNat w = nonep: × List Boolhg:readGamma w = some p(List.foldl step (Mode.zeros 0, n) w).fst Mode.done w:List Booln:h:readNat w = nonek:suffix:List Boolhg:readGamma w = some (k, suffix)(List.foldl step (Mode.zeros 0, n) w).fst Mode.done w:List Booln:h:readNat w = nonek:suffix:List Boolhg:readGamma w = some (k, suffix)hk:k 0hw:w = encodeGamma k ++ suffix(List.foldl step (Mode.zeros 0, n) w).fst Mode.done w:List Booln:h:readNat w = nonek:suffix:List Boolhg:readGamma w = some (k, suffix)hk:k 0hw:w = encodeGamma k ++ suffixhf:readFixed (k - 1) suffix = none(List.foldl step (Mode.zeros 0, n) w).fst Mode.done w:List Booln:h:readNat w = nonek:suffix:List Boolhg:readGamma w = some (k, suffix)hk:k 0hw:w = encodeGamma k ++ suffixhf:readFixed (k - 1) suffix = nonehlt:suffix.length < k - 1(List.foldl step (Mode.zeros 0, n) w).fst Mode.done w:List Booln:h:readNat w = nonek:suffix:List Boolhg:readGamma w = some (k, suffix)hk:k 0hw:w = encodeGamma k ++ suffixhf:readFixed (k - 1) suffix = nonehlt:suffix.length < k - 1hk1:k 1(List.foldl step (Mode.zeros 0, n) w).fst Mode.done w:List Booln:h:readNat w = nonek:suffix:List Boolhg:readGamma w = some (k, suffix)hk:k 0hw:w = encodeGamma k ++ suffixhf:readFixed (k - 1) suffix = nonehlt:suffix.length < k - 1hk1:k 1(List.foldl step (Mode.length (k - 1) 1, n) suffix).fst Mode.done w:List Booln:h:readNat w = nonek:suffix:List Boolhg:readGamma w = some (k, suffix)hk:k 0hw:w = encodeGamma k ++ suffixhf:readFixed (k - 1) suffix = nonehlt:suffix.length < k - 1hk1:k 1he:List.foldl step (if false = true then Mode.size (k - 1) 1 else Mode.length (k - 1) 1, n) suffix = (if false = true then Mode.size (k - 1 - suffix.length) (List.foldl (fun a b Nat.bit b a) 1 suffix) else Mode.length (k - 1 - suffix.length) (List.foldl (fun a b Nat.bit b a) 1 suffix), n)(List.foldl step (Mode.length (k - 1) 1, n) suffix).fst Mode.done w:List Booln:h:readNat w = nonek:suffix:List Boolhg:readGamma w = some (k, suffix)hk:k 0hw:w = encodeGamma k ++ suffixhf:readFixed (k - 1) suffix = nonehlt:suffix.length < k - 1hk1:k 1he:List.foldl step (Mode.length (k - 1) 1, n) suffix = (Mode.length (k - 1 - suffix.length) (List.foldl (fun a b Nat.bit b a) 1 suffix), n)(List.foldl step (Mode.length (k - 1) 1, n) suffix).fst Mode.done w:List Booln:h:readNat w = nonek:suffix:List Boolhg:readGamma w = some (k, suffix)hk:k 0hw:w = encodeGamma k ++ suffixhf:readFixed (k - 1) suffix = nonehlt:suffix.length < k - 1hk1:k 1he:List.foldl step (Mode.length (k - 1) 1, n) suffix = (Mode.length (k - 1 - suffix.length) (List.foldl (fun a b Nat.bit b a) 1 suffix), n)(Mode.length (k - 1 - suffix.length) (List.foldl (fun a b Nat.bit b a) 1 suffix), n).fst Mode.done w:List Booln:h:readNat w = nonek:suffix:List Boolhg:readGamma w = some (k, suffix)hk:k 0hw:w = encodeGamma k ++ suffixhf:readFixed (k - 1) suffix = nonehlt:suffix.length < k - 1hk1:k 1he:List.foldl step (Mode.length (k - 1) 1, n) suffix = (Mode.length (k - 1 - suffix.length) (List.foldl (fun a b Nat.bit b a) 1 suffix), n)hh:(Mode.length (k - 1 - suffix.length) (List.foldl (fun a b Nat.bit b a) 1 suffix), n).fst = Mode.doneFalse All goals completed! 🐙
end Geb.BitTree.Elias.Scanner