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 Mathlib.Logic.Function.Basic public import Aesop public import Mathlib.Data.Int.Notation public import Mathlib.Data.Nat.Notation public import Mathlib.Logic.IsEmpty.Defs public import Mathlib.Tactic.Attr.Core public import Mathlib.Tactic.Push public import Mathlib.Tactic.SplitIfs
set_option doc.verso true

Maintaining the number of unequal binary digits

Counting unequal positions below a fixed width detects equality when both bit streams agree beyond that width. Flipping one digit changes this count by one, positively for an initially equal pair and negatively for an initially unequal pair.

Main definitions

  • mismatchCount counts unequal positions below a width.

  • flipAt changes one position of a bit stream.

Main statements

  • mismatchCount_le bounds the count by the width.

  • mismatchCount_flip_left gives the displacement caused by one bit change.

Tags

binary counter, Hamming distance, bit stream

@[expose] public sectionnamespace Geb.BitTree.BinaryMachine

The number of unequal positions below the given width.

def mismatchCount (width : ) (a b : Bool) : := (List.range width).countP fun i a i != b i

Flip one bit of a stream.

def flipAt (a : Bool) (i : ) : Bool := Function.update a i (!a i)

Extending the width adds the contribution from the new position.

theorem mismatchCount_succ (width : ) (a b : Bool) : mismatchCount (width + 1) a b = mismatchCount width a b + if a width = b width then 0 else 1 := width:a: Boolb: BoolmismatchCount (width + 1) a b = mismatchCount width a b + if a width = b width then 0 else 1 All goals completed! 🐙

There cannot be more unequal positions than positions.

theorem mismatchCount_le (width : ) (a b : Bool) : mismatchCount width a b width := width:a: Boolb: BoolmismatchCount width a b width All goals completed! 🐙

The count depends only on the bits below the given width.

theorem mismatchCount_congr (width : ) (a a' b b' : Bool) (ha : i < width, a i = a' i) (hb : i < width, b i = b' i) : mismatchCount width a b = mismatchCount width a' b' := width:a: Boola': Boolb: Boolb': Boolha: (i : ), i < width a i = a' ihb: (i : ), i < width b i = b' imismatchCount width a b = mismatchCount width a' b' width:a: Boola': Boolb: Boolb': Boolha: (i : ), i < width a i = a' ihb: (i : ), i < width b i = b' i (x : ), x List.range width ((a x != b x) = true (a' x != b' x) = true) width:a: Boola': Boolb: Boolb': Boolha: (i : ), i < width a i = a' ihb: (i : ), i < width b i = b' ii:hi:i List.range width(a i != b i) = true (a' i != b' i) = true All goals completed! 🐙

Interchanging the streams preserves the mismatch count.

theorem mismatchCount_comm (width : ) (a b : Bool) : mismatchCount width a b = mismatchCount width b a := width:a: Boolb: BoolmismatchCount width a b = mismatchCount width b a width:a: Boolb: Bool (x : ), x List.range width ((a x != b x) = true (b x != a x) = true) width:a: Boolb: Booli:a✝:i List.range width(a i != b i) = true (b i != a i) = true All goals completed! 🐙

A flip beyond the counted positions leaves the count unchanged.

theorem mismatchCount_flip_left_of_le (width i : ) (a b : Bool) (h : width i) : mismatchCount width (flipAt a i) b = mismatchCount width a b := width:i:a: Boolb: Boolh:width imismatchCount width (flipAt a i) b = mismatchCount width a b width:i:a: Boolb: Boolh:width i (i_1 : ), i_1 < width flipAt a i i_1 = a i_1width:i:a: Boolb: Boolh:width i (i : ), i < width b i = b i width:i:a: Boolb: Boolh:width i (i_1 : ), i_1 < width flipAt a i i_1 = a i_1 width:i:a: Boolb: Boolh:width ij:hj:j < widthflipAt a i j = a j exact Function.update_of_ne (width:i:a: Boolb: Boolh:width ij:hj:j < widthj i All goals completed! 🐙) _ _ width:i:a: Boolb: Boolh:width i (i : ), i < width b i = b i width:i:a: Boolb: Boolh:width ij:a✝:j < widthb j = b j All goals completed! 🐙

Flipping a position changes its contribution from zero to one or from one to zero.

theorem mismatchCount_flip_left (width i : ) (a b : Bool) (h : i < width) : (mismatchCount width (flipAt a i) b : ) = (mismatchCount width a b : ) + if a i = b i then 1 else -1 := width:i:a: Boolb: Boolh:i < width(mismatchCount width (flipAt a i) b) = (mismatchCount width a b) + if a i = b i then 1 else -1 width:a: Boolb: Bool (i : ), i < width (mismatchCount width (flipAt a i) b) = (mismatchCount width a b) + if a i = b i then 1 else -1 width:a: Boolb: Bool (i : ), i < Nat.zero (mismatchCount Nat.zero (flipAt a i) b) = (mismatchCount Nat.zero a b) + if a i = b i then 1 else -1width:a: Boolb: Bool (n : ), (∀ (i : ), i < n (mismatchCount n (flipAt a i) b) = (mismatchCount n a b) + if a i = b i then 1 else -1) (i : ), i < n.succ (mismatchCount n.succ (flipAt a i) b) = (mismatchCount n.succ a b) + if a i = b i then 1 else -1 width:a: Boolb: Bool (i : ), i < Nat.zero (mismatchCount Nat.zero (flipAt a i) b) = (mismatchCount Nat.zero a b) + if a i = b i then 1 else -1 width:a: Boolb: Booli:hi:i < Nat.zero(mismatchCount Nat.zero (flipAt a i) b) = (mismatchCount Nat.zero a b) + if a i = b i then 1 else -1 All goals completed! 🐙 width:a: Boolb: Bool (n : ), (∀ (i : ), i < n (mismatchCount n (flipAt a i) b) = (mismatchCount n a b) + if a i = b i then 1 else -1) (i : ), i < n.succ (mismatchCount n.succ (flipAt a i) b) = (mismatchCount n.succ a b) + if a i = b i then 1 else -1 width:a: Boolb: Boolk:ih: (i : ), i < k (mismatchCount k (flipAt a i) b) = (mismatchCount k a b) + if a i = b i then 1 else -1i:hi:i < k.succ(mismatchCount k.succ (flipAt a i) b) = (mismatchCount k.succ a b) + if a i = b i then 1 else -1 width:a: Boolb: Boolk:ih: (i : ), i < k (mismatchCount k (flipAt a i) b) = (mismatchCount k a b) + if a i = b i then 1 else -1i:hi:i < k.succ(mismatchCount k (flipAt a i) b + if flipAt a i k = b k then 0 else 1) = (mismatchCount k a b + if a k = b k then 0 else 1) + if a i = b i then 1 else -1 width:a: Boolb: Boolk:ih: (i : ), i < k (mismatchCount k (flipAt a i) b) = (mismatchCount k a b) + if a i = b i then 1 else -1i:hi:i < k.succhik:i = k(mismatchCount k (flipAt a i) b + if flipAt a i k = b k then 0 else 1) = (mismatchCount k a b + if a k = b k then 0 else 1) + if a i = b i then 1 else -1width:a: Boolb: Boolk:ih: (i : ), i < k (mismatchCount k (flipAt a i) b) = (mismatchCount k a b) + if a i = b i then 1 else -1i:hi:i < k.succhik:¬i = k(mismatchCount k (flipAt a i) b + if flipAt a i k = b k then 0 else 1) = (mismatchCount k a b + if a k = b k then 0 else 1) + if a i = b i then 1 else -1 width:a: Boolb: Boolk:ih: (i : ), i < k (mismatchCount k (flipAt a i) b) = (mismatchCount k a b) + if a i = b i then 1 else -1i:hi:i < k.succhik:i = k(mismatchCount k (flipAt a i) b + if flipAt a i k = b k then 0 else 1) = (mismatchCount k a b + if a k = b k then 0 else 1) + if a i = b i then 1 else -1 width:a: Boolb: Boolk:ih: (i : ), i < k (mismatchCount k (flipAt a i) b) = (mismatchCount k a b) + if a i = b i then 1 else -1hi:k < k.succ(mismatchCount k (flipAt a k) b + if flipAt a k k = b k then 0 else 1) = (mismatchCount k a b + if a k = b k then 0 else 1) + if a k = b k then 1 else -1 width:a: Boolb: Boolk:ih: (i : ), i < k (mismatchCount k (flipAt a i) b) = (mismatchCount k a b) + if a i = b i then 1 else -1hi:k < k.succ(mismatchCount k a b + if flipAt a k k = b k then 0 else 1) = (mismatchCount k a b + if a k = b k then 0 else 1) + if a k = b k then 1 else -1 width:a: Boolb: Boolk:ih: (i : ), i < k (mismatchCount k (flipAt a i) b) = (mismatchCount k a b) + if a i = b i then 1 else -1hi:k < k.succ(mismatchCount k a b + if (!a k) = b k then 0 else 1) = (mismatchCount k a b + if a k = b k then 0 else 1) + if a k = b k then 1 else -1 width:a: Boolb: Boolk:ih: (i : ), i < k (mismatchCount k (flipAt a i) b) = (mismatchCount k a b) + if a i = b i then 1 else -1hi:k < k.succ(mismatchCount k a b + if (!false) = b k then 0 else 1) = (mismatchCount k a b + if false = b k then 0 else 1) + if false = b k then 1 else -1width:a: Boolb: Boolk:ih: (i : ), i < k (mismatchCount k (flipAt a i) b) = (mismatchCount k a b) + if a i = b i then 1 else -1hi:k < k.succ(mismatchCount k a b + if (!true) = b k then 0 else 1) = (mismatchCount k a b + if true = b k then 0 else 1) + if true = b k then 1 else -1 width:a: Boolb: Boolk:ih: (i : ), i < k (mismatchCount k (flipAt a i) b) = (mismatchCount k a b) + if a i = b i then 1 else -1hi:k < k.succ(mismatchCount k a b + if (!false) = b k then 0 else 1) = (mismatchCount k a b + if false = b k then 0 else 1) + if false = b k then 1 else -1width:a: Boolb: Boolk:ih: (i : ), i < k (mismatchCount k (flipAt a i) b) = (mismatchCount k a b) + if a i = b i then 1 else -1hi:k < k.succ(mismatchCount k a b + if (!true) = b k then 0 else 1) = (mismatchCount k a b + if true = b k then 0 else 1) + if true = b k then 1 else -1 width:a: Boolb: Boolk:ih: (i : ), i < k (mismatchCount k (flipAt a i) b) = (mismatchCount k a b) + if a i = b i then 1 else -1hi:k < k.succ(mismatchCount k a b + if (!true) = false then 0 else 1) = (mismatchCount k a b + if true = false then 0 else 1) + if true = false then 1 else -1width:a: Boolb: Boolk:ih: (i : ), i < k (mismatchCount k (flipAt a i) b) = (mismatchCount k a b) + if a i = b i then 1 else -1hi:k < k.succ(mismatchCount k a b + if (!true) = true then 0 else 1) = (mismatchCount k a b + if true = true then 0 else 1) + if true = true then 1 else -1 width:a: Boolb: Boolk:ih: (i : ), i < k (mismatchCount k (flipAt a i) b) = (mismatchCount k a b) + if a i = b i then 1 else -1hi:k < k.succ(mismatchCount k a b + if (!false) = false then 0 else 1) = (mismatchCount k a b + if false = false then 0 else 1) + if false = false then 1 else -1width:a: Boolb: Boolk:ih: (i : ), i < k (mismatchCount k (flipAt a i) b) = (mismatchCount k a b) + if a i = b i then 1 else -1hi:k < k.succ(mismatchCount k a b + if (!false) = true then 0 else 1) = (mismatchCount k a b + if false = true then 0 else 1) + if false = true then 1 else -1width:a: Boolb: Boolk:ih: (i : ), i < k (mismatchCount k (flipAt a i) b) = (mismatchCount k a b) + if a i = b i then 1 else -1hi:k < k.succ(mismatchCount k a b + if (!true) = false then 0 else 1) = (mismatchCount k a b + if true = false then 0 else 1) + if true = false then 1 else -1width:a: Boolb: Boolk:ih: (i : ), i < k (mismatchCount k (flipAt a i) b) = (mismatchCount k a b) + if a i = b i then 1 else -1hi:k < k.succ(mismatchCount k a b + if (!true) = true then 0 else 1) = (mismatchCount k a b + if true = true then 0 else 1) + if true = true then 1 else -1 All goals completed! 🐙 width:a: Boolb: Boolk:ih: (i : ), i < k (mismatchCount k (flipAt a i) b) = (mismatchCount k a b) + if a i = b i then 1 else -1hi:k < k.succ(mismatchCount k a b) = (mismatchCount k a b) + 1 + -1width:a: Boolb: Boolk:ih: (i : ), i < k (mismatchCount k (flipAt a i) b) = (mismatchCount k a b) + if a i = b i then 1 else -1hi:k < k.succ(mismatchCount k a b) = (mismatchCount k a b) + 1 + -1 All goals completed! 🐙 width:a: Boolb: Boolk:ih: (i : ), i < k (mismatchCount k (flipAt a i) b) = (mismatchCount k a b) + if a i = b i then 1 else -1i:hi:i < k.succhik:¬i = k(mismatchCount k (flipAt a i) b + if flipAt a i k = b k then 0 else 1) = (mismatchCount k a b + if a k = b k then 0 else 1) + if a i = b i then 1 else -1 width:a: Boolb: Boolk:ih: (i : ), i < k (mismatchCount k (flipAt a i) b) = (mismatchCount k a b) + if a i = b i then 1 else -1i:hi:i < k.succhik:¬i = khki:k i(mismatchCount k (flipAt a i) b + if flipAt a i k = b k then 0 else 1) = (mismatchCount k a b + if a k = b k then 0 else 1) + if a i = b i then 1 else -1 width:a: Boolb: Boolk:ih: (i : ), i < k (mismatchCount k (flipAt a i) b) = (mismatchCount k a b) + if a i = b i then 1 else -1i:hi:i < k.succhik:¬i = khki:k ihrec:(mismatchCount k (flipAt a i) b) = (mismatchCount k a b) + if a i = b i then 1 else -1(mismatchCount k (flipAt a i) b + if flipAt a i k = b k then 0 else 1) = (mismatchCount k a b + if a k = b k then 0 else 1) + if a i = b i then 1 else -1 width:a: Boolb: Boolk:ih: (i : ), i < k (mismatchCount k (flipAt a i) b) = (mismatchCount k a b) + if a i = b i then 1 else -1i:hi:i < k.succhik:¬i = khki:k ihrec:(mismatchCount k (Function.update a i !a i) b) = (mismatchCount k a b) + if a i = b i then 1 else -1(mismatchCount k (Function.update a i !a i) b + if a k = b k then 0 else 1) = (mismatchCount k a b + if a k = b k then 0 else 1) + if a i = b i then 1 else -1 width:a: Boolb: Boolk:ih: (i : ), i < k (mismatchCount k (flipAt a i) b) = (mismatchCount k a b) + if a i = b i then 1 else -1i:hi:i < k.succhik:¬i = khki:k ih✝¹:a k = b kh✝:a i = b ihrec:(mismatchCount k (Function.update a i !a i) b) = (mismatchCount k a b) + 1(mismatchCount k (Function.update a i !a i) b + 0) = (mismatchCount k a b + 0) + 1width:a: Boolb: Boolk:ih: (i : ), i < k (mismatchCount k (flipAt a i) b) = (mismatchCount k a b) + if a i = b i then 1 else -1i:hi:i < k.succhik:¬i = khki:k ih✝¹:a k = b kh✝:¬a i = b ihrec:(mismatchCount k (Function.update a i !a i) b) = (mismatchCount k a b) + -1(mismatchCount k (Function.update a i !a i) b + 0) = (mismatchCount k a b + 0) + -1width:a: Boolb: Boolk:ih: (i : ), i < k (mismatchCount k (flipAt a i) b) = (mismatchCount k a b) + if a i = b i then 1 else -1i:hi:i < k.succhik:¬i = khki:k ih✝¹:¬a k = b kh✝:a i = b ihrec:(mismatchCount k (Function.update a i !a i) b) = (mismatchCount k a b) + 1(mismatchCount k (Function.update a i !a i) b + 1) = (mismatchCount k a b + 1) + 1width:a: Boolb: Boolk:ih: (i : ), i < k (mismatchCount k (flipAt a i) b) = (mismatchCount k a b) + if a i = b i then 1 else -1i:hi:i < k.succhik:¬i = khki:k ih✝¹:¬a k = b kh✝:¬a i = b ihrec:(mismatchCount k (Function.update a i !a i) b) = (mismatchCount k a b) + -1(mismatchCount k (Function.update a i !a i) b + 1) = (mismatchCount k a b + 1) + -1 width:a: Boolb: Boolk:ih: (i : ), i < k (mismatchCount k (flipAt a i) b) = (mismatchCount k a b) + if a i = b i then 1 else -1i:hi:i < k.succhik:¬i = khki:k ih✝¹:a k = b kh✝:a i = b ihrec:(mismatchCount k (Function.update a i !a i) b) = (mismatchCount k a b) + 1(mismatchCount k (Function.update a i !a i) b + 0) = (mismatchCount k a b + 0) + 1width:a: Boolb: Boolk:ih: (i : ), i < k (mismatchCount k (flipAt a i) b) = (mismatchCount k a b) + if a i = b i then 1 else -1i:hi:i < k.succhik:¬i = khki:k ih✝¹:a k = b kh✝:¬a i = b ihrec:(mismatchCount k (Function.update a i !a i) b) = (mismatchCount k a b) + -1(mismatchCount k (Function.update a i !a i) b + 0) = (mismatchCount k a b + 0) + -1width:a: Boolb: Boolk:ih: (i : ), i < k (mismatchCount k (flipAt a i) b) = (mismatchCount k a b) + if a i = b i then 1 else -1i:hi:i < k.succhik:¬i = khki:k ih✝¹:¬a k = b kh✝:a i = b ihrec:(mismatchCount k (Function.update a i !a i) b) = (mismatchCount k a b) + 1(mismatchCount k (Function.update a i !a i) b + 1) = (mismatchCount k a b + 1) + 1width:a: Boolb: Boolk:ih: (i : ), i < k (mismatchCount k (flipAt a i) b) = (mismatchCount k a b) + if a i = b i then 1 else -1i:hi:i < k.succhik:¬i = khki:k ih✝¹:¬a k = b kh✝:¬a i = b ihrec:(mismatchCount k (Function.update a i !a i) b) = (mismatchCount k a b) + -1(mismatchCount k (Function.update a i !a i) b + 1) = (mismatchCount k a b + 1) + -1 All goals completed! 🐙

A flip of the other stream has the same displacement rule.

theorem mismatchCount_flip_right (width i : ) (a b : Bool) (h : i < width) : (mismatchCount width a (flipAt b i) : ) = (mismatchCount width a b : ) + if a i = b i then 1 else -1 := width:i:a: Boolb: Boolh:i < width(mismatchCount width a (flipAt b i)) = (mismatchCount width a b) + if a i = b i then 1 else -1 width:i:a: Boolb: Boolh:i < width((mismatchCount width a b) + if b i = a i then 1 else -1) = (mismatchCount width a b) + if a i = b i then 1 else -1 All goals completed! 🐙

Equality of bit streams below the width is equivalent to a zero count.

theorem mismatchCount_eq_zero (width : ) (a b : Bool) : mismatchCount width a b = 0 i < width, a i = b i := width:a: Boolb: BoolmismatchCount width a b = 0 (i : ), i < width a i = b i width:a: Boolb: BoolmismatchCount Nat.zero a b = 0 (i : ), i < Nat.zero a i = b iwidth:a: Boolb: Bool (n : ), (mismatchCount n a b = 0 (i : ), i < n a i = b i) (mismatchCount n.succ a b = 0 (i : ), i < n.succ a i = b i) width:a: Boolb: BoolmismatchCount Nat.zero a b = 0 (i : ), i < Nat.zero a i = b i All goals completed! 🐙 width:a: Boolb: Bool (n : ), (mismatchCount n a b = 0 (i : ), i < n a i = b i) (mismatchCount n.succ a b = 0 (i : ), i < n.succ a i = b i) width:a: Boolb: Boolk:ih:mismatchCount k a b = 0 (i : ), i < k a i = b imismatchCount k.succ a b = 0 (i : ), i < k.succ a i = b i width:a: Boolb: Boolk:ih:mismatchCount k a b = 0 (i : ), i < k a i = b i(mismatchCount k a b + if a k = b k then 0 else 1) = 0 (i : ), i < k.succ a i = b i width:a: Boolb: Boolk:ih:mismatchCount k a b = 0 (i : ), i < k a i = b i(mismatchCount k a b + if a k = b k then 0 else 1) = 0 (i : ), i < k.succ a i = b iwidth:a: Boolb: Boolk:ih:mismatchCount k a b = 0 (i : ), i < k a i = b i(∀ (i : ), i < k.succ a i = b i) (mismatchCount k a b + if a k = b k then 0 else 1) = 0 width:a: Boolb: Boolk:ih:mismatchCount k a b = 0 (i : ), i < k a i = b i(mismatchCount k a b + if a k = b k then 0 else 1) = 0 (i : ), i < k.succ a i = b i width:a: Boolb: Boolk:ih:mismatchCount k a b = 0 (i : ), i < k a i = b ih:(mismatchCount k a b + if a k = b k then 0 else 1) = 0i:hi:i < k.succa i = b i width:a: Boolb: Boolk:ih:mismatchCount k a b = 0 (i : ), i < k a i = b ih:(mismatchCount k a b + if a k = b k then 0 else 1) = 0i:hi:i < k.succhk:a k = b ka i = b i width:a: Boolb: Boolk:ih:mismatchCount k a b = 0 (i : ), i < k a i = b ih:(mismatchCount k a b + if a k = b k then 0 else 1) = 0i:hi:i < k.succhk:a k = b khprev:mismatchCount k a b = 0a i = b i width:a: Boolb: Boolk:ih:mismatchCount k a b = 0 (i : ), i < k a i = b ih:(mismatchCount k a b + if a k = b k then 0 else 1) = 0i:hi:i < k.succhk:a k = b khprev:mismatchCount k a b = 0hik:i < ka i = b iwidth:a: Boolb: Boolk:ih:mismatchCount k a b = 0 (i : ), i < k a i = b ih:(mismatchCount k a b + if a k = b k then 0 else 1) = 0i:hi:i < k.succhk:a k = b khprev:mismatchCount k a b = 0hik:¬i < ka i = b i width:a: Boolb: Boolk:ih:mismatchCount k a b = 0 (i : ), i < k a i = b ih:(mismatchCount k a b + if a k = b k then 0 else 1) = 0i:hi:i < k.succhk:a k = b khprev:mismatchCount k a b = 0hik:i < ka i = b i All goals completed! 🐙 width:a: Boolb: Boolk:ih:mismatchCount k a b = 0 (i : ), i < k a i = b ih:(mismatchCount k a b + if a k = b k then 0 else 1) = 0i:hi:i < k.succhk:a k = b khprev:mismatchCount k a b = 0hik:¬i < ka i = b i width:a: Boolb: Boolk:ih:mismatchCount k a b = 0 (i : ), i < k a i = b ih:(mismatchCount k a b + if a k = b k then 0 else 1) = 0i:hi:i < k.succhk:a k = b khprev:mismatchCount k a b = 0hik:¬i < khe:i = ka i = b i All goals completed! 🐙 width:a: Boolb: Boolk:ih:mismatchCount k a b = 0 (i : ), i < k a i = b i(∀ (i : ), i < k.succ a i = b i) (mismatchCount k a b + if a k = b k then 0 else 1) = 0 width:a: Boolb: Boolk:ih:mismatchCount k a b = 0 (i : ), i < k a i = b ih: (i : ), i < k.succ a i = b i(mismatchCount k a b + if a k = b k then 0 else 1) = 0 width:a: Boolb: Boolk:ih:mismatchCount k a b = 0 (i : ), i < k a i = b ih: (i : ), i < k.succ a i = b ihk:a k = b k(mismatchCount k a b + if a k = b k then 0 else 1) = 0 width:a: Boolb: Boolk:ih:mismatchCount k a b = 0 (i : ), i < k a i = b ih: (i : ), i < k.succ a i = b ihk:a k = b khprev:mismatchCount k a b = 0(mismatchCount k a b + if a k = b k then 0 else 1) = 0 All goals completed! 🐙

If the streams agree beyond the width, their bounded count detects their equality.

theorem mismatchCount_eq_zero_iff_eq (width : ) (a b : Bool) (h : i, width i a i = b i) : mismatchCount width a b = 0 a = b := width:a: Boolb: Boolh: (i : ), width i a i = b imismatchCount width a b = 0 a = b width:a: Boolb: Boolh: (i : ), width i a i = b i(∀ (i : ), i < width a i = b i) a = b width:a: Boolb: Boolh: (i : ), width i a i = b i(∀ (i : ), i < width a i = b i) a = bwidth:a: Boolb: Boolh: (i : ), width i a i = b ia = b (i : ), i < width a i = b i width:a: Boolb: Boolh: (i : ), width i a i = b i(∀ (i : ), i < width a i = b i) a = b width:a: Boolb: Boolh: (i : ), width i a i = b ihsmall: (i : ), i < width a i = b ia = b width:a: Boolb: Boolh: (i : ), width i a i = b ihsmall: (i : ), i < width a i = b ii:a i = b i width:a: Boolb: Boolh: (i : ), width i a i = b ihsmall: (i : ), i < width a i = b ii:hi:i < widtha i = b iwidth:a: Boolb: Boolh: (i : ), width i a i = b ihsmall: (i : ), i < width a i = b ii:hi:¬i < widtha i = b i width:a: Boolb: Boolh: (i : ), width i a i = b ihsmall: (i : ), i < width a i = b ii:hi:i < widtha i = b i All goals completed! 🐙 width:a: Boolb: Boolh: (i : ), width i a i = b ihsmall: (i : ), i < width a i = b ii:hi:¬i < widtha i = b i exact h i (width:a: Boolb: Boolh: (i : ), width i a i = b ihsmall: (i : ), i < width a i = b ii:hi:¬i < widthwidth i All goals completed! 🐙) width:a: Boolb: Boolh: (i : ), width i a i = b ia = b (i : ), i < width a i = b i width:a: Boolb: Boolh: (i : ), width i a i = b ihe:a = bi:a✝:i < widtha i = b i All goals completed! 🐙
end Geb.BitTree.BinaryMachine