1 | module Data.List.Reverse
13 | reverseOntoAcc : (xs, ys, zs : List a) ->
14 | reverseOnto (ys ++ zs) xs = (reverseOnto ys xs) ++ zs
15 | reverseOntoAcc [] _ _ = Refl
16 | reverseOntoAcc (x :: xs) (ys) (zs) = reverseOntoAcc xs (x :: ys) zs
20 | reverseOntoSpec : (xs, ys : List a) -> reverseOnto xs ys = reverse ys ++ xs
21 | reverseOntoSpec xs ys = reverseOntoAcc ys [] xs
26 | reverseNil : reverse [] = []
32 | reverseCons : (x : a) -> (xs : List a) -> reverse (x::xs) = reverse xs `snoc` x
33 | reverseCons x xs = reverseOntoSpec [x] xs
37 | 0 slowReverse : List a -> List a
39 | slowReverse (x :: xs) = slowReverse xs `snoc` x
43 | reverseEquiv : (xs : List a) -> slowReverse xs = reverse xs
44 | reverseEquiv [] = Refl
45 | reverseEquiv (x :: xs) =
46 | rewrite reverseEquiv xs in
47 | rewrite revAppend [x] xs in
52 | reverseSingletonId : (x : a) -> reverse [x] = [x]
53 | reverseSingletonId _ = Refl
57 | reverseOntoLength : (xs, acc : List a) ->
58 | length (reverseOnto acc xs) = length acc + length xs
59 | reverseOntoLength [] acc = rewrite plusZeroRightNeutral (length acc) in Refl
60 | reverseOntoLength (x :: xs) acc =
61 | rewrite reverseOntoLength xs (x :: acc) in
62 | plusSuccRightSucc (length acc) (length xs)
66 | reverseLength : (xs : List a) -> length (reverse xs) = length xs
67 | reverseLength xs = reverseOntoLength xs []
71 | reverseEqual : (xs, ys : List a) -> reverse xs = reverse ys -> xs = ys
72 | reverseEqual xs ys prf =
73 | rewrite sym $
reverseInvolutive xs in
75 | reverseInvolutive ys