0 | module Data.Bytes.Proofs
2 | import Data.Fin.Arith
7 | data IsMultN : Nat -> Nat -> Type where
9 | PlusN : IsMultN n m -> IsMultN n (n `plus` m)
12 | isMultN : (n: Nat) -> (m: Nat) -> Maybe (IsMultN n m)
13 | isMultN 0 m = Nothing
15 | case (reflexiveDivMult m (S n) (ItIsSucc)) of
16 | Just prf => Just (rewrite prf in (isMultNInner (divNatNZ m (S n) (ItIsSucc))))
20 | isMultNInner : (count: Nat) -> IsMultN (S n) (count * (S n))
21 | isMultNInner 0 = ZeroN
22 | isMultNInner (S c) = PlusN (isMultNInner c)
24 | reflexiveDivMult: (m: Nat) -> (n: Nat) -> (0 prf : NonZero n) -> Maybe (m = mult (divNatNZ m n prf) n)
25 | reflexiveDivMult m n prf =
26 | case (modNatNZ m n prf) of
30 | Z => Just (believe_me (m = mult (divNatNZ m n prf) n))
34 | viewMultN : (0 n: Nat) -> (0 m : Nat) -> (prf : IsMultN n m) -> (x : Nat ** m = x * n)
35 | viewMultN _ 0 ZeroN = (
0 ** Refl)
36 | viewMultN n (plus n m) (PlusN prf) =
37 | let (
x' ** prf')
= viewMultN n m prf
38 | in (
S x' ** multSucc prf')
where
39 | multSucc : m = mult x n -> (n `plus` m) = mult (S x) n
40 | multSucc prf = rewrite prf in Refl
43 | byteToBits: {byteSize: Nat} -> Fin byteSize -> Fin (byteSize * 8)
44 | byteToBits {byteSize = 0} _ impossible
45 | byteToBits {byteSize = S k} n =
46 | let x: Fin (S (k * 8)) = n * the (Fin 9) 8
47 | in rewrite plusCommutative 7 (mult k 8)