comparison sandbox/SetWithConstraint.agda @ 34:d9b394c245c5

Set with constraint
author atton <atton@cr.ie.u-ryukyu.ac.jp>
date Mon, 02 Jan 2017 03:17:18 +0000
parents 35ea84d35079
children bf667ec8cba4
comparison
equal deleted inserted replaced
33:35ea84d35079 34:d9b394c245c5
11 11
12 data MySet (A : Set) : Set where 12 data MySet (A : Set) : Set where
13 empty : MySet A 13 empty : MySet A
14 cons : (String × A) -> MySet A -> MySet A 14 cons : (String × A) -> MySet A -> MySet A
15 15
16 elem : {A : Set} -> String -> MySet A -> Bool
17 elem a empty = false
18 elem a (cons (k , v) s) = elem' (a == k) a (k , v) s
19 where
20 elem' : {A : Set} -> Bool -> String -> (String × A) -> MySet A -> Bool
21 elem' false a p s = elem a s
22 elem' true _ _ _ = true
23
24
25 insert' : {A : Set} -> Bool -> (String × A) -> MySet A -> MySet A
26 insert' false p s = cons p s
27 insert' true _ s = s
28
16 insert : {A : Set} -> (String × A) -> MySet A -> MySet A 29 insert : {A : Set} -> (String × A) -> MySet A -> MySet A
17 insert (k , v) empty = cons (k , v) empty 30 insert (k , v) empty = cons (k , v) empty
18 insert (k , v) (cons (sk , sv) s) with (k == sk) 31 insert (k , v) s = insert' (elem k s) (k , v) s
19 ... | true = cons (sk , sv) s 32
20 ... | false = cons (sk , sv) (insert (k , v) s)
21 33
22 length : {A : Set} -> MySet A -> ℕ 34 length : {A : Set} -> MySet A -> ℕ
23 length empty = 0 35 length empty = 0
24 length (cons _ s) = suc (length s) 36 length (cons _ s) = suc (length s)
25
26 elem : {A : Set} -> String -> MySet A -> Bool
27 elem a empty = false
28 elem a (cons (k , v) s) with a == k
29 ... | true = true
30 ... | false = elem a s
31 37
32 head : {A : Set} -> MySet A -> Maybe (String × A) 38 head : {A : Set} -> MySet A -> Maybe (String × A)
33 head empty = nothing 39 head empty = nothing
34 head (cons x _) = just x 40 head (cons x _) = just x
35 41
41 empty-insert-length : (s : MySet ℕ) -> length (insert ("a" , 100) empty) ≡ 1 47 empty-insert-length : (s : MySet ℕ) -> length (insert ("a" , 100) empty) ≡ 1
42 empty-insert-length s = refl 48 empty-insert-length s = refl
43 49
44 open ≡-Reasoning 50 open ≡-Reasoning
45 51
46 expand-non-elem : (k : String) (s : MySet ℕ) -> (nonElem : elem k s ≡ false) -> (just k ≢ (Data.Maybe.map proj₁ (head s)))
47 expand-non-elem k empty nonElem = {!!}
48 expand-non-elem k (cons x s) nonElem = {!!}
49
50
51 insert-length : (k : String) (n : ℕ )(s : MySet ℕ) {nonElem : elem k s ≡ false} -> length (insert (k , n) s) ≡ suc (length s) 52 insert-length : (k : String) (n : ℕ )(s : MySet ℕ) {nonElem : elem k s ≡ false} -> length (insert (k , n) s) ≡ suc (length s)
52 insert-length k n empty = refl 53 insert-length k n empty = refl
53 insert-length k n (cons (ks , vs) s) {nonElem} = begin 54 insert-length k n (cons (ks , vs) s) {nonElem} = begin
54 length (insert (k , n) (cons (ks , vs) s)) 55 length (insert (k , n) (cons (ks , vs) s))
55 ≡⟨ {!!} ⟩ 56 ≡⟨ refl ⟩
57 length (insert' (elem k (cons (ks , vs) s)) (k , n) (cons (ks , vs) s))
58 ≡⟨ cong (\e -> length (insert' e (k , n) (cons (ks , vs) s))) nonElem ⟩
59 length (insert' false (k , n) (cons (ks , vs) s))
60 ≡⟨ refl ⟩
56 suc (suc (length s)) 61 suc (suc (length s))
57 62