1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
| module reverse where
open import Relation.Binary.PropositionalEquality
open ≡Reasoning
data List {i} (A : Set i) : Set i where
[] : List A
_∷_ : A → List A → List A
infixr 6 _∷_
_++_ : ∀ {i}{A : Set i} → List A → List A → List A
[] ++ ys = ys
(x ∷ xs) ++ ys = x ∷ (xs ++ ys)
infixl 5 _++_
++-rightunit : ∀ {i}{A : Set i}
→ (xs : List A)
→ xs ++ [] ≡ xs
++-rightunit [] = refl
++-rightunit (x ∷ xs) = cong (_∷_ x) (++-rightunit xs)
++-assoc : ∀ {i}{A : Set i}
→ (xs ys zs : List A)
→ xs ++ ys ++ zs
≡ xs ++ (ys ++ zs)
++-assoc [] ys zs = refl
++-assoc (x ∷ xs) ys zs = cong (_∷_ x) (++-assoc xs ys zs)
reverse : ∀ {i}{A : Set i} → List A → List A
reverse [] = []
reverse (x ∷ xs) = reverse xs ++ x ∷ []
reversehom : ∀ {i}{A : Set i}
→ (xs ys : List A)
→ reverse (xs ++ ys)
≡ reverse ys ++ reverse xs
reversehom [] ys = sym (++-rightunit (reverse ys))
reversehom (x ∷ xs) ys = begin
reverse ((x ∷ xs) ++ ys)
≡⟨ cong (λ α → α ++ x ∷ []) (reversehom xs ys) ⟩
reverse ys ++ reverse xs ++ x ∷ []
≡⟨ ++-assoc (reverse ys) (reverse xs) (x ∷ []) ⟩
reverse ys ++ reverse (x ∷ xs)
∎
reverseidemp : ∀ {i}{A : Set i}
→ (xs : List A)
→ reverse (reverse xs) ≡ xs
reverseidemp [] = refl
reverseidemp (x ∷ xs) = begin
reverse (reverse xs ++ x ∷ [])
≡⟨ reversehom (reverse xs) (x ∷ []) ⟩
x ∷ reverse (reverse xs)
≡⟨ cong (_∷_ x) (reverseidemp xs) ⟩
x ∷ xs
∎
|