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.BinaryMachine.Machine public import Geb.Prototypes.Computability.TreeScanner.Steps
set_option doc.verso true

Input transitions of the binary-counter recognizer

Reading a bit advances the input head and selects the next scan mode or a counter-increment phase. The work tapes are unchanged during this transition.

Main statements

  • step_read realizes one input transition without changing work tapes.

  • step_end and outputSymbol_end describe the final emitting transition.

  • headBound_add combines bounds on consecutive execution segments.

Tags

Turing machine, simulation, binary tree, binary counter

@[expose] public sectionnamespace Geb.BitTree.BinaryMachineopen Turing MultiTapeTMopen Geb.TreeScanner (step_of_state)

An input transition has the closed form given by consumeCfg.

theorem step_read {input : List (Fin 4)} (cfg : Cfg 3 (Fin 4) (Fin 10) input) (m : Mode) (b : Bool) (hq : cfg.state = some (modeState m)) (hi : cfg.inputSymbol = some (boolEmb b)) : machine.step cfg = consumeCfg cfg (postReadState m b) := input:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputm:Modeb:Boolhq:cfg.state = some (modeState m)hi:cfg.inputSymbol = some (boolEmb b)MultiTapeTM.step cfg = consumeCfg cfg (postReadState m b) input:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputm:Modeb:Boolhq:cfg.state = some (modeState m)hi:cfg.inputSymbol = some (boolEmb b){ state := (consume (postReadState m b)).q', inputPos := moveInputPos cfg.inputPos (consume (postReadState m b)).inputMove, workTapes := fun i match (motive := Option (Option (Fin 4)) Option (Fin 4)) ((consume (postReadState m b)).workActions i).1 with | none => cfg.workTapes i | some s => Function.update (cfg.workTapes i) (cfg.workTapePos i) s, workTapePos := fun i cfg.workTapePos i + ((consume (postReadState m b)).workActions i).2 } = consumeCfg cfg (postReadState m b) input:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputm:Modeb:Boolhq:cfg.state = some (modeState m)hi:cfg.inputSymbol = some (boolEmb b){ state := (consume (postReadState m b)).q', inputPos := moveInputPos cfg.inputPos (consume (postReadState m b)).inputMove, workTapes := fun i match (motive := Option (Option (Fin 4)) Option (Fin 4)) ((consume (postReadState m b)).workActions i).1 with | none => cfg.workTapes i | some s => Function.update (cfg.workTapes i) (cfg.workTapePos i) s, workTapePos := fun i cfg.workTapePos i + ((consume (postReadState m b)).workActions i).2 }.state = (consumeCfg cfg (postReadState m b)).stateinput:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputm:Modeb:Boolhq:cfg.state = some (modeState m)hi:cfg.inputSymbol = some (boolEmb b){ state := (consume (postReadState m b)).q', inputPos := moveInputPos cfg.inputPos (consume (postReadState m b)).inputMove, workTapes := fun i match (motive := Option (Option (Fin 4)) Option (Fin 4)) ((consume (postReadState m b)).workActions i).1 with | none => cfg.workTapes i | some s => Function.update (cfg.workTapes i) (cfg.workTapePos i) s, workTapePos := fun i cfg.workTapePos i + ((consume (postReadState m b)).workActions i).2 }.inputPos = (consumeCfg cfg (postReadState m b)).inputPosinput:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputm:Modeb:Boolhq:cfg.state = some (modeState m)hi:cfg.inputSymbol = some (boolEmb b){ state := (consume (postReadState m b)).q', inputPos := moveInputPos cfg.inputPos (consume (postReadState m b)).inputMove, workTapes := fun i match (motive := Option (Option (Fin 4)) Option (Fin 4)) ((consume (postReadState m b)).workActions i).1 with | none => cfg.workTapes i | some s => Function.update (cfg.workTapes i) (cfg.workTapePos i) s, workTapePos := fun i cfg.workTapePos i + ((consume (postReadState m b)).workActions i).2 }.workTapes = (consumeCfg cfg (postReadState m b)).workTapesinput:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputm:Modeb:Boolhq:cfg.state = some (modeState m)hi:cfg.inputSymbol = some (boolEmb b){ state := (consume (postReadState m b)).q', inputPos := moveInputPos cfg.inputPos (consume (postReadState m b)).inputMove, workTapes := fun i match (motive := Option (Option (Fin 4)) Option (Fin 4)) ((consume (postReadState m b)).workActions i).1 with | none => cfg.workTapes i | some s => Function.update (cfg.workTapes i) (cfg.workTapePos i) s, workTapePos := fun i cfg.workTapePos i + ((consume (postReadState m b)).workActions i).2 }.workTapePos = (consumeCfg cfg (postReadState m b)).workTapePos input:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputm:Modeb:Boolhq:cfg.state = some (modeState m)hi:cfg.inputSymbol = some (boolEmb b){ state := (consume (postReadState m b)).q', inputPos := moveInputPos cfg.inputPos (consume (postReadState m b)).inputMove, workTapes := fun i match (motive := Option (Option (Fin 4)) Option (Fin 4)) ((consume (postReadState m b)).workActions i).1 with | none => cfg.workTapes i | some s => Function.update (cfg.workTapes i) (cfg.workTapePos i) s, workTapePos := fun i cfg.workTapePos i + ((consume (postReadState m b)).workActions i).2 }.state = (consumeCfg cfg (postReadState m b)).stateinput:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputm:Modeb:Boolhq:cfg.state = some (modeState m)hi:cfg.inputSymbol = some (boolEmb b){ state := (consume (postReadState m b)).q', inputPos := moveInputPos cfg.inputPos (consume (postReadState m b)).inputMove, workTapes := fun i match (motive := Option (Option (Fin 4)) Option (Fin 4)) ((consume (postReadState m b)).workActions i).1 with | none => cfg.workTapes i | some s => Function.update (cfg.workTapes i) (cfg.workTapePos i) s, workTapePos := fun i cfg.workTapePos i + ((consume (postReadState m b)).workActions i).2 }.inputPos = (consumeCfg cfg (postReadState m b)).inputPosinput:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputm:Modeb:Boolhq:cfg.state = some (modeState m)hi:cfg.inputSymbol = some (boolEmb b){ state := (consume (postReadState m b)).q', inputPos := moveInputPos cfg.inputPos (consume (postReadState m b)).inputMove, workTapes := fun i match (motive := Option (Option (Fin 4)) Option (Fin 4)) ((consume (postReadState m b)).workActions i).1 with | none => cfg.workTapes i | some s => Function.update (cfg.workTapes i) (cfg.workTapePos i) s, workTapePos := fun i cfg.workTapePos i + ((consume (postReadState m b)).workActions i).2 }.workTapes = (consumeCfg cfg (postReadState m b)).workTapesinput:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputm:Modeb:Boolhq:cfg.state = some (modeState m)hi:cfg.inputSymbol = some (boolEmb b){ state := (consume (postReadState m b)).q', inputPos := moveInputPos cfg.inputPos (consume (postReadState m b)).inputMove, workTapes := fun i match (motive := Option (Option (Fin 4)) Option (Fin 4)) ((consume (postReadState m b)).workActions i).1 with | none => cfg.workTapes i | some s => Function.update (cfg.workTapes i) (cfg.workTapePos i) s, workTapePos := fun i cfg.workTapePos i + ((consume (postReadState m b)).workActions i).2 }.workTapePos = (consumeCfg cfg (postReadState m b)).workTapePos All goals completed! 🐙

Input transitions emit nothing.

theorem outputSymbol_read {input : List (Fin 4)} (cfg : Cfg 3 (Fin 4) (Fin 10) input) (m : Mode) (b : Bool) (hq : cfg.state = some (modeState m)) (hi : cfg.inputSymbol = some (boolEmb b)) : machine.outputSymbol cfg = none := input:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputm:Modeb:Boolhq:cfg.state = some (modeState m)hi:cfg.inputSymbol = some (boolEmb b)outputSymbol cfg = none input:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputm:Modeb:Boolhq:cfg.state = some (modeState m)hi:cfg.inputSymbol = some (boolEmb b)(match cfg.state with | none => none | some q => (machine.tr q cfg.inputSymbol cfg.workTapeSymbols).outS) = none input:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputm:Modeb:Boolhq:cfg.state = some (modeState m)hi:cfg.inputSymbol = some (boolEmb b)(match some (modeState m) with | none => none | some q => (machine.tr q cfg.inputSymbol cfg.workTapeSymbols).outS) = none input:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputm:Modeb:Boolhq:cfg.state = some (modeState m)hi:cfg.inputSymbol = some (boolEmb b)(machine.tr (modeState m) cfg.inputSymbol cfg.workTapeSymbols).outS = none input:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputm:Modeb:Boolhq:cfg.state = some (modeState m)hi:cfg.inputSymbol = some (boolEmb b)(consume (postReadState m b)).outS = none All goals completed! 🐙

The symbol at an interior input position is its next bit.

theorem inputSymbol_at (w : List Bool) (t : ) (ht : t < w.length) (cfg : Cfg 3 (Fin 4) (Fin 10) (w.map boolEmb)) (hp : cfg.inputPos.val = t + 1) : cfg.inputSymbol = some (boolEmb w[t]) := w:List Boolt:ht:t < w.lengthcfg:Cfg 3 (Fin 4) (Fin 10) (List.map (⇑boolEmb) w)hp:cfg.inputPos = t + 1cfg.inputSymbol = some (boolEmb w[t]) All goals completed! 🐙

The input symbol at the right end marker is blank.

theorem inputSymbol_end {input : List (Fin 4)} (cfg : Cfg 3 (Fin 4) (Fin 10) input) (hp : cfg.inputPos.val = input.length + 1) : cfg.inputSymbol = none := input:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputhp:cfg.inputPos = input.length + 1cfg.inputSymbol = none input:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputhp:cfg.inputPos = input.length + 1(if h₁ : cfg.inputPos = 0 then none else if h₂ : cfg.inputPos = input.length + 1 then none else some input[cfg.inputPos - 1]) = none input:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputhp:cfg.inputPos = input.length + 1h✝:cfg.inputPos = 0none = noneinput:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputhp:cfg.inputPos = input.length + 1h✝:¬cfg.inputPos = 0none = none input:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputhp:cfg.inputPos = input.length + 1h✝:cfg.inputPos = 0none = noneinput:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputhp:cfg.inputPos = input.length + 1h✝:¬cfg.inputPos = 0none = none All goals completed! 🐙

At the right end marker only the finite control changes to the halting state.

theorem step_end {input : List (Fin 4)} (cfg : Cfg 3 (Fin 4) (Fin 10) input) (m : Mode) (hq : cfg.state = some (modeState m)) (hi : cfg.inputSymbol = none) : machine.step cfg = { cfg with state := none } := input:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputm:Modehq:cfg.state = some (modeState m)hi:cfg.inputSymbol = noneMultiTapeTM.step cfg = { state := none, inputPos := cfg.inputPos, workTapes := cfg.workTapes, workTapePos := cfg.workTapePos } input:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputm:Modehq:cfg.state = some (modeState m)hi:cfg.inputSymbol = none{ state := (finish (decide (m = Mode.done))).q', inputPos := moveInputPos cfg.inputPos (finish (decide (m = Mode.done))).inputMove, workTapes := fun i match (motive := Option (Option (Fin 4)) Option (Fin 4)) ((finish (decide (m = Mode.done))).workActions i).1 with | none => cfg.workTapes i | some s => Function.update (cfg.workTapes i) (cfg.workTapePos i) s, workTapePos := fun i cfg.workTapePos i + ((finish (decide (m = Mode.done))).workActions i).2 } = { state := none, inputPos := cfg.inputPos, workTapes := cfg.workTapes, workTapePos := cfg.workTapePos } input:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputm:Modehq:cfg.state = some (modeState m)hi:cfg.inputSymbol = none{ state := (finish (decide (m = Mode.done))).q', inputPos := moveInputPos cfg.inputPos (finish (decide (m = Mode.done))).inputMove, workTapes := fun i match (motive := Option (Option (Fin 4)) Option (Fin 4)) ((finish (decide (m = Mode.done))).workActions i).1 with | none => cfg.workTapes i | some s => Function.update (cfg.workTapes i) (cfg.workTapePos i) s, workTapePos := fun i cfg.workTapePos i + ((finish (decide (m = Mode.done))).workActions i).2 }.state = { state := none, inputPos := cfg.inputPos, workTapes := cfg.workTapes, workTapePos := cfg.workTapePos }.stateinput:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputm:Modehq:cfg.state = some (modeState m)hi:cfg.inputSymbol = none{ state := (finish (decide (m = Mode.done))).q', inputPos := moveInputPos cfg.inputPos (finish (decide (m = Mode.done))).inputMove, workTapes := fun i match (motive := Option (Option (Fin 4)) Option (Fin 4)) ((finish (decide (m = Mode.done))).workActions i).1 with | none => cfg.workTapes i | some s => Function.update (cfg.workTapes i) (cfg.workTapePos i) s, workTapePos := fun i cfg.workTapePos i + ((finish (decide (m = Mode.done))).workActions i).2 }.inputPos = { state := none, inputPos := cfg.inputPos, workTapes := cfg.workTapes, workTapePos := cfg.workTapePos }.inputPosinput:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputm:Modehq:cfg.state = some (modeState m)hi:cfg.inputSymbol = none{ state := (finish (decide (m = Mode.done))).q', inputPos := moveInputPos cfg.inputPos (finish (decide (m = Mode.done))).inputMove, workTapes := fun i match (motive := Option (Option (Fin 4)) Option (Fin 4)) ((finish (decide (m = Mode.done))).workActions i).1 with | none => cfg.workTapes i | some s => Function.update (cfg.workTapes i) (cfg.workTapePos i) s, workTapePos := fun i cfg.workTapePos i + ((finish (decide (m = Mode.done))).workActions i).2 }.workTapes = { state := none, inputPos := cfg.inputPos, workTapes := cfg.workTapes, workTapePos := cfg.workTapePos }.workTapesinput:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputm:Modehq:cfg.state = some (modeState m)hi:cfg.inputSymbol = none{ state := (finish (decide (m = Mode.done))).q', inputPos := moveInputPos cfg.inputPos (finish (decide (m = Mode.done))).inputMove, workTapes := fun i match (motive := Option (Option (Fin 4)) Option (Fin 4)) ((finish (decide (m = Mode.done))).workActions i).1 with | none => cfg.workTapes i | some s => Function.update (cfg.workTapes i) (cfg.workTapePos i) s, workTapePos := fun i cfg.workTapePos i + ((finish (decide (m = Mode.done))).workActions i).2 }.workTapePos = { state := none, inputPos := cfg.inputPos, workTapes := cfg.workTapes, workTapePos := cfg.workTapePos }.workTapePos input:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputm:Modehq:cfg.state = some (modeState m)hi:cfg.inputSymbol = none{ state := (finish (decide (m = Mode.done))).q', inputPos := moveInputPos cfg.inputPos (finish (decide (m = Mode.done))).inputMove, workTapes := fun i match (motive := Option (Option (Fin 4)) Option (Fin 4)) ((finish (decide (m = Mode.done))).workActions i).1 with | none => cfg.workTapes i | some s => Function.update (cfg.workTapes i) (cfg.workTapePos i) s, workTapePos := fun i cfg.workTapePos i + ((finish (decide (m = Mode.done))).workActions i).2 }.state = { state := none, inputPos := cfg.inputPos, workTapes := cfg.workTapes, workTapePos := cfg.workTapePos }.stateinput:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputm:Modehq:cfg.state = some (modeState m)hi:cfg.inputSymbol = none{ state := (finish (decide (m = Mode.done))).q', inputPos := moveInputPos cfg.inputPos (finish (decide (m = Mode.done))).inputMove, workTapes := fun i match (motive := Option (Option (Fin 4)) Option (Fin 4)) ((finish (decide (m = Mode.done))).workActions i).1 with | none => cfg.workTapes i | some s => Function.update (cfg.workTapes i) (cfg.workTapePos i) s, workTapePos := fun i cfg.workTapePos i + ((finish (decide (m = Mode.done))).workActions i).2 }.inputPos = { state := none, inputPos := cfg.inputPos, workTapes := cfg.workTapes, workTapePos := cfg.workTapePos }.inputPosinput:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputm:Modehq:cfg.state = some (modeState m)hi:cfg.inputSymbol = none{ state := (finish (decide (m = Mode.done))).q', inputPos := moveInputPos cfg.inputPos (finish (decide (m = Mode.done))).inputMove, workTapes := fun i match (motive := Option (Option (Fin 4)) Option (Fin 4)) ((finish (decide (m = Mode.done))).workActions i).1 with | none => cfg.workTapes i | some s => Function.update (cfg.workTapes i) (cfg.workTapePos i) s, workTapePos := fun i cfg.workTapePos i + ((finish (decide (m = Mode.done))).workActions i).2 }.workTapes = { state := none, inputPos := cfg.inputPos, workTapes := cfg.workTapes, workTapePos := cfg.workTapePos }.workTapesinput:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputm:Modehq:cfg.state = some (modeState m)hi:cfg.inputSymbol = none{ state := (finish (decide (m = Mode.done))).q', inputPos := moveInputPos cfg.inputPos (finish (decide (m = Mode.done))).inputMove, workTapes := fun i match (motive := Option (Option (Fin 4)) Option (Fin 4)) ((finish (decide (m = Mode.done))).workActions i).1 with | none => cfg.workTapes i | some s => Function.update (cfg.workTapes i) (cfg.workTapePos i) s, workTapePos := fun i cfg.workTapePos i + ((finish (decide (m = Mode.done))).workActions i).2 }.workTapePos = { state := none, inputPos := cfg.inputPos, workTapes := cfg.workTapes, workTapePos := cfg.workTapePos }.workTapePos All goals completed! 🐙

The final transition emits exactly the accepting-mode decision.

theorem outputSymbol_end {input : List (Fin 4)} (cfg : Cfg 3 (Fin 4) (Fin 10) input) (m : Mode) (hq : cfg.state = some (modeState m)) (hi : cfg.inputSymbol = none) : machine.outputSymbol cfg = some (boolEmb (decide (m = .done))) := input:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputm:Modehq:cfg.state = some (modeState m)hi:cfg.inputSymbol = noneoutputSymbol cfg = some (boolEmb (decide (m = Mode.done))) input:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputm:Modehq:cfg.state = some (modeState m)hi:cfg.inputSymbol = none(match cfg.state with | none => none | some q => (machine.tr q cfg.inputSymbol cfg.workTapeSymbols).outS) = some (boolEmb (decide (m = Mode.done))) input:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputm:Modehq:cfg.state = some (modeState m)hi:cfg.inputSymbol = none(match some (modeState m) with | none => none | some q => (machine.tr q cfg.inputSymbol cfg.workTapeSymbols).outS) = some (boolEmb (decide (m = Mode.done))) input:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputm:Modehq:cfg.state = some (modeState m)hi:cfg.inputSymbol = none(machine.tr (modeState m) cfg.inputSymbol cfg.workTapeSymbols).outS = some (boolEmb (decide (m = Mode.done))) input:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputm:Modehq:cfg.state = some (modeState m)hi:cfg.inputSymbol = none(finish (decide (m = Mode.done))).outS = some (boolEmb (decide (m = Mode.done))) All goals completed! 🐙

Bounds on consecutive execution segments combine into a bound on their concatenation.

theorem headBound_add {input : List (Fin 4)} (cfg : Cfg 3 (Fin 4) (Fin 10) input) (width a b : ) (ha : t a, HeadBound width (machine.configs cfg t)) (hb : t b, HeadBound width (machine.configs (machine.configs cfg a) t)) : t a + b, HeadBound width (machine.configs cfg t) := input:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputwidth:a:b:ha: t a, HeadBound width (configs cfg t)hb: t b, HeadBound width (configs (configs cfg a) t) t a + b, HeadBound width (configs cfg t) input:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputwidth:a:b:ha: t a, HeadBound width (configs cfg t)hb: t b, HeadBound width (configs (configs cfg a) t)t:ht:t a + bHeadBound width (configs cfg t) input:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputwidth:a:b:ha: t a, HeadBound width (configs cfg t)hb: t b, HeadBound width (configs (configs cfg a) t)t:ht:t a + bh:t aHeadBound width (configs cfg t)input:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputwidth:a:b:ha: t a, HeadBound width (configs cfg t)hb: t b, HeadBound width (configs (configs cfg a) t)t:ht:t a + bh:¬t aHeadBound width (configs cfg t) input:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputwidth:a:b:ha: t a, HeadBound width (configs cfg t)hb: t b, HeadBound width (configs (configs cfg a) t)t:ht:t a + bh:t aHeadBound width (configs cfg t) All goals completed! 🐙 input:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputwidth:a:b:ha: t a, HeadBound width (configs cfg t)hb: t b, HeadBound width (configs (configs cfg a) t)t:ht:t a + bh:¬t aHeadBound width (configs cfg t) input:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputwidth:a:b:ha: t a, HeadBound width (configs cfg t)hb: t b, HeadBound width (configs (configs cfg a) t)t:ht:t a + bh:¬t aHeadBound width (configs (configs cfg a) (t - a)) exact hb (t - a) (input:List (Fin 4)cfg:Cfg 3 (Fin 4) (Fin 10) inputwidth:a:b:ha: t a, HeadBound width (configs cfg t)hb: t b, HeadBound width (configs (configs cfg a) t)t:ht:t a + bh:¬t at - a b All goals completed! 🐙)
end Geb.BitTree.BinaryMachine