annotate a02/agda/list.agda @ 406:a60132983557

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 08 Nov 2023 21:35:54 +0900
parents e5cf49902db3
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
138
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 module list where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 postulate A : Set
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 postulate a : A
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 postulate b : A
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 postulate c : A
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 infixr 40 _::_
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 data List (A : Set ) : Set where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 [] : List A
266
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
13 _::_ : A → List A → List A
138
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14
266
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
15 --
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
16 -- A List A
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
17 -- -------------- [] ---------------- _::_
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
18 -- List A List A
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
19 --
138
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 infixl 30 _++_
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 _++_ : {A : Set } → List A → List A → List A
266
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
23 [] ++ y = y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
24 (x :: x₁) ++ y = x :: (x₁ ++ y )
138
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 l1 = a :: []
266
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
27 l2 = a :: b :: a :: c :: []
138
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
28
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 l3 = l1 ++ l2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 data Node ( A : Set ) : Set where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 leaf : A → Node A
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 node : Node A → Node A → Node A
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 flatten : { A : Set } → Node A → List A
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 flatten ( leaf a ) = a :: []
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 flatten ( node a b ) = flatten a ++ flatten b
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 n1 = node ( leaf a ) ( node ( leaf b ) ( leaf c ))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 open import Relation.Binary.PropositionalEquality
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 ++-assoc : (L : Set ) ( xs ys zs : List L ) → (xs ++ ys) ++ zs ≡ xs ++ (ys ++ zs)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 ++-assoc A [] ys zs = let open ≡-Reasoning in
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 begin -- to prove ([] ++ ys) ++ zs ≡ [] ++ (ys ++ zs)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 ( [] ++ ys ) ++ zs
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 ≡⟨ refl ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 ys ++ zs
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 ≡⟨⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 [] ++ ( ys ++ zs )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 ++-assoc A (x :: xs) ys zs = let open ≡-Reasoning in
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 begin -- to prove ((x :: xs) ++ ys) ++ zs == (x :: xs) ++ (ys ++ zs)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 ((x :: xs) ++ ys) ++ zs
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 ≡⟨ refl ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 (x :: (xs ++ ys)) ++ zs
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 ≡⟨ refl ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 x :: ((xs ++ ys) ++ zs)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 ≡⟨ cong (_::_ x) (++-assoc A xs ys zs) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 x :: (xs ++ (ys ++ zs))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 ≡⟨ refl ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 (x :: xs) ++ (ys ++ zs)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
64
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
65
266
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
66 -- open import Data.Nat
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
67
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
68 data Nat : Set where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
69 zero : Nat
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
70 suc : Nat → Nat
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
71
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
72 _+_ : Nat → Nat → Nat
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
73 zero + y = y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
74 suc x + y = suc (x + y)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
75
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
76 sym1 : {A : Set} → {a b : A} → a ≡ b → b ≡ a
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
77 sym1 {_} {a} {.a} refl = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
78
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
79 trans1 : {A : Set} → {a b c : A} → a ≡ b → b ≡ c → a ≡ c
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
80 trans1 {_} {a} {b} {.a} refl refl = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
81
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
82 cong1 : {A B : Set} → {a b : A} → (f : A → B) → a ≡ b → f a ≡ f b
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
83 cong1 f refl = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
84
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
85 induction : (P : (x : Nat) → Set) → (initial : P zero ) → (induction-setp : ((x : Nat) → P x → P (suc x))) → (x : Nat) → P x
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
86 induction P initial induction-setp zero = initial
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
87 induction P initial induction-setp (suc x) = induction-setp x ( induction P initial induction-setp x)
138
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
88
266
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
89 induction' : (P : (x : Nat) → Set) → (initial : P zero ) → (induction-setp : ((x : Nat) → P x → P (suc x))) → (x : Nat) → P x
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
90 induction' P initial induction-setp x = {!!} where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
91 ind1 : {!!} → P x
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
92 ind1 = {!!}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
93
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
94 +-comm : {x y : Nat} → x + y ≡ y + x
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
95 +-comm {zero} {y} = sym1 lemma01 where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
96 lemma01 : {y : Nat} → y + zero ≡ y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
97 lemma01 {zero} = refl -- (zero + zero ) → zero → zero + zero ≡ zero
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
98 lemma01 {suc y} = cong1 (λ x → suc x) (lemma01 {y}) --- (suc y + zero) ≡ suc y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
99 -- suc (y + zero) ≡ suc y ← y + zero ≡ y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
100 +-comm {suc x} {y} = {!!}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
101
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
102 _*_ : Nat → Nat → Nat
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
103 zero * y = zero
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
104 suc x * y = y + (x * y)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
105
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
106 --
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
107 -- * * * * *
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
108 -- * * * ≡ * *
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
109 -- * *
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
110
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
111 *-comm : {x y : Nat} → x * y ≡ y * x
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
112 *-comm = {!!}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
113
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
114 length : {L : Set} → List L → Nat
138
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 length [] = zero
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 length (_ :: T ) = suc ( length T )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
117
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 lemma : {L : Set} → (x y : List L ) → ( length x + length y ) ≡ length ( x ++ y )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 lemma [] [] = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 lemma [] (_ :: _) = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
121 lemma (H :: T) L = let open ≡-Reasoning in
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
122 begin
266
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
123 {!!}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
124 ≡⟨ {!!} ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
125 {!!}
138
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
126
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
127