2 | import Data.Nat.Properties
3 | import Data.Binary.Digit
4 | import Syntax.PreorderReasoning
19 | toNat = foldr (\ b, acc => toNat b + 2 * acc) 0
26 | suc (O :: bs) = I :: bs
27 | suc (I :: bs) = O :: (suc bs)
31 | sucCorrect : {bs : Bin} -> toNat (suc bs) === S (toNat bs)
32 | sucCorrect {bs = []} = Refl
33 | sucCorrect {bs = O :: bs} = Refl
34 | sucCorrect {bs = I :: bs} = Calc $
35 | |~ toNat (suc (I :: bs))
36 | ~~ toNat (O :: suc bs) ...( Refl )
37 | ~~ 2 * toNat (suc bs) ...( Refl )
38 | ~~ 2 * S (toNat bs) ...( cong (2 *) sucCorrect )
39 | ~~ 2 + 2 * toNat bs ...( unfoldDoubleS )
40 | ~~ S (toNat (I :: bs)) ...( Refl )