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.Codeset_option doc.verso trueStreaming 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_headerrelates successful integer parsing to the streaming header phases. -
header_rejectexcludes acceptance when the integer header is incomplete.
Tags
Elias delta code, streaming recognizer, simulation
@[expose] public sectionnamespace Geb.BitTree.Elias.ScannerScanning 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)
change (List.replicate k false).foldl step (.zeros (z + 1), 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)
rw [ih 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:ℕ⊢ (Mode.zeros (z + 1 + k), n) = (Mode.zeros (z + k.succ), n)
congr 2 e_fst 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
omega 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 _ ↦ by 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
| nil => nil 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) cases isSize nil.false 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)nil.true 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) <;> nil.false 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)nil.true 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) rfl All goals completed! 🐙
| cons c bs => cons 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)
have he : bs.length + 1 + 1 ≠ 1 := by 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) omega cons 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 ≠ 1⊢ 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)
cases isSize cons.false 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)cons.true 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) <;> cons.false 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)cons.true 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 (by 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 ≠ [] simp All goals completed! 🐙)) bsA 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 ↦ by 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 < r⊢ 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)
have hr : r ≠ 1 := by simp only [List.length_cons] at 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:bs.length + 1 < r⊢ r ≠ 1; omega 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 ≠ 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)
have ht : bs.length < r - 1 := by simp only [List.length_cons] at 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:bs.length + 1 < rhr:r ≠ 1⊢ bs.length < r - 1; omega 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 - 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)
have he : r - 1 - bs.length = r - (bs.length + 1) := by omega 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)
cases isSize false 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)true 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) <;> false 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)true 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)
simpa only [List.foldl_cons, List.length_cons, step, hr, Bool.false_eq_true,
↓reduceIte, he] using
ih (r - 1) (Nat.bit b v) n ht All goals completed! 🐙) bsA 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 := by k:ℕhk:k ≠ 0⊢ payload k = [] ↔ k = 1
constructor mp k:ℕhk:k ≠ 0⊢ payload k = [] → k = 1mpr k:ℕhk:k ≠ 0⊢ k = 1 → payload k = []
· mp k:ℕhk:k ≠ 0⊢ payload k = [] → k = 1 intro h mp k:ℕhk:k ≠ 0h:payload k = []⊢ k = 1
have he := fromPayload_payload k hk mp k:ℕhk:k ≠ 0h:payload k = []he:fromPayload (payload k) = k⊢ k = 1
rw [h mp k:ℕhk:k ≠ 0h:payload k = []he:fromPayload [] = k⊢ k = 1] at he mp k:ℕhk:k ≠ 0h:payload k = []he:fromPayload [] = k⊢ k = 1
exact he.symm All goals completed! 🐙
· mpr k:ℕhk:k ≠ 0⊢ k = 1 → payload k = [] rintro rfl mpr hk:1 ≠ 0⊢ payload 1 = []
rfl 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) := by 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)
have hp := payload_eq_nil_iff k hk k:ℕhk:k ≠ 0n:ℕhp:payload k = [] ↔ k = 1⊢ List.foldl step (Mode.zeros 0, n) (encodeGamma k) = if k = 1 then finish n else (Mode.length (k - 1) 1, n)
by_cases hnil : payload k = [] pos 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)neg 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)
· pos 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) have he := hp.mp hnil pos k:ℕhk:k ≠ 0n:ℕhp:payload k = [] ↔ k = 1hnil:payload k = []he:k = 1⊢ List.foldl step (Mode.zeros 0, n) (encodeGamma k) = if k = 1 then finish n else (Mode.length (k - 1) 1, n)
subst k pos 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)
rfl All goals completed! 🐙
· neg 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) have hlen : (payload k).length ≠ 0 := by
intro he k:ℕhk:k ≠ 0n:ℕhp:payload k = [] ↔ k = 1hnil:¬payload k = []he:(payload k).length = 0⊢ False
exact hnil (List.eq_nil_of_length_eq_zero he) neg k:ℕhk:k ≠ 0n:ℕhp:payload k = [] ↔ k = 1hnil:¬payload k = []hlen:(payload k).length ≠ 0⊢ List.foldl step (Mode.zeros 0, n) (encodeGamma k) = if k = 1 then finish n else (Mode.length (k - 1) 1, n)
have hk1 : k ≠ 1 := fun he ↦ hnil (hp.mpr he) neg k:ℕhk:k ≠ 0n:ℕhp:payload k = [] ↔ k = 1hnil:¬payload k = []hlen:(payload k).length ≠ 0hk1:k ≠ 1⊢ List.foldl step (Mode.zeros 0, n) (encodeGamma k) = if k = 1 then finish n else (Mode.length (k - 1) 1, n)
rw [encodeGamma, neg k:ℕhk:k ≠ 0n:ℕhp:payload k = [] ↔ k = 1hnil:¬payload k = []hlen:(payload k).length ≠ 0hk1:k ≠ 1⊢ List.foldl step (Mode.zeros 0, n) (List.replicate (k.size - 1) false ++ true :: payload k) =
if k = 1 then finish n else (Mode.length (k - 1) 1, n) ← length_payload, neg k:ℕhk:k ≠ 0n:ℕhp:payload k = [] ↔ k = 1hnil:¬payload k = []hlen:(payload k).length ≠ 0hk1:k ≠ 1⊢ List.foldl step (Mode.zeros 0, n) (List.replicate (payload k).length false ++ true :: payload k) =
if k = 1 then finish n else (Mode.length (k - 1) 1, n) List.foldl_append, neg k:ℕhk:k ≠ 0n:ℕhp:payload k = [] ↔ k = 1hnil:¬payload k = []hlen:(payload k).length ≠ 0hk1:k ≠ 1⊢ List.foldl step (List.foldl step (Mode.zeros 0, n) (List.replicate (payload k).length false)) (true :: payload k) =
if k = 1 then finish n else (Mode.length (k - 1) 1, n) foldl_replicate_false neg k:ℕhk:k ≠ 0n:ℕhp:payload k = [] ↔ k = 1hnil:¬payload k = []hlen:(payload k).length ≠ 0hk1:k ≠ 1⊢ List.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)] neg k:ℕhk:k ≠ 0n:ℕhp:payload k = [] ↔ k = 1hnil:¬payload k = []hlen:(payload k).length ≠ 0hk1:k ≠ 1⊢ List.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)
simp only [Nat.zero_add, List.foldl_cons, step, hlen, ↓reduceIte] neg k:ℕhk:k ≠ 0n:ℕhp:payload k = [] ↔ k = 1hnil:¬payload k = []hlen:(payload k).length ≠ 0hk1:k ≠ 1⊢ 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)
have hf := foldl_field true (payload k) 1 n hnil neg 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)
simp only [↓reduceIte] at hf neg 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)
rw [hf neg 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)] neg 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)
change (Mode.length (fromPayload (payload k) - 1) 1, n) = _ neg 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)
rw [fromPayload_payload k hk, neg 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 (k - 1) 1, n) = if k = 1 then finish n else (Mode.length (k - 1) 1, n) ite_eq_right hk1 neg 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 (k - 1) 1, n) = (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) := by 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
| zero => zero n:ℕ⊢ List.foldl step (Mode.zeros 0, n) (encodeNat 0) = if 0 = 0 then finish n else (Mode.payload 0, n) rfl All goals completed! 🐙
| succ m => succ 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)
have hp : m + 1 + 1 ≠ 0 := by m:ℕn:ℕ⊢ List.foldl step (Mode.zeros 0, n) (encodeNat m) = if m = 0 then finish n else (Mode.payload m, n) omega succ n:ℕm:ℕhp:m + 1 + 1 ≠ 0⊢ List.foldl step (Mode.zeros 0, n) (encodeNat (m + 1)) = if m + 1 = 0 then finish n else (Mode.payload (m + 1), n)
have hs : (m + 1 + 1).size ≠ 0 := by m:ℕn:ℕ⊢ List.foldl step (Mode.zeros 0, n) (encodeNat m) = if m = 0 then finish n else (Mode.payload m, n) have h := size_pos _ hp n:ℕm:ℕhp:m + 1 + 1 ≠ 0h:0 < (m + 1 + 1).size⊢ (m + 1 + 1).size ≠ 0; omega succ n:ℕm:ℕhp:m + 1 + 1 ≠ 0hs:(m + 1 + 1).size ≠ 0⊢ List.foldl step (Mode.zeros 0, n) (encodeNat (m + 1)) = if m + 1 = 0 then finish n else (Mode.payload (m + 1), n)
have hnil : payload (m + 1 + 1) ≠ [] := by m:ℕn:ℕ⊢ List.foldl step (Mode.zeros 0, n) (encodeNat m) = if m = 0 then finish n else (Mode.payload m, n)
intro he n:ℕm:ℕhp:m + 1 + 1 ≠ 0hs:(m + 1 + 1).size ≠ 0he:payload (m + 1 + 1) = []⊢ False
have hh := (payload_eq_nil_iff _ hp).mp he n:ℕm:ℕhp:m + 1 + 1 ≠ 0hs:(m + 1 + 1).size ≠ 0he:payload (m + 1 + 1) = []hh:m + 1 + 1 = 1⊢ False
omega succ 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)
have hs1 : (m + 1 + 1).size ≠ 1 := by m:ℕn:ℕ⊢ List.foldl step (Mode.zeros 0, n) (encodeNat m) = if m = 0 then finish n else (Mode.payload m, n)
intro he n:ℕm:ℕhp:m + 1 + 1 ≠ 0hs:(m + 1 + 1).size ≠ 0hnil:payload (m + 1 + 1) ≠ []he:(m + 1 + 1).size = 1⊢ False
apply hnil n:ℕm:ℕhp:m + 1 + 1 ≠ 0hs:(m + 1 + 1).size ≠ 0hnil:payload (m + 1 + 1) ≠ []he:(m + 1 + 1).size = 1⊢ payload (m + 1 + 1) = []
apply List.eq_nil_of_length_eq_zero n:ℕm:ℕhp:m + 1 + 1 ≠ 0hs:(m + 1 + 1).size ≠ 0hnil:payload (m + 1 + 1) ≠ []he:(m + 1 + 1).size = 1⊢ (payload (m + 1 + 1)).length = 0
rw [length_payload, n:ℕm:ℕhp:m + 1 + 1 ≠ 0hs:(m + 1 + 1).size ≠ 0hnil:payload (m + 1 + 1) ≠ []he:(m + 1 + 1).size = 1⊢ (m + 1 + 1).size - 1 = 0 he n:ℕm:ℕhp:m + 1 + 1 ≠ 0hs:(m + 1 + 1).size ≠ 0hnil:payload (m + 1 + 1) ≠ []he:(m + 1 + 1).size = 1⊢ 1 - 1 = 0] succ n:ℕm:ℕhp:m + 1 + 1 ≠ 0hs:(m + 1 + 1).size ≠ 0hnil:payload (m + 1 + 1) ≠ []hs1:(m + 1 + 1).size ≠ 1⊢ List.foldl step (Mode.zeros 0, n) (encodeNat (m + 1)) = if m + 1 = 0 then finish n else (Mode.payload (m + 1), n)
have hf := foldl_field false (payload (m + 1 + 1)) 1 n hnil succ 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)
simp only [Bool.false_eq_true, ↓reduceIte] at hf succ 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)
rw [encodeNat, succ 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) (encodeGamma (m + 1 + 1).size ++ payload (m + 1 + 1)) =
if m + 1 = 0 then finish n else (Mode.payload (m + 1), n) List.foldl_append, succ 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 (List.foldl step (Mode.zeros 0, n) (encodeGamma (m + 1 + 1).size)) (payload (m + 1 + 1)) =
if m + 1 = 0 then finish n else (Mode.payload (m + 1), n) foldl_gamma _ hs n, succ 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 (if (m + 1 + 1).size = 1 then finish n else (Mode.length ((m + 1 + 1).size - 1) 1, n))
(payload (m + 1 + 1)) =
if m + 1 = 0 then finish n else (Mode.payload (m + 1), n) ite_eq_right hs1, succ 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.length ((m + 1 + 1).size - 1) 1, n) (payload (m + 1 + 1)) =
if m + 1 = 0 then finish n else (Mode.payload (m + 1), n)
← length_payload, succ 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.length (payload (m + 1 + 1)).length 1, n) (payload (m + 1 + 1)) =
if m + 1 = 0 then finish n else (Mode.payload (m + 1), n) hf succ 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)] succ 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)
change (Mode.payload (fromPayload (payload (m + 1 + 1)) - 1), n) = _ succ 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)
rw [fromPayload_payload _ hp succ 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)] succ 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)
rfl 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)) := by 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
rw [readNat_eq_some w m rest h, w:List Boolm:ℕrest:List Booln:ℕh:readNat w = some (m, rest)⊢ List.foldl step (Mode.zeros 0, n) (encodeNat m ++ rest) =
List.foldl step (if m = 0 then finish n else (Mode.payload m, n)) rest List.foldl_append, w:List Boolm:ℕrest:List Booln:ℕh:readNat w = some (m, rest)⊢ List.foldl step (List.foldl step (Mode.zeros 0, n) (encodeNat m)) rest =
List.foldl step (if m = 0 then finish n else (Mode.payload m, n)) rest foldl_encodeNat w:List Boolm:ℕrest:List Booln:ℕh:readNat w = some (m, rest)⊢ List.foldl step (if m = 0 then finish n else (Mode.payload m, n)) rest =
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 ↦ by 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) = none⊢ List.foldl step (Mode.zeros z, n) (b :: bs) = (Mode.zeros (z + (b :: bs).length), n)
cases b with
| true => true 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) = none⊢ List.foldl step (Mode.zeros z, n) (true :: bs) = (Mode.zeros (z + (true :: bs).length), n) cases h All goals completed! 🐙
| false => false 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) = none⊢ List.foldl step (Mode.zeros z, n) (false :: bs) = (Mode.zeros (z + (false :: bs).length), n)
have ht : readZeros bs = none := by 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) = none⊢ List.foldl step (Mode.zeros z, n) (b :: bs) = (Mode.zeros (z + (b :: bs).length), n)
cases hx : readZeros bs with
| none => none 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) = nonehx:readZeros bs = none⊢ none = none rfl All goals completed! 🐙
| some p => some 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) = nonep:ℕ × List Boolhx:readZeros bs = some p⊢ some p = none
rw [readZeros_cons, some 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:(if false = true then some (0, bs) else Option.map (fun p ↦ (p.fst + 1, p.snd)) (readZeros bs)) = nonep:ℕ × List Boolhx:readZeros bs = some p⊢ some p = none hx some 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:ℕp:ℕ × List Boolh:(if false = true then some (0, bs) else Option.map (fun p ↦ (p.fst + 1, p.snd)) (some p)) = nonehx:readZeros bs = some p⊢ some p = none] at h some 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:ℕp:ℕ × List Boolh:(if false = true then some (0, bs) else Option.map (fun p ↦ (p.fst + 1, p.snd)) (some p)) = nonehx:readZeros bs = some p⊢ some p = none
simp only [Bool.false_eq_true, ↓reduceIte, Option.map_some, reduceCtorEq] at h false 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⊢ List.foldl step (Mode.zeros z, n) (false :: bs) = (Mode.zeros (z + (false :: bs).length), n)
rw [List.foldl_cons false 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⊢ List.foldl step (step (Mode.zeros z, n) false) bs = (Mode.zeros (z + (false :: bs).length), n)] false 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⊢ List.foldl step (step (Mode.zeros z, n) false) bs = (Mode.zeros (z + (false :: bs).length), n)
change bs.foldl step (.zeros (z + 1), n) = _ false 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⊢ List.foldl step (Mode.zeros (z + 1), n) bs = (Mode.zeros (z + (false :: bs).length), n)
rw [ih (z + 1) n ht false 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)] false 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)
congr 2 false.e_fst 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⊢ z + 1 + bs.length = z + (false :: bs).length
simp only [List.length_cons] false.e_fst 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⊢ z + 1 + bs.length = z + (bs.length + 1)
omega All goals completed! 🐙) wFailure 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 := by k:ℕw:List Boolh:readFixed k w = none⊢ w.length < k
unfold readFixed at h k:ℕw:List Boolh:(if k ≤ w.length then some (fromPayload (List.take k w), List.drop k w) else none) = none⊢ w.length < k
split at h isTrue k:ℕw:List Boolh✝:k ≤ w.lengthh:some (fromPayload (List.take k w), List.drop k w) = none⊢ w.length < kisFalse k:ℕw:List Boolh✝:¬k ≤ w.lengthh:none = none⊢ w.length < k
next => k:ℕw:List Boolh✝:k ≤ w.lengthh:some (fromPayload (List.take k w), List.drop k w) = none⊢ w.length < k contradiction All goals completed! 🐙
next hk => k:ℕw:List Boolhk:¬k ≤ w.lengthh:none = none⊢ w.length < k omega 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 := by w:List Booln:ℕh:readGamma w = none⊢ (List.foldl step (Mode.zeros 0, n) w).fst ≠ Mode.done
cases hz : readZeros w with
| none => none w:List Booln:ℕh:readGamma w = nonehz:readZeros w = none⊢ (List.foldl step (Mode.zeros 0, n) w).fst ≠ Mode.done rw [foldl_zeros_none w 0 n hz none w:List Booln:ℕh:readGamma w = nonehz:readZeros w = none⊢ (Mode.zeros (0 + w.length), n).fst ≠ Mode.done] none w:List Booln:ℕh:readGamma w = nonehz:readZeros w = none⊢ (Mode.zeros (0 + w.length), n).fst ≠ Mode.done; intro he none w:List Booln:ℕh:readGamma w = nonehz:readZeros w = nonehe:(Mode.zeros (0 + w.length), n).fst = Mode.done⊢ False; cases he All goals completed! 🐙
| some p => some w:List Booln:ℕh:readGamma w = nonep:ℕ × List Boolhz:readZeros w = some p⊢ (List.foldl step (Mode.zeros 0, n) w).fst ≠ Mode.done
rcases p with ⟨z, suffix⟩ some 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
have hf : readFixed z suffix = none := by
simpa only [readGamma, hz, Option.bind_some] using h some 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
have hlt := readFixed_none_lt z suffix hf some 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
have hz0 : z ≠ 0 := by omega some 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
rw [readZeros_eq_some w z suffix hz, some 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) (List.replicate z false ++ true :: suffix)).fst ≠ Mode.done List.foldl_append, some 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 (List.foldl step (Mode.zeros 0, n) (List.replicate z false)) (true :: suffix)).fst ≠ Mode.done foldl_replicate_false some 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] some 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
simp only [Nat.zero_add, List.foldl_cons, step, hz0, ↓reduceIte] some 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
have he := foldl_short_field true suffix z 1 n hlt some 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
simp only [↓reduceIte] at he some 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
rw [he some 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] some 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
intro hh some 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.done⊢ False
cases hh 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 := by w:List Booln:ℕh:readNat w = none⊢ (List.foldl step (Mode.zeros 0, n) w).fst ≠ Mode.done
cases hg : readGamma w with
| none => none w:List Booln:ℕh:readNat w = nonehg:readGamma w = none⊢ (List.foldl step (Mode.zeros 0, n) w).fst ≠ Mode.done exact gamma_reject w n hg All goals completed! 🐙
| some p => some w:List Booln:ℕh:readNat w = nonep:ℕ × List Boolhg:readGamma w = some p⊢ (List.foldl step (Mode.zeros 0, n) w).fst ≠ Mode.done
rcases p with ⟨k, suffix⟩ some 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
obtain ⟨hk, hw⟩ := readGamma_eq_some w k suffix hg some 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
have hf : readFixed (k - 1) suffix = none := by
cases hx : readFixed (k - 1) suffix with
| none => none w:List Booln:ℕh:readNat w = nonek:ℕsuffix:List Boolhg:readGamma w = some (k, suffix)hk:k ≠ 0hw:w = encodeGamma k ++ suffixhx:readFixed (k - 1) suffix = none⊢ none = none rfl All goals completed! 🐙
| some p => some w:List Booln:ℕh:readNat w = nonek:ℕsuffix:List Boolhg:readGamma w = some (k, suffix)hk:k ≠ 0hw:w = encodeGamma k ++ suffixp:ℕ × List Boolhx:readFixed (k - 1) suffix = some p⊢ some p = none
simp only [readNat, hg, Option.bind_some, hx, reduceCtorEq] at h some 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
have hlt := readFixed_none_lt (k - 1) suffix hf some 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
have hk1 : k ≠ 1 := by omega some 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
rw [hw, some 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) (encodeGamma k ++ suffix)).fst ≠ Mode.done List.foldl_append, some 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 (List.foldl step (Mode.zeros 0, n) (encodeGamma k)) suffix).fst ≠ Mode.done foldl_gamma k hk n, some 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 (if k = 1 then finish n else (Mode.length (k - 1) 1, n)) suffix).fst ≠ Mode.done ite_eq_right hk1 some 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] some 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
have he := foldl_short_field false suffix (k - 1) 1 n hlt some 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
simp only [Bool.false_eq_true, ↓reduceIte] at he some 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
rw [he some 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] some 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
intro hh some 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.done⊢ False
cases hh All goals completed! 🐙end Geb.BitTree.Elias.Scanner