annotate hoareRedBlackTree.agda @ 577:ac2293378d7a

modify findNode1
author ryokka
date Fri, 01 Nov 2019 20:02:55 +0900
parents 40d01b368e34
children 7bacba816277
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
576
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
1 module hoareRedBlackTree where
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
2
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
3
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
4 open import Level hiding (zero)
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
5
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
6 open import Data.Nat hiding (compare)
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
7 open import Data.Nat.Properties as NatProp
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
8 open import Data.Maybe
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
9 open import Data.Bool
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
10 open import Data.Empty
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
11
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
12 open import Relation.Binary
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
13 open import Relation.Binary.PropositionalEquality
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
14
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
15 open import stack
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
16
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
17
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
18
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
19 record TreeMethods {n m : Level } {a : Set n } {t : Set m } (treeImpl : Set n ) : Set (m Level.⊔ n) where
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
20 field
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
21 putImpl : treeImpl → a → (treeImpl → t) → t
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
22 getImpl : treeImpl → (treeImpl → Maybe a → t) → t
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
23 open TreeMethods
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
24
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
25 record Tree {n m : Level } {a : Set n } {t : Set m } (treeImpl : Set n ) : Set (m Level.⊔ n) where
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
26 field
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
27 tree : treeImpl
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
28 treeMethods : TreeMethods {n} {m} {a} {t} treeImpl
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
29 putTree : a → (Tree treeImpl → t) → t
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
30 putTree d next = putImpl (treeMethods ) tree d (\t1 → next (record {tree = t1 ; treeMethods = treeMethods} ))
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
31 getTree : (Tree treeImpl → Maybe a → t) → t
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
32 getTree next = getImpl (treeMethods ) tree (\t1 d → next (record {tree = t1 ; treeMethods = treeMethods} ) d )
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
33
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
34 open Tree
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
35
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
36 data Color {n : Level } : Set n where
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
37 Red : Color
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
38 Black : Color
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
39
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
40
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
41 record Node {n : Level } (a : Set n) (k : ℕ) : Set n where
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
42 inductive
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
43 field
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
44 key : ℕ
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
45 value : a
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
46 right : Maybe (Node a k)
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
47 left : Maybe (Node a k)
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
48 color : Color {n}
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
49 open Node
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
50
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
51 record RedBlackTree {n m : Level } {t : Set m} (a : Set n) (k : ℕ) : Set (m Level.⊔ n) where
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
52 field
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
53 root : Maybe (Node a k)
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
54 nodeStack : SingleLinkedStack (Node a k)
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
55 -- compare : k → k → Tri A B C
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
56 -- <-cmp
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
57
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
58 open RedBlackTree
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
59
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
60 open SingleLinkedStack
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
61
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
62
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
63
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
64 ----
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
65 -- find node potition to insert or to delete, the path will be in the stack
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
66 --
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
67
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
68 {-# TERMINATING #-}
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
69 findNode : {n m : Level } {a : Set n} {k : ℕ} {t : Set m} → RedBlackTree {n} {m} {t} a k → (Node a k) → (RedBlackTree {n} {m} {t} a k → t) → t
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
70 findNode {n} {m} {a} {k} {t} tree n0 next with root tree
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
71 findNode {n} {m} {a} {k} {t} tree n0 next | nothing = next tree
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
72 findNode {n} {m} {a} {k} {t} tree n0 next | just x with <-cmp (key x) (key n0)
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
73 findNode {n} {m} {a} {k} {t} tree n0 next | just x | tri≈ ¬a b ¬c = next tree
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
74 findNode {n} {m} {a} {k} {t} tree n0 next | just x | tri< a₁ ¬b ¬c = pushSingleLinkedStack (nodeStack tree) x (λ s → findNode (record {root = (left x) ; nodeStack = s}) n0 next)
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
75 findNode {n} {m} {a} {k} {t} tree n0 next | just x | tri> ¬a ¬b c = pushSingleLinkedStack (nodeStack tree) x (λ s → findNode (record {root = (right x) ; nodeStack = s}) n0 next)
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
76
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
77
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
78 findNode1 : {n m : Level } {a : Set n} {k : ℕ} {t : Set m} → RedBlackTree {n} {m} {t} a k → (Node a k) → (RedBlackTree {n} {m} {t} a k → t) → t
577
ac2293378d7a modify findNode1
ryokka
parents: 576
diff changeset
79 findNode1 {n} {m} {a} {k} {t} tree n0 next = pushSingleLinkedStack (nodeStack tree) n0 (λ st → findNode3 st n0)
ac2293378d7a modify findNode1
ryokka
parents: 576
diff changeset
80 module FindNode where
ac2293378d7a modify findNode1
ryokka
parents: 576
diff changeset
81 findNode2 : (Maybe (Node a k)) → SingleLinkedStack (Node a k) → t
ac2293378d7a modify findNode1
ryokka
parents: 576
diff changeset
82 findNode2 nothing st = next tree
ac2293378d7a modify findNode1
ryokka
parents: 576
diff changeset
83 findNode2 (just x) st = findNode1 (record {root = just x ; nodeStack = st}) x next
576
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
84
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
85 findNode3 : SingleLinkedStack (Node a k) → Node a k → t
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
86 findNode3 s1 n1 with (<-cmp (key n0) (key n1))
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
87 findNode3 s1 n1 | tri≈ ¬a b ¬c = next (record {root = root tree ; nodeStack = s1})
577
ac2293378d7a modify findNode1
ryokka
parents: 576
diff changeset
88 findNode3 s1 n1 | tri< a ¬b ¬c = findNode2 (right n1) s1
ac2293378d7a modify findNode1
ryokka
parents: 576
diff changeset
89 findNode3 s1 n1 | tri> ¬a ¬b c = findNode2 (left n1) s1
576
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
90
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
91
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
92 createEmptyRedBlackTreeℕ : {n m : Level} {t : Set m} (a : Set n) (b : ℕ)
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
93 → RedBlackTree {n} {m} {t} a b
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
94 createEmptyRedBlackTreeℕ a b = record {
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
95 root = nothing
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
96 ; nodeStack = emptySingleLinkedStack
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
97 }
40d01b368e34 Temporary Push
ryokka
parents:
diff changeset
98