Reference · Data types
rainbow.data.binary
Binary (positional) numerals -- foundation stone for magnitude-INDEPENDENT arithmetic. Motivation: `data/Nat` is unary (a succ-chain), so kernel reduction of nat/nnrat arithmetic costs O(magnitude). That is the recurring 'LP ceiling is magnitude' wall and the reason the verified-scaling bridge is impractical past one dimension (see the design notes and memory rainbow-scaling-bridge-magnitude-wall). A positional numeral whose arithmetic recurses on O(log magnitude) constructors reduces in O(log) steps; a certified `Bin <-> Nat` bridge then lets the numeric layer pay log cost while keeping the Nat-based theorems. This module is the first brick: the `data/Bin` inductive and its recursor. data/Bin ::= bin-zero -- 0 | bin-even half -- 2 * half | bin-odd half -- 2 * half + 1 (Non-canonical: bin-even bin-zero also denotes 0; canonicalisation and the Bin<->Nat interpretation/arithmetic are the next bricks.) The block installs cleanly and its recursor `data/Bin.rec` reduces (verified in binary_test by a fold into Nat). Additive and opt-in: it adds a block to a checked environment via `extend-environment`, mirroring rainbow.data.list; it does not touch the trusted base.
bin/double
bin/double : (x₁ : ℕ) → ℕ
ℕ = data/Nat
bin/to-nat
bin/to-nat : (x₁ : data/Bin) → ℕ
ℕ = data/Nat
bin/bin-succ
bin/bin-succ : (x₁ : data/Bin) → data/Bin
bin/from-nat
bin/from-nat : (x₁ : ℕ) → data/Bin
ℕ = data/Nat
bin/bin-add
bin/bin-add : (x₁ x₂ : data/Bin) → data/Bin
bin/bit-length
bin/bit-length : (x₁ : data/Bin) → ℕ
ℕ = data/Nat
bin/to-nat-of-bin-succ
bin/to-nat-of-bin-succ : (b : data/Bin) → bin/to-nat (bin/bin-succ b) = data/succ (bin/to-nat b)
= = equality/Eq
bin/to-nat-from-nat
bin/to-nat-from-nat : (n : ℕ) → bin/to-nat (bin/from-nat n) = n
= = equality/Eqℕ = data/Nat
bin/double-distributes-add
bin/double-distributes-add : (x y : ℕ) → bin/double (algebra/nat-add x y) = algebra/nat-add (bin/double x) (bin/double y)
= = equality/Eqℕ = data/Nat
bin/to-nat-bin-add
bin/to-nat-bin-add : (a b : data/Bin) → bin/to-nat (bin/bin-add a b) = algebra/nat-add (bin/to-nat a) (bin/to-nat b)
= = equality/Eq
bin/double-self
bin/double-self : (y : ℕ) → bin/double y = algebra/nat-add y y
= = equality/Eqℕ = data/Nat
bin/double-multiply-left
bin/double-multiply-left : (x y : ℕ) → bin/double (nat/multiply x y) = nat/multiply (bin/double x) y
= = equality/Eqℕ = data/Nat
bin/bin-multiply
bin/bin-multiply : (x₁ x₂ : data/Bin) → data/Bin
bin/to-nat-bin-multiply
bin/to-nat-bin-multiply : (a b : data/Bin) → bin/to-nat (bin/bin-multiply a b) = nat/multiply (bin/to-nat a) (bin/to-nat b)
= = equality/Eq
bin/nonzero
bin/nonzero : (x₁ : data/Bin) → data/Bool
bin/compare
bin/compare : (x₁ x₂ : data/Bin) → data/Product data/Bool data/Bool
bin/at-most
bin/at-most : (x₁ x₂ : data/Bin) → data/Bool
bin/decide-double-double
bin/decide-double-double : (A B : ℕ) → nat/decide-at-most (bin/double A) (bin/double B) = nat/decide-at-most A B
= = equality/Eqℕ = data/Nat
bin/decide-double-succ-double
bin/decide-double-succ-double : (A B : ℕ) → nat/decide-at-most (bin/double A) (data/succ (bin/double B)) = nat/decide-at-most A B
= = equality/Eqℕ = data/Nat
bin/decide-one-double
bin/decide-one-double : (m : ℕ) → nat/decide-at-most 1 (bin/double m) = nat/decide-at-most 1 m
= = equality/Eqℕ = data/Nat
bin/decide-succ-double-double
bin/decide-succ-double-double : (A B : ℕ) → nat/decide-at-most (data/succ (bin/double A)) (bin/double B) = nat/decide-at-most (data/succ A) B
= = equality/Eqℕ = data/Nat
bin/decide-double-zero
bin/decide-double-zero : (A : ℕ) → nat/decide-at-most (bin/double A) 0 = nat/decide-at-most A 0
= = equality/Eqℕ = data/Nat
bin/nonzero-reflects
bin/nonzero-reflects : (b : data/Bin) → bin/nonzero b = nat/decide-at-most 1 (bin/to-nat b)
= = equality/Eq
bin/compare-reflects
bin/compare-reflects : (a b : data/Bin) → data/Product (first = most₃) (second = most) where first := product/first data/Bool data/Bool (bin/compare a b) where most := nat/decide-at-most (data/succ (bin/to-nat a)) (bin/to-nat b) where most₃ := nat/decide-at-most (bin/to-nat a) (bin/to-nat b) where second := product/second data/Bool data/Bool (bin/compare a b)
= = equality/Eq
bin/at-most-reflects
bin/at-most-reflects : (a b : data/Bin) → bin/at-most a b = nat/decide-at-most (bin/to-nat a) (bin/to-nat b)
= = equality/Eq