11 | fibRec (S (S k)) = fibRec (S k) + fibRec k
14 | fibAcc : Nat -> Nat -> Nat -> Nat
16 | fibAcc (S k) a b = fibAcc k b (a + b)
20 | fibItr n = fibAcc n 0 1
23 | plusLemma : (a, b, c, d : Nat) -> (a + b) + (c + d) = (a + c) + (b + d)
25 | rewrite sym $
plusAssociative a b (c + d) in
26 | rewrite plusAssociative b c d in
27 | rewrite plusCommutative b c in
28 | rewrite sym $
plusAssociative c b d in
29 | plusAssociative a c (b + d)
32 | fibAdd : (n, a, b, c, d : Nat) ->
33 | fibAcc n a b + fibAcc n c d = fibAcc n (a + c) (b + d)
34 | fibAdd Z _ _ _ _ = Refl
35 | fibAdd (S Z) _ _ _ _ = Refl
36 | fibAdd (S (S k)) a b c d =
37 | rewrite fibAdd k (a + b) (b + (a + b)) (c + d) (d + (c + d)) in
38 | rewrite plusLemma b (a + b) d (c + d) in
39 | rewrite plusLemma a b c d in
43 | fibEq : (n : Nat) -> fibRec n = fibItr n
48 | rewrite fibEq (S k) in