comparison list-level.agda @ 153:3249aaddc405

sync
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 17 Aug 2013 21:09:34 +0900
parents
children d6a6dd305da2
comparison
equal deleted inserted replaced
152:5435469c6cf0 153:3249aaddc405
1 module list-level where
2
3 open import Level
4
5
6 postulate A : Set
7 postulate B : Set
8 postulate C : Set
9
10 postulate a : A
11 postulate b : A
12 postulate c : A
13
14
15 infixr 40 _::_
16 data List {a} (A : Set a) : Set a where
17 [] : List A
18 _::_ : A -> List A -> List A
19
20
21 infixl 30 _++_
22 _++_ : ∀ {a} {A : Set a} -> List A -> List A -> List A
23 [] ++ ys = ys
24 (x :: xs) ++ ys = x :: (xs ++ ys)
25
26 l1 = a :: []
27 l2 = a :: b :: a :: c :: []
28
29 l3 = l1 ++ l2
30
31 L1 = A :: []
32 L2 = A :: B :: A :: C :: []
33
34 L3 = L1 ++ L2
35
36 data Node {a} ( A : Set a ) : Set a where
37 leaf : A -> Node A
38 node : Node A -> Node A -> Node A
39
40 flatten : ∀{n} { A : Set n } -> Node A -> List A
41 flatten ( leaf a ) = a :: []
42 flatten ( node a b ) = flatten a ++ flatten b
43
44 n1 = node ( leaf a ) ( node ( leaf b ) ( leaf c ))
45
46 open import Relation.Binary.PropositionalEquality
47
48 infixr 20 _==_
49
50 data _==_ {n} {A : Set n} : List A -> List A -> Set n where
51 reflection : {x : List A} -> x == x
52
53 cong1 : ∀{a} {A : Set a } {b} { B : Set b } ->
54 ( f : List A -> List B ) -> {x : List A } -> {y : List A} -> x == y -> f x == f y
55 cong1 f reflection = reflection
56
57 eq-cons : ∀{n} {A : Set n} {x y : List A} ( a : A ) -> x == y -> ( a :: x ) == ( a :: y )
58 eq-cons a z = cong1 ( \x -> ( a :: x) ) z
59
60 trans-list : ∀{n} {A : Set n} {x y z : List A} -> x == y -> y == z -> x == z
61 trans-list reflection reflection = reflection
62
63
64 ==-to-≡ : ∀{n} {A : Set n} {x y : List A} -> x == y -> x ≡ y
65 ==-to-≡ reflection = refl
66
67 list-id-l : { A : Set } -> { x : List A} -> [] ++ x == x
68 list-id-l = reflection
69
70 list-id-r : { A : Set } -> ( x : List A ) -> x ++ [] == x
71 list-id-r [] = reflection
72 list-id-r (x :: xs) = eq-cons x ( list-id-r xs )
73
74 list-assoc : {A : Set } -> ( xs ys zs : List A ) ->
75 ( ( xs ++ ys ) ++ zs ) == ( xs ++ ( ys ++ zs ) )
76 list-assoc [] ys zs = reflection
77 list-assoc (x :: xs) ys zs = eq-cons x ( list-assoc xs ys zs )
78
79
80 module ==-Reasoning {n} (A : Set n ) where
81
82 infixr 2 _∎
83 infixr 2 _==⟨_⟩_ _==⟨⟩_
84 infix 1 begin_
85
86
87 data _IsRelatedTo_ (x y : List A) :
88 Set n where
89 relTo : (x≈y : x == y ) → x IsRelatedTo y
90
91 begin_ : {x : List A } {y : List A} →
92 x IsRelatedTo y → x == y
93 begin relTo x≈y = x≈y
94
95 _==⟨_⟩_ : (x : List A ) {y z : List A} →
96 x == y → y IsRelatedTo z → x IsRelatedTo z
97 _ ==⟨ x≈y ⟩ relTo y≈z = relTo (trans-list x≈y y≈z)
98
99 _==⟨⟩_ : (x : List A ) {y : List A}
100 → x IsRelatedTo y → x IsRelatedTo y
101 _ ==⟨⟩ x≈y = x≈y
102
103 _∎ : (x : List A ) → x IsRelatedTo x
104 _∎ _ = relTo reflection
105
106 lemma11 : ∀{n} (A : Set n) ( x : List A ) -> x == x
107 lemma11 A x = let open ==-Reasoning A in
108 begin x ∎
109
110 ++-assoc : ∀{n} (L : Set n) ( xs ys zs : List L ) -> (xs ++ ys) ++ zs == xs ++ (ys ++ zs)
111 ++-assoc A [] ys zs = let open ==-Reasoning A in
112 begin -- to prove ([] ++ ys) ++ zs == [] ++ (ys ++ zs)
113 ( [] ++ ys ) ++ zs
114 ==⟨ reflection ⟩
115 ys ++ zs
116 ==⟨ reflection ⟩
117 [] ++ ( ys ++ zs )
118
119
120 ++-assoc A (x :: xs) ys zs = let open ==-Reasoning A in
121 begin -- to prove ((x :: xs) ++ ys) ++ zs == (x :: xs) ++ (ys ++ zs)
122 ((x :: xs) ++ ys) ++ zs
123 ==⟨ reflection ⟩
124 (x :: (xs ++ ys)) ++ zs
125 ==⟨ reflection ⟩
126 x :: ((xs ++ ys) ++ zs)
127 ==⟨ cong1 (_::_ x) (++-assoc A xs ys zs) ⟩
128 x :: (xs ++ (ys ++ zs))
129 ==⟨ reflection ⟩
130 (x :: xs) ++ (ys ++ zs)
131
132
133
134
135 --data Bool : Set where
136 -- true : Bool
137 -- false : Bool
138
139
140 --postulate Obj : Set
141
142 --postulate Hom : Obj -> Obj -> Set
143
144
145 --postulate id : { a : Obj } -> Hom a a
146
147
148 --infixr 80 _○_
149 --postulate _○_ : { a b c : Obj } -> Hom b c -> Hom a b -> Hom a c
150
151 -- postulate axId1 : {a b : Obj} -> ( f : Hom a b ) -> f == id ○ f
152 -- postulate axId2 : {a b : Obj} -> ( f : Hom a b ) -> f == f ○ id
153
154 --assoc : { a b c d : Obj } ->
155 -- (f : Hom c d ) -> (g : Hom b c) -> (h : Hom a b) ->
156 -- (f ○ g) ○ h == f ○ ( g ○ h)
157
158
159 --a = Set
160
161 -- ListObj : {A : Set} -> List A
162 -- ListObj = List Set
163
164 -- ListHom : ListObj -> ListObj -> Set
165