annotate rbt_delete.agda @ 14:2521da2c3c9a

WIP rbt_delete
author soto
date Sat, 13 Feb 2021 07:00:18 +0900
parents ce192a384cb6
children 72ac6fa0b11c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
1 module rbt_delete where
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
2
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
3 open import Level renaming ( suc to succ ; zero to Zero )
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
4 open import Data.Nat hiding (compare)
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
5
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
6 open import Data.List
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
7 open import Data.Bool
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
8
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
9 open import Data.Nat.Properties as NatProp -- <-cmp
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
10 open import Relation.Binary -- need <-cmp relation
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
11
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
12 open import rbt_t
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
13
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
14 -- これあれか、またmergeする時にListにして今回はさらにbaranceも保持しないといけないのか
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
15 -- 再起処理側はmerge側に
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
16
14
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
17
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
18 test'1 = whileTestPCall' bt-empty 0
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
19 test'2 = whileTestPCall' (rbt_t.Env.vart test'1) 1
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
20 test'3 = whileTestPCall' (rbt_t.Env.vart test'2) 2
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
21 test'4 = whileTestPCall' (rbt_t.Env.vart test'3) 3
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
22 test'5 = whileTestPCall' (rbt_t.Env.vart test'4) 4
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
23 test'6 = whileTestPCall' (rbt_t.Env.vart test'5) 5
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
24 test'7 = whileTestPCall' (rbt_t.Env.vart test'6) 6
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
25 test'8 = whileTestPCall' (rbt_t.Env.vart test'7) 7
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
26 test'9 = whileTestPCall' (rbt_t.Env.vart test'8) 8
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
27 test'10 = whileTestPCall' (rbt_t.Env.vart test'9) 9
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
28 test'11 = whileTestPCall' (rbt_t.Env.vart test'10) 10
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
29 test'12 = whileTestPCall' (rbt_t.Env.vart test'11) 11
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
30 test'13 = whileTestPCall' (rbt_t.Env.vart test'12) 12
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
31 test'14 = whileTestPCall' (rbt_t.Env.vart test'13) 13
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
32 test'15 = whileTestPCall' (rbt_t.Env.vart test'14) 14
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
33
10
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
34 rbt-find : {le : Level} {t : Set le} → Env → (next : Env → t) → (exit : Env → t) → t
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
35 rbt-find env next exit with (Env.varn env)
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
36 ... | n with (Env.vart env)
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
37 ... | bt-empty = exit (record
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
38 { vart = bt-empty
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
39 ; varn = Env.varn env
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
40 ; varl = Env.varl env
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
41 })
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
42 ... | bt-node node with node.number (tree.key node)
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
43 ... | x with <-cmp n x
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
44 ... | tri≈ ¬a b ¬c = exit env
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
45 ... | tri< a ¬b ¬c = next (record
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
46 { vart = tree.ltree node
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
47 ; varn = Env.varn env
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
48 ; varl = Env.varl env
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
49 })
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
50 ... | tri> ¬a ¬b c = next (record
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
51 { vart = tree.rtree node
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
52 ; varn = Env.varn env
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
53 ; varl = Env.varl env
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
54 })
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
55
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
56 -- serch min
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
57 -- exit時は終了
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
58 -- next時は自己実行
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
59 rbt-search-min : {le : Level} {t : Set le} → Env → (next : Env → t) → (exit : Env → t) → t
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
60 rbt-search-min env next exit with Env.vart env
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
61 ... | bt-empty = exit env
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
62 ... | bt-node node with tree.ltree node
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
63 ... | bt-empty = exit env
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
64 ... | bt-node lnode = next (record
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
65 { vart = bt-node lnode
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
66 ; varn = Env.varn env
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
67 ; varl = Env.varl env
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
68 })
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
69
14
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
70 {-# TERMINATING #-}
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
71 search-min-p : {l : Level} {t : Set l} → Env → (exit : Env → t) → t
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
72 search-min-p env exit = rbt-search-min env (λ env → search-min-p env exit ) exit
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
73
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
74 search-min : rbt → ℕ
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
75 search-min tree = search-min-p (record { vart = tree ; varn = zero ; varl = [] }) (λ env → Env.varn env)
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
76
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
77 test-search-min = search-min (rbt_t.Env.vart test'15)
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
78
10
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
79 -- find(分岐から) 分岐後、delete → balance → 終了
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
80
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
81 -- 右も左もenptyならreturn node をexit
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
82 -- numberが一致しているなら, next(自己実行)へ
14
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
83 bt-delete-c : {le : Level} {t : Set le} → Env → (next : Env → t) → (exit : Env → t) → t
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
84 bt-delete-c env next exit with Env.vart env
10
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
85 ... | bt-empty = exit env
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
86 ... | bt-node node with (node.number (tree.key node))
14
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
87 ... | num with <-cmp num (Env.varn env)
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
88 ... | tri< a ¬b ¬c = next record env{vart = tree.ltree node; varl = (bt-node record node{ltree = bt-empty}) ∷ (Env.varl env)} -- listに左右どちらのbalanceなのか保持する。mergeする際にそれを参照する
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
89 ... | tri> ¬a ¬b c = next record env{vart = tree.rtree node; varl = (bt-node record node{rtree = bt-empty}) ∷ (Env.varl env)} -- 同上
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
90 ... | tri≈ ¬a b ¬c with node
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
91 ... | record { key = key ; ltree = bt-empty ; rtree = bt-empty } = exit record env{vart = bt-node record node {key = record key{coler = red} } } -- colerを赤にしてexit
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
92 ... | record { key = key ; ltree = bt-node ltree ; rtree = bt-empty } = exit record env{vart = bt-node record ltree{key = record key{coler = black}} } -- leftのcolerを黒にしてexit
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
93 ... | record { key = key ; ltree = bt-empty ; rtree = bt-node rtree } = next env -- なんかやって右balance
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
94 ... | record { key = key ; ltree = bt-node ltree ; rtree = bt-node rtree } = next env -- なんかやって右balance
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
95
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
96 merge-tree-c : {le : Level} {t : Set le} → Env → (next-bl : Env → t) → (next-br : Env → t) → (exit : Env → t) → t
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
97 merge-tree-c env next-bl next-br exit with Env.vart env
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
98 ... | bt-empty = exit env
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
99 ... | bt-node node with Env.varl env
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
100 ... | [] = exit env
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
101 ... | bt-empty ∷ varl = exit env
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
102 ... | bt-node xtree ∷ varl with <-cmp (node.number (tree.key node)) (node.number (tree.key xtree))
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
103 ... | tri≈ ¬a b ¬c = exit env
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
104 ... | tri< a ¬b ¬c = next-bl record env{vart = bt-node record xtree{ltree = Env.vart env} ; varl = varl}
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
105 ... | tri> ¬a ¬b c = next-br record env{vart = bt-node record xtree{rtree = Env.vart env} ; varl = varl}
10
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
106
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
107 -- bt-delete record { vart = bt-empty ; varn = varn ; varl = varl } selfdo next exit = {!!}
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
108 -- bt-delete record { vart = (bt-node record { key = key ; ltree = ltree ; rtree = rtree }) ; varn = varn ; varl = varl } selfdo next exit = {!!}
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
109
14
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
110 -- do branch
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
111 -- next12 rotate_left → barance-12-c
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
112 -- next47 part-tree → rotate_right → barance-47-bc → rotate_left → barance-47-fc
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
113 -- exit merge_tree
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
114 balance_left-c : {le : Level} {t : Set le} → Env → (next12 : Env → t) → (next47 : Env → t) → (exit : Env → t) → t
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
115 balance_left-c env next12 next47 exit with (Env.varn env) -- flag
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
116 ... | suc d = exit env -- flug true
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
117 ... | zero with (Env.vart env)
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
118 ... | bt-empty = exit env
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
119 ... | bt-node node with (tree.rtree node)
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
120 ... | bt-empty = exit env
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
121 ... | bt-node rtree with (tree.ltree rtree)
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
122 ... | bt-empty = exit env
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
123 ... | bt-node rltree with (node.coler (tree.key rltree))
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
124 ... | black = next12 env
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
125 ... | red = next47 record env{vart = tree.rtree node; varl = (bt-node record node{rtree = bt-empty}) ∷ (Env.varl env)} -- part-treeする
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
126
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
127 -- next merge-tree
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
128 barance-12-c : {le : Level} {t : Set le} → Env → (next : Env → t) → t
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
129 barance-12-c env next with (Env.vart env)
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
130 ... | bt-empty = next env
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
131 ... | bt-node node with (node.coler (tree.key node))
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
132 ... | red = next record env{vart = bt-node record node{key = record (tree.key node){coler = black} } }
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
133 ... | black = next record env{varn = 0}
10
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
134
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
135
14
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
136 -- do merge-tree rtree
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
137 -- post rotate-left → barance-47-fc
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
138 barance-47-bc : {le : Level} {t : Set le} → Env → (next : Env → t) → (exit : Env → t) → t
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
139 barance-47-bc env next exit with (Env.varl env)
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
140 ... | [] = next env
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
141 ... | bt-empty ∷ s = next env
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
142 ... | bt-node node ∷ s = next record env{vart = bt-node record node{rtree = Env.vart env} ; varl = s}
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
143
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
144 -- do rewrite
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
145 -- post merge-tree
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
146 barance-47-fc : {le : Level} {t : Set le} → Env → (next : Env → t) → t
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
147 barance-47-fc env next with (Env.vart env)
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
148 ... | bt-empty = next env
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
149 ... | bt-node node with tree.ltree node
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
150 ... | bt-empty = next env
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
151 ... | bt-node ltree with tree.rtree node
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
152 ... | bt-empty = next env
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
153 ... | bt-node rtree = next record env{vart = bt-node record node{
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
154 rtree = bt-node record rtree{
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
155 key = record (tree.key rtree){
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
156 coler = black} } ;
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
157 ltree = bt-node record ltree{
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
158 key = record (tree.key ltree){
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
159 coler = black} } } }
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
160
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
161 -- do branch
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
162 -- next12 rewrite → barance-12-c
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
163 -- next3 barance-3c
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
164 -- next58 rotate_right → barance-58-c
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
165 -- exit merge_tree
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
166 balance_right-c : {le : Level} {t : Set le} → Env → (next12 : Env → t) → (next3 : Env → t) → (next58 : Env → t) → (exit : Env → t) → t
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
167 balance_right-c env next12 next3 next58 exit with (Env.varn env) -- flag
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
168 ... | suc d = exit env -- flug true
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
169 ... | zero with (Env.vart env)
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
170 ... | bt-empty = exit env
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
171 ... | bt-node node with (tree.ltree node)
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
172 ... | bt-empty = exit env
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
173 ... | bt-node ltree with (tree.ltree ltree)
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
174 ... | bt-empty = exit env
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
175 ... | bt-node lltree with (node.coler (tree.key lltree))
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
176 ... | red = next58 env
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
177 ... | black with (node.coler (tree.key ltree))
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
178 ... | black = next12 record env{vart = bt-node record node{
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
179 ltree = bt-node record ltree{
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
180 key = record(tree.key ltree){
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
181 coler = red} }}}
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
182 ... | red = next3 env
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
183
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
184 -- do rewrite
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
185 -- post merge-tree
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
186 balance-58-c : {le : Level} {t : Set le} → Env → (next : Env → t) → t -- 47-bcと一緒
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
187 balance-58-c env next with (Env.vart env)
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
188 ... | bt-empty = next env
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
189 ... | bt-node node with tree.ltree node
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
190 ... | bt-empty = next env
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
191 ... | bt-node ltree with tree.rtree node
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
192 ... | bt-empty = next env
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
193 ... | bt-node rtree = next record env{vart = bt-node record node{
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
194 rtree = bt-node record rtree{
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
195 key = record (tree.key rtree){
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
196 coler = black} } ;
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
197 ltree = bt-node record ltree{
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
198 key = record (tree.key ltree){
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
199 coler = black} } } }
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
200
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
201 -- do branch
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
202 -- next-r rotate-right → barance-3-rc
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
203 -- next-l part-tree left → rotate-left → barance-3-lbc(marge-tree left) → rotate-right → barance-3-lfc
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
204 -- exit merge-tree
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
205 balance-3-c : {le : Level} {t : Set le} → Env → (next-r : Env → t) → (next-l : Env → t) → (exit : Env → t) → t
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
206 balance-3-c env next-r next-l exit with (Env.vart env)
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
207 ... | bt-empty = exit env
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
208 ... | bt-node node with tree.ltree node
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
209 ... | bt-empty = exit env
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
210 ... | bt-node ltree with tree.rtree ltree
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
211 ... | bt-empty = exit env
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
212 ... | bt-node lrtree with tree.ltree lrtree
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
213 ... | bt-empty = exit env
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
214 ... | bt-node lrltree with (node.coler (tree.key lrltree))
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
215 ... | black = next-r env
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
216 ... | red = next-l record env{vart = tree.ltree node; varl = (bt-node record node{ltree = bt-empty}) ∷ (Env.varl env)} -- part-tree left
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
217
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
218 -- do rewrite
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
219 -- next marge-tree
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
220 barance-3-rc : {le : Level} {t : Set le} → Env → (next : Env → t) → t
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
221 barance-3-rc env next with (Env.vart env)
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
222 ... | bt-empty = next env
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
223 ... | bt-node node with tree.rtree node
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
224 ... | bt-empty = next env
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
225 ... | bt-node rtree with tree.ltree rtree
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
226 ... | bt-empty = next env
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
227 ... | bt-node rltree = next record env{vart = bt-node record node{
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
228 rtree = bt-node record rtree{
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
229 key = record (tree.key rtree){
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
230 coler = black};
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
231 ltree = bt-node record rltree{
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
232 key = record (tree.key rltree){coler = red}} } } }
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
233
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
234 -- do marge-tree left
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
235 -- next rotate-right → barance-3-lfc
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
236 barance-3-lbc : {le : Level} {t : Set le} → Env → (next : Env → t) → (exit : Env → t) → t
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
237 barance-3-lbc env next exit with (Env.varl env)
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
238 ... | [] = exit env
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
239 ... | bt-empty ∷ s = exit env
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
240 ... | bt-node node ∷ s = next record env{vart = bt-node record node{ltree = Env.vart env} ; varl = s}
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
241
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
242 -- do rewrite
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
243 -- next marge-tree
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
244 barance-3-lfc : {le : Level} {t : Set le} → Env → (next : Env → t) → t
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
245 barance-3-lfc env next with (Env.vart env)
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
246 ... | bt-empty = next env
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
247 ... | bt-node node with tree.rtree node
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
248 ... | bt-empty = next env
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
249 ... | bt-node rtree with tree.ltree node
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
250 ... | bt-empty = next env
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
251 ... | bt-node ltree with tree.rtree ltree
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
252 ... | bt-empty = next env
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
253 ... | bt-node lrtree = next record env{vart = bt-node record node{
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
254 rtree = bt-node record rtree{
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
255 key = record (tree.key rtree){
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
256 coler = black};
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
257 ltree = bt-node record lrtree{
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
258 key = record (tree.key lrtree){coler = red}} } } }
10
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
259
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
260 {-# TERMINATING #-}
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
261 find-com : {l : Level} {t : Set l} → Env → (exit : Env → t) → t
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
262 find-com env exit = rbt-find env (λ env → find-com env exit ) exit
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
263
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
264 --init
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
265 find : {l : Level} {t : Set l} → rbt → ℕ → (exit : Env → t) → t
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
266 find tree num exit = find-com (record{ vart = tree ; varn = num; varl = [] }) exit
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
267
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
268 open import Agda.Builtin.Nat
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
269
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
270 check-find : Env → ℕ → Bool
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
271 check-find tree num with Env.vart tree
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
272 ... | bt-empty = false
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
273 ... | bt-node node with node.number (tree.key node)
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
274 ... | n = n == num
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
275
14
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
276
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
277 {-# TERMINATING #-}
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
278 bt-delete-p : {l : Level} {t : Set l} → Env → (exit : Env → t) → t
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
279 bt-delete-p env exit = bt-delete-c env (λ env → bt-delete-p env exit) exit
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
280
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
281 balance-12-p : {l : Level} {t : Set l} → Env → (exit : Env → t) → t
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
282 balance-12-p env exit = merge-rotate-left env (λ env → barance-12-c env exit) exit
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
283
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
284 balance-47-p : {l : Level} {t : Set l} → Env → (exit : Env → t) → t
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
285 balance-47-p env exit = merge-rotate-right env (λ env → barance-47-bc env (λ env → merge-rotate-left env (λ env → barance-47-fc env exit) exit) exit) exit
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
286
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
287 -- exit merge-tree
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
288 balance_left-p : {l : Level} {t : Set l} → Env → (exit : Env → t) → t
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
289 balance_left-p env exit = balance_left-c env (λ env → balance-12-p env exit) (λ env → balance-47-p env exit) exit
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
290
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
291 balance-3-r-p : {l : Level} {t : Set l} → Env → (exit : Env → t) → t
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
292 balance-3-r-p env exit = merge-rotate-right env (λ env → barance-3-rc env exit) exit
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
293
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
294
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
295 balance-3-l-p : {l : Level} {t : Set l} → Env → (exit : Env → t) → t
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
296 balance-3-l-p env exit = merge-rotate-left env (λ env → barance-3-lbc env (λ env → merge-rotate-right env (λ env → barance-3-lfc env exit) exit) exit) exit
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
297
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
298
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
299 balance-3-p : {l : Level} {t : Set l} → Env → (exit : Env → t) → t
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
300 balance-3-p env exit = balance-3-c env (λ env → balance-3-r-p env exit) (λ env → balance-3-l-p env exit) exit
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
301
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
302 balance-58-p : {l : Level} {t : Set l} → Env → (exit : Env → t) → t
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
303 balance-58-p env exit = merge-rotate-right env (λ env → balance-58-c env exit) exit
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
304
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
305 -- exit merge-tree
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
306 balance_right-p : {l : Level} {t : Set l} → Env → (exit : Env → t) → t
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
307 balance_right-p env exit = balance_right-c env (λ env → barance-12-c env exit) (λ env → balance-3-p env exit) (λ env → balance-58-p env exit) exit
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
308
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
309 {-# TERMINATING #-}
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
310 delete-merge-tree-p : {l : Level} {t : Set l} → Env → (exit : Env → t) → t
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
311 delete-merge-tree-p env exit = merge-tree-c env (λ env → balance_left-p env (λ env → delete-merge-tree-p env exit)) (λ env → balance_right-p env (λ env → delete-merge-tree-p env exit)) exit
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
312
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
313 bt-delete-init : Env → rbt
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
314 bt-delete-init env = bt-delete-p env (λ env → delete-merge-tree-p env (λ env → Env.vart env))
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
315
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
316 bt-delete : rbt → ℕ → rbt
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
317 bt-delete rbt n = bt-delete-init (record { vart = rbt ; varn = n ; varl = [] })
10
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
318
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
319 b = find (Env.vart test'15) 123 (λ env → env)
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
320
14
2521da2c3c9a WIP rbt_delete
soto
parents: 10
diff changeset
321 test = bt-delete (Env.vart test'15) 0
10
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
322
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
323
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
324 c = check-find (find (Env.vart test'15) 1 (λ env → env) ) 1
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
325
ce192a384cb6 WIP add imple
soto
parents:
diff changeset
326