--
import "Bits.html" -- see Bits.html source here. ----------------------------------------------------- add3Bits:: Bit i -> Bit j -> Bit k -> Seq Bit 2t {plus i {plus j k}} add3Bits Zero Zero Zero = [Zero,Zero]b add3Bits Zero Zero One = [One,Zero]b add3Bits Zero One Zero = [One,Zero]b add3Bits Zero One One = [Zero,One]b add3Bits One Zero Zero = [One,Zero]b add3Bits One Zero One = [Zero,One]b add3Bits One One Zero = [Zero,One]b add3Bits One One One = [One,One]b adder':: Bit i -> Seq Bit n j -> Seq Bit n k -> Seq Bit (S n) {plus i {plus j k}} adder' carry Nil Nil = Cons carry Nil where theorem plusZ adder' carry (Cons b xs) (Cons c ys) = Cons ans tail where [ans,carry2]b = add3Bits carry b c tail = adder' carry2 xs ys theorem plusAssoc, plusNorm -- When you're just getting started don't need to specifiy a carry bit adder:: Seq Bit n i -> Seq Bit n j -> Seq Bit (S n) {plus i j} adder x y = adder' Zero x y --------------------------------------------------- -- Now lets make an adder using symbolic bits. -- We'll need a very specific lemma, but it is -- easy to prove by exhaustive analysis. lemma:: Bit a -> Bit b -> Bit c -> Equal {plus {plus {or {and a b} {or {and a c} {and b c}}} {or {and a b} {or {and a c} {and b c}}}} {xor a {xor b c}}} {plus a {plus b c}} lemma Zero Zero Zero = Eq lemma Zero Zero One = Eq lemma Zero One Zero = Eq lemma Zero One One = Eq lemma One Zero Zero = Eq lemma One Zero One = Eq lemma One One Zero = Eq lemma One One One = Eq add3SymBits:: SymBit i -> SymBit j -> SymBit k -> Seq SymBit 2t {plus i {plus j k}} add3SymBits i j k = check [Xor i (Xor j k), Or (And i j) (Or (And i k) (And j k))]b where theorem hyp = lemma (eval i) (eval j) (eval k) adderS:: SymBit i -> Seq SymBit n j -> Seq SymBit n k -> Seq SymBit (S n) {plus i {plus j k}} adderS carry Nil Nil = Cons carry Nil where theorem plusZ adderS carry (Cons b xs) (Cons c ys) = Cons ans tail where [ans,carry2]b = add3SymBits carry b c tail = adderS carry2 xs ys theorem plusAssoc, plusNorm two = [Var "x",Var "y"]b one = [Var "m", Var "n"]b three = [I,I,O]b ans = (adderS O two one) ans2 = adderS O (adderS O two one) three --