proofs/word_encoding.bend checks
raw source on the hub · import stelliferous@0.0.2.0/proofs/word_encoding.bend as Word_encoding
General-width bit-vector arithmetic used by the native-address obligation.
1 import
import Base
Laws
law double_add proved
Also proved in bend-mathlib as nat.double_add: import bend-mathlib@0.7.2.0/nat.bend as MNat, then MNat.double_add.
@+a:Nat -> @+b:Nat -> {Nat.double(Nat.add(a, b)) == Nat.add(Nat.double(a), Nat.double(b)) : Nat}
law zero_nat provedsource · line 35 · raw
@+n:Nat -> {Word.to_nat(n, Word.zero(n)) == 0n : Nat}
law finish_lt_zero provedsource · line 47 · raw
@+b:Bool -> @+c:Cmp -> {Cmp.is_lt(Word.cmp.fin(b, False{}, c)) == Cmp.is_lt(c) : Bool}
law compare_high_only provedsource · line 67 · raw
@+n:Nat -> @+m:Nat -> @+w:Word(n) -> @+top:Word(m) -> @+other:Word(m) -> {Cmp.is_lt(Word.cmp(Nat.add(n, m), concat(n, m, w, top), concat(n, m, Word.zero(n), other))) == Cmp.is_lt(Word.cmp(m, top, other)) : Bool}
law nonnegative provedsource · line 88 · raw
@+n:Nat -> @+w:Word(n) -> {Cmp.is_lt(Word.cmp(n, w, Word.zero(n))) == False{} : Bool}
law finish_one provedsource · line 116 · raw
@+b:Bool -> @+c:Cmp -> @nonneg:{Cmp.is_lt(c) == False{} : Bool} -> {Cmp.is_lt(Word.cmp.fin(b, True{}, c)) == Cmp.is_eq(Word.cmp.fin(b, False{}, c)) : Bool}
law less_one_is_zero provedsource · line 137 · raw
@+n:Nat -> @+w:Word(1n+n) -> {Cmp.is_lt(Word.cmp(1n+n, w, WCon{True{}, Word.zero(n)})) == Cmp.is_eq(Word.cmp(1n+n, w, Word.zero(1n+n))) : Bool}
law join_prepend provedsource · line 167 · raw
@+n:Nat -> @+m:Nat -> @+b:Bool -> @+parts:Split<n, m> -> {WCon{b, join(n, m, parts)} == join(1n+n, m, prepend(n, m, b, parts)) : Word(1n+Nat.add(n, m))}
law recover provedsource · line 178 · raw
@+n:Nat -> @+m:Nat -> @+w:Word(Nat.add(n, m)) -> {join(n, m, split(n, m, w)) == w : Word(Nat.add(n, m))}
law cmp_eq provedsource · line 195 · raw
@+c:Cmp -> @yes:{Cmp.is_eq(c) == True{} : Bool} -> {c == EQ{} : Cmp}
law finish_eq_parts provedsource · line 209 · raw
@+b:Bool -> @+c:Cmp -> @eq:{Word.cmp.fin(b, False{}, c) == EQ{} : Cmp} -> Pair({b == False{} : Bool}, {c == EQ{} : Cmp})
law zero_reflect provedsource · line 230 · raw
@+n:Nat -> @+w:Word(n) -> @eq:{Word.cmp(n, w, Word.zero(n)) == EQ{} : Cmp} -> {w == Word.zero(n) : Word(n)}
law below_one_zero provedsource · line 254 · raw
@+n:Nat -> @+w:Word(1n+n) -> @below:{Cmp.is_lt(Word.cmp(1n+n, w, WCon{True{}, Word.zero(n)})) == True{} : Bool} -> {w == Word.zero(1n+n) : Word(1n+n)}
law and_zero provedsource · line 265 · raw
@+n:Nat -> @+w:Word(n) -> {Word.and(n, w, Word.zero(n)) == Word.zero(n) : Word(n)}
law upper_zero provedsource · line 285 · raw
@+n:Nat -> @+m:Nat -> @+low:Word(n) -> @+high:Word(1n+m) -> @bound:{Cmp.is_lt(Word.cmp(Nat.add(n, 1n+m), concat(n, 1n+m, low, high), concat(n, 1n+m, Word.zero(n), WCon{True{}, Word.zero(m)}))) == True{} : Bool} -> {high == Word.zero(1n+m) : Word(1n+m)}
Types
type Split source · line 147 · raw
@-n:Nat -> @-m:Nat -> Data
Parts@-n:Nat -> @-m:Nat -> @low:Word(n) -> @high:Word(m) -> Split<n, m>
Definitions
def concat source · line 4 · raw
@+n:Nat -> @+m:Nat -> @w:Word(n) -> @tail:Word(m) -> Word(Nat.add(n, m))
def shift source · line 15 · raw
@n:Nat -> @x:Nat -> Nat
def truth source · line 105 · raw
@b:Bool -> Type
def false_true source · line 112 · raw
@e:{False{} == True{} : Bool} -> Empty
def join source · line 150 · raw
@+n:Nat -> @+m:Nat -> @parts:Split<n, m> -> Word(Nat.add(n, m))
def prepend source · line 154 · raw
@-n:Nat -> @-m:Nat -> @b:Bool -> @parts:Split<n, m> -> Split<1n+n, m>
def split source · line 158 · raw
@+n:Nat -> @+m:Nat -> @w:Word(Nat.add(n, m)) -> Split<n, m>
def zero_step source · line 236 · raw
@+p:Nat -> @+b:Bool -> @+rest:Word(p) -> @proof:Pair({b == False{} : Bool}, {Word.cmp(p, rest, Word.zero(p)) == EQ{} : Cmp}) -> @ih:(@_:{Word.cmp(p, rest, Word.zero(p)) == EQ{} : Cmp} -> {rest == Word.zero(p) : Word(p)}) -> {WCon{b, rest} == Word.zero(1n+p) : Word(1n+p)}