10 | factRec (S k) = (S k) * factRec k
13 | factAcc : Nat -> Nat -> Nat
15 | factAcc (S k) acc = factAcc k $
(S k) * acc
18 | factItr : Nat -> Nat
19 | factItr n = factAcc n 1
24 | multShuffle : (a, b, c : Nat) -> a * (b * c) = b * (a * c)
26 | rewrite multAssociative a b c in
27 | rewrite multCommutative a b in
28 | sym $
multAssociative b a c
31 | factAccMult : (a, b, c : Nat) ->
32 | a * factAcc b c = factAcc b (a * c)
33 | factAccMult _ Z _ = Refl
34 | factAccMult a (S k) c =
35 | rewrite factAccMult a k (S k * c) in
36 | rewrite multShuffle a (S k) c in
40 | factAccPlus : (a, b, c : Nat) ->
41 | factAcc a b + factAcc a c = factAcc a (b + c)
42 | factAccPlus Z _ _ = Refl
43 | factAccPlus (S k) b c =
44 | rewrite factAccPlus k (S k * b) (S k * c) in
45 | rewrite sym $
multDistributesOverPlusRight (S k) b c in
49 | factRecItr : (n : Nat) -> factRec n = factItr n
52 | rewrite factRecItr k in
53 | rewrite factAccMult k k 1 in
54 | rewrite multOneRightNeutral k in