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.Machine public import Mathlib.Logic.Function.Basic
set_option doc.verso true

Configurations at delta-decoder phase boundaries

The binary fields are finite words with fixed marked origins. During cleanup a field is truncated at the head position; this gives an explicit description of every intermediate configuration, including when the shorter field has already been erased.

Main definitions

  • prefixTape restricts a binary field to a most-significant prefix.

  • clearingCfg describes the simultaneous erasure of two binary fields.

  • clearedCfg describes the state after both fields are erased.

Tags

Elias delta code, Turing machine, configuration

@[expose] public sectionnamespace Geb.BitTree.Elias.Machineopen Turing MultiTapeTM

Reading a split binary word selects its displayed middle digit.

theorem wordTape_split (lower higher : List Bool) (b : Bool) : wordTape (lower ++ b :: higher) (higher.length + 1 : ) = some (boolEmb b) := lower:List Boolhigher:List Boolb:BoolwordTape (lower ++ b :: higher) (higher.length + 1) = some (boolEmb b) lower:List Boolhigher:List Boolb:BoolOption.map (⇑boolEmb) (higher.reverse ++ ([b] ++ lower.reverse))[higher.length]? = some (boolEmb b) lower:List Boolhigher:List Boolb:BoolOption.map (⇑boolEmb) ([b] ++ lower.reverse)[higher.length - higher.reverse.length]? = some (boolEmb b) lower:List Boolhigher:List Boolb:BoolOption.map (⇑boolEmb) ([b] ++ lower.reverse)[0]? = some (boolEmb b) All goals completed! 🐙

Updating an existing most-significant-first digit updates precisely its tape cell.

theorem wordTape_update (xs : List Bool) (p : ) (b : Bool) (hp : p < xs.length) : Function.update (wordTape xs.reverse) (p + 1 : ) (some (boolEmb b)) = wordTape (xs.set p b).reverse := xs:List Boolp:b:Boolhp:p < xs.lengthFunction.update (wordTape xs.reverse) (↑(p + 1)) (some (boolEmb b)) = wordTape (xs.set p b).reverse xs:List Boolp:b:Boolhp:p < xs.lengthz:Function.update (wordTape xs.reverse) (↑(p + 1)) (some (boolEmb b)) z = wordTape (xs.set p b).reverse z xs:List Boolp:b:Boolhp:p < xs.lengthz:he:z = (p + 1)Function.update (wordTape xs.reverse) (↑(p + 1)) (some (boolEmb b)) z = wordTape (xs.set p b).reverse zxs:List Boolp:b:Boolhp:p < xs.lengthz:he:¬z = (p + 1)Function.update (wordTape xs.reverse) (↑(p + 1)) (some (boolEmb b)) z = wordTape (xs.set p b).reverse z xs:List Boolp:b:Boolhp:p < xs.lengthz:he:z = (p + 1)Function.update (wordTape xs.reverse) (↑(p + 1)) (some (boolEmb b)) z = wordTape (xs.set p b).reverse z xs:List Boolp:b:Boolhp:p < xs.lengthFunction.update (wordTape xs.reverse) (↑(p + 1)) (some (boolEmb b)) (p + 1) = wordTape (xs.set p b).reverse (p + 1) xs:List Boolp:b:Boolhp:p < xs.lengthsome (boolEmb b) = Option.map (⇑boolEmb) (some b) All goals completed! 🐙 xs:List Boolp:b:Boolhp:p < xs.lengthz:he:¬z = (p + 1)Function.update (wordTape xs.reverse) (↑(p + 1)) (some (boolEmb b)) z = wordTape (xs.set p b).reverse z xs:List Boolp:b:Boolhp:p < xs.lengthz:he:¬z = (p + 1)wordTape xs.reverse z = wordTape (xs.set p b).reverse z xs:List Boolp:b:Boolhp:p < xs.lengthz:he:¬z = (p + 1)(if z = 0 then some 2 else if 0 < z then Option.map (⇑boolEmb) xs.reverse.reverse[z.toNat - 1]? else none) = if z = 0 then some 2 else if 0 < z then Option.map (⇑boolEmb) (xs.set p b).reverse.reverse[z.toNat - 1]? else none xs:List Boolp:b:Boolhp:p < xs.lengthz:he:¬z = (p + 1)hz:z = 0(if z = 0 then some 2 else if 0 < z then Option.map (⇑boolEmb) xs.reverse.reverse[z.toNat - 1]? else none) = if z = 0 then some 2 else if 0 < z then Option.map (⇑boolEmb) (xs.set p b).reverse.reverse[z.toNat - 1]? else nonexs:List Boolp:b:Boolhp:p < xs.lengthz:he:¬z = (p + 1)hz:¬z = 0(if z = 0 then some 2 else if 0 < z then Option.map (⇑boolEmb) xs.reverse.reverse[z.toNat - 1]? else none) = if z = 0 then some 2 else if 0 < z then Option.map (⇑boolEmb) (xs.set p b).reverse.reverse[z.toNat - 1]? else none xs:List Boolp:b:Boolhp:p < xs.lengthz:he:¬z = (p + 1)hz:z = 0(if z = 0 then some 2 else if 0 < z then Option.map (⇑boolEmb) xs.reverse.reverse[z.toNat - 1]? else none) = if z = 0 then some 2 else if 0 < z then Option.map (⇑boolEmb) (xs.set p b).reverse.reverse[z.toNat - 1]? else none All goals completed! 🐙 xs:List Boolp:b:Boolhp:p < xs.lengthz:he:¬z = (p + 1)hz:¬z = 0(if z = 0 then some 2 else if 0 < z then Option.map (⇑boolEmb) xs.reverse.reverse[z.toNat - 1]? else none) = if z = 0 then some 2 else if 0 < z then Option.map (⇑boolEmb) (xs.set p b).reverse.reverse[z.toNat - 1]? else none xs:List Boolp:b:Boolhp:p < xs.lengthz:he:¬z = (p + 1)hz:¬z = 0(if 0 < z then Option.map (⇑boolEmb) xs.reverse.reverse[z.toNat - 1]? else none) = if 0 < z then Option.map (⇑boolEmb) (xs.set p b).reverse.reverse[z.toNat - 1]? else none xs:List Boolp:b:Boolhp:p < xs.lengthz:he:¬z = (p + 1)hz:¬z = 0hzpos:0 < z(if 0 < z then Option.map (⇑boolEmb) xs.reverse.reverse[z.toNat - 1]? else none) = if 0 < z then Option.map (⇑boolEmb) (xs.set p b).reverse.reverse[z.toNat - 1]? else nonexs:List Boolp:b:Boolhp:p < xs.lengthz:he:¬z = (p + 1)hz:¬z = 0hzpos:¬0 < z(if 0 < z then Option.map (⇑boolEmb) xs.reverse.reverse[z.toNat - 1]? else none) = if 0 < z then Option.map (⇑boolEmb) (xs.set p b).reverse.reverse[z.toNat - 1]? else none xs:List Boolp:b:Boolhp:p < xs.lengthz:he:¬z = (p + 1)hz:¬z = 0hzpos:0 < z(if 0 < z then Option.map (⇑boolEmb) xs.reverse.reverse[z.toNat - 1]? else none) = if 0 < z then Option.map (⇑boolEmb) (xs.set p b).reverse.reverse[z.toNat - 1]? else none All goals completed! 🐙 xs:List Boolp:b:Boolhp:p < xs.lengthz:he:¬z = (p + 1)hz:¬z = 0hzpos:¬0 < z(if 0 < z then Option.map (⇑boolEmb) xs.reverse.reverse[z.toNat - 1]? else none) = if 0 < z then Option.map (⇑boolEmb) (xs.set p b).reverse.reverse[z.toNat - 1]? else none All goals completed! 🐙

Changing the middle digit of a split word writes its one corresponding tape cell.

theorem wordTape_update_split (lower higher : List Bool) (b b' : Bool) : Function.update (wordTape (lower ++ b :: higher)) (higher.length + 1 : ) (some (boolEmb b')) = wordTape (lower ++ b' :: higher) := lower:List Boolhigher:List Boolb:Boolb':BoolFunction.update (wordTape (lower ++ b :: higher)) (↑(higher.length + 1)) (some (boolEmb b')) = wordTape (lower ++ b' :: higher) lower:List Boolhigher:List Boolb:Boolb':Boolh:Function.update (wordTape (higher.reverse ++ b :: lower.reverse).reverse) (↑(higher.length + 1)) (some (boolEmb b')) = wordTape ((higher.reverse ++ b :: lower.reverse).set higher.length b').reverseFunction.update (wordTape (lower ++ b :: higher)) (↑(higher.length + 1)) (some (boolEmb b')) = wordTape (lower ++ b' :: higher) lower:List Boolhigher:List Boolb:Boolb':Boolh:Function.update (wordTape (higher.reverse ++ b :: lower.reverse).reverse) (↑(higher.length + 1)) (some (boolEmb b')) = wordTape (higher.reverse ++ b' :: lower.reverse).reverseFunction.update (wordTape (lower ++ b :: higher)) (↑(higher.length + 1)) (some (boolEmb b')) = wordTape (lower ++ b' :: higher) All goals completed! 🐙

Appending an input digit writes the blank immediately after the stored field.

theorem wordTape_cons (bs : List Bool) (b : Bool) : Function.update (wordTape bs) (bs.length + 1 : ) (some (boolEmb b)) = wordTape (b :: bs) := bs:List Boolb:BoolFunction.update (wordTape bs) (↑(bs.length + 1)) (some (boolEmb b)) = wordTape (b :: bs) bs:List Boolb:Boolz:Function.update (wordTape bs) (↑(bs.length + 1)) (some (boolEmb b)) z = wordTape (b :: bs) z bs:List Boolb:Boolz:he:z = (bs.length + 1)Function.update (wordTape bs) (↑(bs.length + 1)) (some (boolEmb b)) z = wordTape (b :: bs) zbs:List Boolb:Boolz:he:¬z = (bs.length + 1)Function.update (wordTape bs) (↑(bs.length + 1)) (some (boolEmb b)) z = wordTape (b :: bs) z bs:List Boolb:Boolz:he:z = (bs.length + 1)Function.update (wordTape bs) (↑(bs.length + 1)) (some (boolEmb b)) z = wordTape (b :: bs) z bs:List Boolb:BoolFunction.update (wordTape bs) (↑(bs.length + 1)) (some (boolEmb b)) (bs.length + 1) = wordTape (b :: bs) (bs.length + 1) bs:List Boolb:Boolsome (boolEmb b) = Option.map boolEmb [b][0]? All goals completed! 🐙 bs:List Boolb:Boolz:he:¬z = (bs.length + 1)Function.update (wordTape bs) (↑(bs.length + 1)) (some (boolEmb b)) z = wordTape (b :: bs) z bs:List Boolb:Boolz:he:¬z = (bs.length + 1)wordTape bs z = wordTape (b :: bs) z bs:List Boolb:Boolz:he:¬z = (bs.length + 1)(if z = 0 then some 2 else if 0 < z then Option.map (⇑boolEmb) bs.reverse[z.toNat - 1]? else none) = if z = 0 then some 2 else if 0 < z then Option.map (⇑boolEmb) (b :: bs).reverse[z.toNat - 1]? else none bs:List Boolb:Boolz:he:¬z = (bs.length + 1)hz:z = 0(if z = 0 then some 2 else if 0 < z then Option.map (⇑boolEmb) bs.reverse[z.toNat - 1]? else none) = if z = 0 then some 2 else if 0 < z then Option.map (⇑boolEmb) (b :: bs).reverse[z.toNat - 1]? else nonebs:List Boolb:Boolz:he:¬z = (bs.length + 1)hz:¬z = 0(if z = 0 then some 2 else if 0 < z then Option.map (⇑boolEmb) bs.reverse[z.toNat - 1]? else none) = if z = 0 then some 2 else if 0 < z then Option.map (⇑boolEmb) (b :: bs).reverse[z.toNat - 1]? else none bs:List Boolb:Boolz:he:¬z = (bs.length + 1)hz:z = 0(if z = 0 then some 2 else if 0 < z then Option.map (⇑boolEmb) bs.reverse[z.toNat - 1]? else none) = if z = 0 then some 2 else if 0 < z then Option.map (⇑boolEmb) (b :: bs).reverse[z.toNat - 1]? else none All goals completed! 🐙 bs:List Boolb:Boolz:he:¬z = (bs.length + 1)hz:¬z = 0(if z = 0 then some 2 else if 0 < z then Option.map (⇑boolEmb) bs.reverse[z.toNat - 1]? else none) = if z = 0 then some 2 else if 0 < z then Option.map (⇑boolEmb) (b :: bs).reverse[z.toNat - 1]? else none bs:List Boolb:Boolz:he:¬z = (bs.length + 1)hz:¬z = 0(if 0 < z then Option.map (⇑boolEmb) bs.reverse[z.toNat - 1]? else none) = if 0 < z then Option.map (⇑boolEmb) (b :: bs).reverse[z.toNat - 1]? else none bs:List Boolb:Boolz:he:¬z = (bs.length + 1)hz:¬z = 0hzpos:0 < z(if 0 < z then Option.map (⇑boolEmb) bs.reverse[z.toNat - 1]? else none) = if 0 < z then Option.map (⇑boolEmb) (b :: bs).reverse[z.toNat - 1]? else nonebs:List Boolb:Boolz:he:¬z = (bs.length + 1)hz:¬z = 0hzpos:¬0 < z(if 0 < z then Option.map (⇑boolEmb) bs.reverse[z.toNat - 1]? else none) = if 0 < z then Option.map (⇑boolEmb) (b :: bs).reverse[z.toNat - 1]? else none bs:List Boolb:Boolz:he:¬z = (bs.length + 1)hz:¬z = 0hzpos:0 < z(if 0 < z then Option.map (⇑boolEmb) bs.reverse[z.toNat - 1]? else none) = if 0 < z then Option.map (⇑boolEmb) (b :: bs).reverse[z.toNat - 1]? else none bs:List Boolb:Boolz:he:¬z = (bs.length + 1)hz:¬z = 0hzpos:0 < zOption.map (⇑boolEmb) bs.reverse[z.toNat - 1]? = Option.map (⇑boolEmb) (bs.reverse ++ [b])[z.toNat - 1]? bs:List Boolb:Boolz:he:¬z = (bs.length + 1)hz:¬z = 0hzpos:0 < zhj:z.toNat - 1 < bs.lengthOption.map (⇑boolEmb) bs.reverse[z.toNat - 1]? = Option.map (⇑boolEmb) (bs.reverse ++ [b])[z.toNat - 1]?bs:List Boolb:Boolz:he:¬z = (bs.length + 1)hz:¬z = 0hzpos:0 < zhj:¬z.toNat - 1 < bs.lengthOption.map (⇑boolEmb) bs.reverse[z.toNat - 1]? = Option.map (⇑boolEmb) (bs.reverse ++ [b])[z.toNat - 1]? bs:List Boolb:Boolz:he:¬z = (bs.length + 1)hz:¬z = 0hzpos:0 < zhj:z.toNat - 1 < bs.lengthOption.map (⇑boolEmb) bs.reverse[z.toNat - 1]? = Option.map (⇑boolEmb) (bs.reverse ++ [b])[z.toNat - 1]? All goals completed! 🐙 bs:List Boolb:Boolz:he:¬z = (bs.length + 1)hz:¬z = 0hzpos:0 < zhj:¬z.toNat - 1 < bs.lengthOption.map (⇑boolEmb) bs.reverse[z.toNat - 1]? = Option.map (⇑boolEmb) (bs.reverse ++ [b])[z.toNat - 1]? bs:List Boolb:Boolz:he:¬z = (bs.length + 1)hz:¬z = 0hzpos:0 < zhj:¬z.toNat - 1 < bs.lengthhne:z.toNat - 1 bs.lengthOption.map (⇑boolEmb) bs.reverse[z.toNat - 1]? = Option.map (⇑boolEmb) (bs.reverse ++ [b])[z.toNat - 1]? All goals completed! 🐙 bs:List Boolb:Boolz:he:¬z = (bs.length + 1)hz:¬z = 0hzpos:¬0 < z(if 0 < z then Option.map (⇑boolEmb) bs.reverse[z.toNat - 1]? else none) = if 0 < z then Option.map (⇑boolEmb) (b :: bs).reverse[z.toNat - 1]? else none All goals completed! 🐙

A marked tape containing at most the first p most-significant digits.

def prefixTape (bs : List Bool) (p : ) : Option (Fin 3) := wordTape ((bs.reverse.take p).reverse)

A prefix tape always retains its origin marker.

theorem prefixTape_zero (bs : List Bool) (p : ) : prefixTape bs p 0 = some 2 := rfl

Removing all digits leaves only the origin marker.

theorem prefixTape_empty (bs : List Bool) : prefixTape bs 0 = wordTape [] := rfl

Keeping at least the full width retains every digit.

theorem prefixTape_full (bs : List Bool) {p : } (h : bs.length p) : prefixTape bs p = wordTape bs := bs:List Boolp:h:bs.length pprefixTape bs p = wordTape bs bs:List Boolp:h:bs.length pwordTape (List.take p bs.reverse).reverse = wordTape bs All goals completed! 🐙

The cell erased at a positive position is never an origin marker.

theorem prefixTape_succ_ne_marker (bs : List Bool) (p : ) : prefixTape bs (p + 1) (p + 1 : ) some 2 := bs:List Boolp:prefixTape bs (p + 1) (p + 1) some 2 bs:List Boolp:wordTape (List.take (p + 1) bs.reverse).reverse (p + 1) some 2 bs:List Boolp:Option.map (⇑boolEmb) (List.take (p + 1) bs.reverse)[p]? some 2 cases (bs.reverse.take (p + 1))[p]? with bs:List Boolp:Option.map (⇑boolEmb) none some 2 exact (bs:List Boolp:Option.map (⇑boolEmb) none some 2 All goals completed! 🐙) bs:List Boolp:b:BoolOption.map (⇑boolEmb) (some b) some 2 bs:List Boolp:Option.map (⇑boolEmb) (some false) some 2bs:List Boolp:Option.map (⇑boolEmb) (some true) some 2 bs:List Boolp:Option.map (⇑boolEmb) (some false) some 2bs:List Boolp:Option.map (⇑boolEmb) (some true) some 2 exact (bs:List Boolp:Option.map (⇑boolEmb) (some true) some 2 All goals completed! 🐙)

The current cell is an origin marker exactly when the head position is zero.

theorem prefixTape_marker (bs : List Bool) (p : ) : (prefixTape bs p (p : ) == some 2) = decide (p = 0) := bs:List Boolp:(prefixTape bs p p == some 2) = decide (p = 0) cases p with bs:List Bool(prefixTape bs 0 0 == some 2) = decide (0 = 0) All goals completed! 🐙 bs:List Boolp:(prefixTape bs (p + 1) (p + 1) == some 2) = decide (p + 1 = 0) bs:List Boolp:(prefixTape bs (p + 1) (p + 1) == some 2) = false bs:List Boolp:(wordTape (List.take (p + 1) bs.reverse).reverse (p + 1) == some 2) = false bs:List Boolp:(Option.map (⇑boolEmb) (List.take (p + 1) bs.reverse)[p]? == some 2) = false cases (bs.reverse.take (p + 1))[p]? with bs:List Boolp:(Option.map (⇑boolEmb) none == some 2) = false All goals completed! 🐙 bs:List Boolp:b:Bool(Option.map (⇑boolEmb) (some b) == some 2) = false bs:List Boolp:(Option.map (⇑boolEmb) (some false) == some 2) = falsebs:List Boolp:(Option.map (⇑boolEmb) (some true) == some 2) = false bs:List Boolp:(Option.map (⇑boolEmb) (some false) == some 2) = falsebs:List Boolp:(Option.map (⇑boolEmb) (some true) == some 2) = false All goals completed! 🐙

Erasing the current positive cell shortens a prefix tape by one position.

theorem prefixTape_erase (bs : List Bool) (p : ) : Function.update (prefixTape bs (p + 1)) (p + 1 : ) none = prefixTape bs p := bs:List Boolp:Function.update (prefixTape bs (p + 1)) (↑(p + 1)) none = prefixTape bs p bs:List Boolp:z:Function.update (prefixTape bs (p + 1)) (↑(p + 1)) none z = prefixTape bs p z bs:List Boolp:z:he:z = (p + 1)Function.update (prefixTape bs (p + 1)) (↑(p + 1)) none z = prefixTape bs p zbs:List Boolp:z:he:¬z = (p + 1)Function.update (prefixTape bs (p + 1)) (↑(p + 1)) none z = prefixTape bs p z bs:List Boolp:z:he:z = (p + 1)Function.update (prefixTape bs (p + 1)) (↑(p + 1)) none z = prefixTape bs p z bs:List Boolp:Function.update (prefixTape bs (p + 1)) (↑(p + 1)) none (p + 1) = prefixTape bs p (p + 1) bs:List Boolp:none = prefixTape bs p (p + 1) bs:List Boolp:none = wordTape (List.take p bs.reverse).reverse (p + 1) bs:List Boolp:none = Option.map (⇑boolEmb) none All goals completed! 🐙 bs:List Boolp:z:he:¬z = (p + 1)Function.update (prefixTape bs (p + 1)) (↑(p + 1)) none z = prefixTape bs p z bs:List Boolp:z:he:¬z = (p + 1)prefixTape bs (p + 1) z = prefixTape bs p z bs:List Boolp:z:he:¬z = (p + 1)(if z = 0 then some 2 else if 0 < z then Option.map (⇑boolEmb) (List.take (p + 1) bs.reverse).reverse.reverse[z.toNat - 1]? else none) = if z = 0 then some 2 else if 0 < z then Option.map (⇑boolEmb) (List.take p bs.reverse).reverse.reverse[z.toNat - 1]? else none bs:List Boolp:z:he:¬z = (p + 1)hz:z = 0(if z = 0 then some 2 else if 0 < z then Option.map (⇑boolEmb) (List.take (p + 1) bs.reverse).reverse.reverse[z.toNat - 1]? else none) = if z = 0 then some 2 else if 0 < z then Option.map (⇑boolEmb) (List.take p bs.reverse).reverse.reverse[z.toNat - 1]? else nonebs:List Boolp:z:he:¬z = (p + 1)hz:¬z = 0(if z = 0 then some 2 else if 0 < z then Option.map (⇑boolEmb) (List.take (p + 1) bs.reverse).reverse.reverse[z.toNat - 1]? else none) = if z = 0 then some 2 else if 0 < z then Option.map (⇑boolEmb) (List.take p bs.reverse).reverse.reverse[z.toNat - 1]? else none bs:List Boolp:z:he:¬z = (p + 1)hz:z = 0(if z = 0 then some 2 else if 0 < z then Option.map (⇑boolEmb) (List.take (p + 1) bs.reverse).reverse.reverse[z.toNat - 1]? else none) = if z = 0 then some 2 else if 0 < z then Option.map (⇑boolEmb) (List.take p bs.reverse).reverse.reverse[z.toNat - 1]? else none All goals completed! 🐙 bs:List Boolp:z:he:¬z = (p + 1)hz:¬z = 0(if z = 0 then some 2 else if 0 < z then Option.map (⇑boolEmb) (List.take (p + 1) bs.reverse).reverse.reverse[z.toNat - 1]? else none) = if z = 0 then some 2 else if 0 < z then Option.map (⇑boolEmb) (List.take p bs.reverse).reverse.reverse[z.toNat - 1]? else none bs:List Boolp:z:he:¬z = (p + 1)hz:¬z = 0(if 0 < z then Option.map (⇑boolEmb) (List.take (p + 1) bs.reverse).reverse.reverse[z.toNat - 1]? else none) = if 0 < z then Option.map (⇑boolEmb) (List.take p bs.reverse).reverse.reverse[z.toNat - 1]? else none bs:List Boolp:z:he:¬z = (p + 1)hz:¬z = 0hp:0 < z(if 0 < z then Option.map (⇑boolEmb) (List.take (p + 1) bs.reverse).reverse.reverse[z.toNat - 1]? else none) = if 0 < z then Option.map (⇑boolEmb) (List.take p bs.reverse).reverse.reverse[z.toNat - 1]? else nonebs:List Boolp:z:he:¬z = (p + 1)hz:¬z = 0hp:¬0 < z(if 0 < z then Option.map (⇑boolEmb) (List.take (p + 1) bs.reverse).reverse.reverse[z.toNat - 1]? else none) = if 0 < z then Option.map (⇑boolEmb) (List.take p bs.reverse).reverse.reverse[z.toNat - 1]? else none bs:List Boolp:z:he:¬z = (p + 1)hz:¬z = 0hp:0 < z(if 0 < z then Option.map (⇑boolEmb) (List.take (p + 1) bs.reverse).reverse.reverse[z.toNat - 1]? else none) = if 0 < z then Option.map (⇑boolEmb) (List.take p bs.reverse).reverse.reverse[z.toNat - 1]? else none bs:List Boolp:z:he:¬z = (p + 1)hz:¬z = 0hp:0 < zOption.map (⇑boolEmb) (if z.toNat - 1 < p + 1 then bs.reverse[z.toNat - 1]? else none) = Option.map (⇑boolEmb) (if z.toNat - 1 < p then bs.reverse[z.toNat - 1]? else none) bs:List Boolp:z:he:¬z = (p + 1)hz:¬z = 0hp:0 < zhn:z.toNat - 1 pOption.map (⇑boolEmb) (if z.toNat - 1 < p + 1 then bs.reverse[z.toNat - 1]? else none) = Option.map (⇑boolEmb) (if z.toNat - 1 < p then bs.reverse[z.toNat - 1]? else none) bs:List Boolp:z:he:¬z = (p + 1)hz:¬z = 0hp:0 < zhn:z.toNat - 1 phj:z.toNat - 1 < pOption.map (⇑boolEmb) (if z.toNat - 1 < p + 1 then bs.reverse[z.toNat - 1]? else none) = Option.map (⇑boolEmb) (if z.toNat - 1 < p then bs.reverse[z.toNat - 1]? else none)bs:List Boolp:z:he:¬z = (p + 1)hz:¬z = 0hp:0 < zhn:z.toNat - 1 phj:¬z.toNat - 1 < pOption.map (⇑boolEmb) (if z.toNat - 1 < p + 1 then bs.reverse[z.toNat - 1]? else none) = Option.map (⇑boolEmb) (if z.toNat - 1 < p then bs.reverse[z.toNat - 1]? else none) bs:List Boolp:z:he:¬z = (p + 1)hz:¬z = 0hp:0 < zhn:z.toNat - 1 phj:z.toNat - 1 < pOption.map (⇑boolEmb) (if z.toNat - 1 < p + 1 then bs.reverse[z.toNat - 1]? else none) = Option.map (⇑boolEmb) (if z.toNat - 1 < p then bs.reverse[z.toNat - 1]? else none) All goals completed! 🐙 bs:List Boolp:z:he:¬z = (p + 1)hz:¬z = 0hp:0 < zhn:z.toNat - 1 phj:¬z.toNat - 1 < pOption.map (⇑boolEmb) (if z.toNat - 1 < p + 1 then bs.reverse[z.toNat - 1]? else none) = Option.map (⇑boolEmb) (if z.toNat - 1 < p then bs.reverse[z.toNat - 1]? else none) All goals completed! 🐙 bs:List Boolp:z:he:¬z = (p + 1)hz:¬z = 0hp:¬0 < z(if 0 < z then Option.map (⇑boolEmb) (List.take (p + 1) bs.reverse).reverse.reverse[z.toNat - 1]? else none) = if 0 < z then Option.map (⇑boolEmb) (List.take p bs.reverse).reverse.reverse[z.toNat - 1]? else none All goals completed! 🐙

The binary fields after each has erased down to its current head position.

def clearingCfg {input : List (Fin 3)} (cfg : Cfg 4 (Fin 3) Control input) (bs cs : List Bool) (p r : ) : Cfg 4 (Fin 3) Control input where state := some stClear inputPos := cfg.inputPos workTapes i := if i = 2 then prefixTape bs p else if i = 3 then prefixTape cs r else cfg.workTapes i workTapePos i := if i = 2 then p else if i = 3 then r else cfg.workTapePos i

Erasure finishes with both heads ready to append a fresh binary field.

def clearedCfg {input : List (Fin 3)} (cfg : Cfg 4 (Fin 3) Control input) : Cfg 4 (Fin 3) Control input where state := some stLeaf inputPos := cfg.inputPos workTapes i := if i = 2 i = 3 then wordTape [] else cfg.workTapes i workTapePos i := if i = 0 then cfg.workTapePos 0 - 1 else if i = 1 then cfg.workTapePos 1 else 1

Completing a leaf selects the next constructor or the end-of-tree state.

def completedCfg {input : List (Fin 3)} (cfg : Cfg 4 (Fin 3) Control input) : Cfg 4 (Fin 3) Control input := { clearedCfg cfg with state := some (if cfg.workTapes 0 (cfg.workTapePos 0 - 1) == some 2 then stDone else stTree) }

Replacing a counter configuration preserves a bound containing its selected head.

theorem headBound_counterCfg {input : List (Fin 3)} (cfg : Cfg 4 (Fin 3) Control input) (v : Bool) (bs : List Bool) (q : Control) (p width : ) (hcfg : HeadBound width cfg) (hp : p width) : HeadBound width (counterCfg cfg v bs q p) := input:List (Fin 3)cfg:Cfg 4 (Fin 3) Control inputv:Boolbs:List Boolq:Controlp:width:hcfg:HeadBound width cfghp:p widthHeadBound width (counterCfg cfg v bs q p) input:List (Fin 3)cfg:Cfg 4 (Fin 3) Control inputv:Boolbs:List Boolq:Controlp:width:hcfg:HeadBound width cfghp:p widthi:Fin 40 (counterCfg cfg v bs q p).workTapePos i (counterCfg cfg v bs q p).workTapePos i width input:List (Fin 3)cfg:Cfg 4 (Fin 3) Control inputv:Boolbs:List Boolq:Controlp:width:hcfg:HeadBound width cfghp:p widthi:Fin 4hi:i = counterTape v0 (counterCfg cfg v bs q p).workTapePos i (counterCfg cfg v bs q p).workTapePos i widthinput:List (Fin 3)cfg:Cfg 4 (Fin 3) Control inputv:Boolbs:List Boolq:Controlp:width:hcfg:HeadBound width cfghp:p widthi:Fin 4hi:¬i = counterTape v0 (counterCfg cfg v bs q p).workTapePos i (counterCfg cfg v bs q p).workTapePos i width input:List (Fin 3)cfg:Cfg 4 (Fin 3) Control inputv:Boolbs:List Boolq:Controlp:width:hcfg:HeadBound width cfghp:p widthi:Fin 4hi:i = counterTape v0 (counterCfg cfg v bs q p).workTapePos i (counterCfg cfg v bs q p).workTapePos i width input:List (Fin 3)cfg:Cfg 4 (Fin 3) Control inputv:Boolbs:List Boolq:Controlp:width:hcfg:HeadBound width cfghp:p widthi:Fin 4hi:i = counterTape v0 p p width exact input:List (Fin 3)cfg:Cfg 4 (Fin 3) Control inputv:Boolbs:List Boolq:Controlp:width:hcfg:HeadBound width cfghp:p widthi:Fin 4hi:i = counterTape v0 p All goals completed! 🐙, input:List (Fin 3)cfg:Cfg 4 (Fin 3) Control inputv:Boolbs:List Boolq:Controlp:width:hcfg:HeadBound width cfghp:p widthi:Fin 4hi:i = counterTape vp width All goals completed! 🐙 input:List (Fin 3)cfg:Cfg 4 (Fin 3) Control inputv:Boolbs:List Boolq:Controlp:width:hcfg:HeadBound width cfghp:p widthi:Fin 4hi:¬i = counterTape v0 (counterCfg cfg v bs q p).workTapePos i (counterCfg cfg v bs q p).workTapePos i width All goals completed! 🐙
end Geb.BitTree.Elias.Machine