@@ -17,14 +17,14 @@ open import Data.Product using (Σ; ∃; _×_; _,_; proj₁)
17
17
open import Data.Maybe.Base using (Maybe; just; nothing)
18
18
open import Data.List.Base as List using (List)
19
19
open import Data.DifferenceList using (DiffList; []; _∷_; _++_)
20
- open import Function as F hiding (const)
20
+ open import Function.Base as F hiding (const)
21
21
open import Relation.Unary
22
22
open import Relation.Binary using (_Respects_; Tri; tri<; tri≈; tri>)
23
23
open import Relation.Binary.PropositionalEquality using (_≡_; refl)
24
24
25
25
private
26
26
variable
27
- l : Level
27
+ l v : Level
28
28
A : Set l
29
29
30
30
open StrictTotalOrder strictTotalOrder renaming (Carrier to Key)
@@ -39,9 +39,6 @@ open import Data.Tree.AVL.Height public
39
39
------------------------------------------------------------------------
40
40
-- Definitions of the tree
41
41
42
- K&_ : ∀ {v} (V : Value v) → Set (a ⊔ v)
43
- K& V = Σ Key (Value.family V)
44
-
45
42
-- The trees have three parameters/indices: a lower bound on the
46
43
-- keys, an upper bound, and a height.
47
44
--
@@ -50,14 +47,18 @@ K& V = Σ Key (Value.family V)
50
47
data Tree {v} (V : Value v) (l u : Key⁺) : ℕ → Set (a ⊔ v ⊔ ℓ₂) where
51
48
leaf : (l<u : l <⁺ u) → Tree V l u 0
52
49
node : ∀ {hˡ hʳ h}
53
- (k : K& V)
54
- (lk : Tree V l [ proj₁ k ] hˡ)
55
- (ku : Tree V [ proj₁ k ] u hʳ)
50
+ (kv : K& V)
51
+ (lk : Tree V l [ kv .key ] hˡ)
52
+ (ku : Tree V [ kv .key ] u hʳ)
56
53
(bal : hˡ ∼ hʳ ⊔ h) →
57
54
Tree V l u (suc h)
58
55
59
56
module _ {v} {V : Value v} where
60
57
58
+ ordered : ∀ {l u n} → Tree V l u n → l <⁺ u
59
+ ordered (leaf l<u) = l<u
60
+ ordered (node kv lk ku bal) = trans⁺ _ (ordered lk) (ordered ku)
61
+
61
62
private
62
63
Val = Value.family V
63
64
V≈ = Value.respects V
@@ -67,8 +68,8 @@ module _ {v} {V : Value v} where
67
68
68
69
node-injective-key :
69
70
∀ {hˡ₁ hˡ₂ hʳ₁ hʳ₂ h l u k₁ k₂}
70
- {lk₁ : Tree V l [ proj₁ k₁ ] hˡ₁} {lk₂ : Tree V l [ proj₁ k₂ ] hˡ₂}
71
- {ku₁ : Tree V [ proj₁ k₁ ] u hʳ₁} {ku₂ : Tree V [ proj₁ k₂ ] u hʳ₂}
71
+ {lk₁ : Tree V l [ k₁ .key ] hˡ₁} {lk₂ : Tree V l [ k₂ .key ] hˡ₂}
72
+ {ku₁ : Tree V [ k₁ .key ] u hʳ₁} {ku₂ : Tree V [ k₂ .key ] u hʳ₂}
72
73
{bal₁ : hˡ₁ ∼ hʳ₁ ⊔ h} {bal₂ : hˡ₂ ∼ hʳ₂ ⊔ h} →
73
74
node k₁ lk₁ ku₁ bal₁ ≡ node k₂ lk₂ ku₂ bal₂ → k₁ ≡ k₂
74
75
node-injective-key refl = refl
@@ -97,46 +98,46 @@ module _ {v} {V : Value v} where
97
98
-- Various constant-time functions which construct trees out of
98
99
-- smaller pieces, sometimes using rotation.
99
100
101
+ pattern node⁺ k₁ t₁ k₂ t₂ t₃ bal = node k₁ t₁ (node k₂ t₂ t₃ bal) ∼+
102
+
100
103
joinˡ⁺ : ∀ {l u hˡ hʳ h} →
101
104
(k : K& V) →
102
- (∃ λ i → Tree V l [ proj₁ k ] (i ⊕ hˡ)) →
103
- Tree V [ proj₁ k ] u hʳ →
105
+ (∃ λ i → Tree V l [ k .key ] (i ⊕ hˡ)) →
106
+ Tree V [ k .key ] u hʳ →
104
107
(bal : hˡ ∼ hʳ ⊔ h) →
105
108
∃ λ i → Tree V l u (i ⊕ (1 + h))
106
- joinˡ⁺ k₆ (1 # , node k₂ t₁
107
- ( node k₄ t₃ t₅ bal )
108
- ∼+) t₇ ∼- = (0# , node k₄
109
- (node k₂ t₁ t₃ (max∼ bal) )
110
- (node k₆ t₅ t₇ (∼max bal) )
111
- ∼0)
112
- joinˡ⁺ k₄ (1 # , node k₂ t₁ t₃ ∼-) t₅ ∼- = (0# , node k₂ t₁ (node k₄ t₃ t₅ ∼0) ∼0 )
113
- joinˡ⁺ k₄ (1# , node k₂ t₁ t₃ ∼0) t₅ ∼- = (1# , node k₂ t₁ (node k₄ t₃ t₅ ∼-) ∼+ )
114
- joinˡ⁺ k₂ (1# , t₁) t₃ ∼0 = (1# , node k₂ t₁ t₃ ∼- )
115
- joinˡ⁺ k₂ (1# , t₁) t₃ ∼+ = (0# , node k₂ t₁ t₃ ∼0)
116
- joinˡ⁺ k₂ (0# , t₁) t₃ bal = (0# , node k₂ t₁ t₃ bal)
109
+ joinˡ⁺ k₂ (0 # , t₁) t₃ bal = (0# , node k₂ t₁ t₃ bal)
110
+ joinˡ⁺ k₂ (1# , t₁) t₃ ∼0 = (1# , node k₂ t₁ t₃ ∼- )
111
+ joinˡ⁺ k₂ (1# , t₁) t₃ ∼+ = (0# , node k₂ t₁ t₃ ∼0)
112
+ joinˡ⁺ k₄ (1# , node k₂ t₁ t₃ ∼-) t₅ ∼- = (0# , node k₂ t₁ (node k₄ t₃ t₅ ∼0) ∼0 )
113
+ joinˡ⁺ k₄ (1# , node k₂ t₁ t₃ ∼0) t₅ ∼- = (1# , node k₂ t₁ (node k₄ t₃ t₅ ∼-) ∼+ )
114
+ joinˡ⁺ k₆ (1# , node⁺ k₂ t₁ k₄ t₃ t₅ bal) t₇ ∼-
115
+ = (0 # , node k₄ ( node k₂ t₁ t₃ (max∼ bal) )
116
+ (node k₆ t₅ t₇ (∼max bal) )
117
+ ∼0 )
118
+
119
+ pattern node⁻ k₁ k₂ t₁ t₂ bal t₃ = node k₁ ( node k₂ t₁ t₂ bal) t₃ ∼-
117
120
118
121
joinʳ⁺ : ∀ {l u hˡ hʳ h} →
119
122
(k : K& V) →
120
- Tree V l [ proj₁ k ] hˡ →
121
- (∃ λ i → Tree V [ proj₁ k ] u (i ⊕ hʳ)) →
123
+ Tree V l [ k .key ] hˡ →
124
+ (∃ λ i → Tree V [ k .key ] u (i ⊕ hʳ)) →
122
125
(bal : hˡ ∼ hʳ ⊔ h) →
123
126
∃ λ i → Tree V l u (i ⊕ (1 + h))
124
- joinʳ⁺ k₂ t₁ (1# , node k₆
125
- (node k₄ t₃ t₅ bal)
126
- t₇ ∼-) ∼+ = (0# , node k₄
127
- (node k₂ t₁ t₃ (max∼ bal))
128
- (node k₆ t₅ t₇ (∼max bal))
129
- ∼0)
130
- joinʳ⁺ k₂ t₁ (1# , node k₄ t₃ t₅ ∼+) ∼+ = (0# , node k₄ (node k₂ t₁ t₃ ∼0) t₅ ∼0)
131
- joinʳ⁺ k₂ t₁ (1# , node k₄ t₃ t₅ ∼0) ∼+ = (1# , node k₄ (node k₂ t₁ t₃ ∼+) t₅ ∼-)
127
+ joinʳ⁺ k₂ t₁ (0# , t₃) bal = (0# , node k₂ t₁ t₃ bal)
132
128
joinʳ⁺ k₂ t₁ (1# , t₃) ∼0 = (1# , node k₂ t₁ t₃ ∼+)
133
129
joinʳ⁺ k₂ t₁ (1# , t₃) ∼- = (0# , node k₂ t₁ t₃ ∼0)
134
- joinʳ⁺ k₂ t₁ (0# , t₃) bal = (0# , node k₂ t₁ t₃ bal)
130
+ joinʳ⁺ k₂ t₁ (1# , node k₄ t₃ t₅ ∼+) ∼+ = (0# , node k₄ (node k₂ t₁ t₃ ∼0) t₅ ∼0)
131
+ joinʳ⁺ k₂ t₁ (1# , node k₄ t₃ t₅ ∼0) ∼+ = (1# , node k₄ (node k₂ t₁ t₃ ∼+) t₅ ∼-)
132
+ joinʳ⁺ k₂ t₁ (1# , node⁻ k₆ k₄ t₃ t₅ bal t₇) ∼+
133
+ = (0# , node k₄ (node k₂ t₁ t₃ (max∼ bal))
134
+ (node k₆ t₅ t₇ (∼max bal))
135
+ ∼0)
135
136
136
137
joinˡ⁻ : ∀ {l u} hˡ {hʳ h} →
137
138
(k : K& V) →
138
- (∃ λ i → Tree V l [ proj₁ k ] pred[ i ⊕ hˡ ]) →
139
- Tree V [ proj₁ k ] u hʳ →
139
+ (∃ λ i → Tree V l [ k .key ] pred[ i ⊕ hˡ ]) →
140
+ Tree V [ k .key ] u hʳ →
140
141
(bal : hˡ ∼ hʳ ⊔ h) →
141
142
∃ λ i → Tree V l u (i ⊕ h)
142
143
joinˡ⁻ zero k₂ (0# , t₁) t₃ bal = (1# , node k₂ t₁ t₃ bal)
@@ -148,8 +149,8 @@ module _ {v} {V : Value v} where
148
149
149
150
joinʳ⁻ : ∀ {l u hˡ} hʳ {h} →
150
151
(k : K& V) →
151
- Tree V l [ proj₁ k ] hˡ →
152
- (∃ λ i → Tree V [ proj₁ k ] u pred[ i ⊕ hʳ ]) →
152
+ Tree V l [ k .key ] hˡ →
153
+ (∃ λ i → Tree V [ k .key ] u pred[ i ⊕ hʳ ]) →
153
154
(bal : hˡ ∼ hʳ ⊔ h) →
154
155
∃ λ i → Tree V l u (i ⊕ h)
155
156
joinʳ⁻ zero k₂ t₁ (0# , t₃) bal = (1# , node k₂ t₁ t₃ bal)
@@ -163,8 +164,8 @@ module _ {v} {V : Value v} where
163
164
-- Logarithmic in the size of the tree.
164
165
165
166
headTail : ∀ {l u h} → Tree V l u (1 + h) →
166
- ∃ λ (k : K& V) → l <⁺ [ proj₁ k ] ×
167
- ∃ λ i → Tree V [ proj₁ k ] u (i ⊕ h)
167
+ ∃ λ (k : K& V) → l <⁺ [ k .key ] ×
168
+ ∃ λ i → Tree V [ k .key ] u (i ⊕ h)
168
169
headTail (node k₁ (leaf l<k₁) t₂ ∼+) = (k₁ , l<k₁ , 0# , t₂)
169
170
headTail (node k₁ (leaf l<k₁) t₂ ∼0) = (k₁ , l<k₁ , 0# , t₂)
170
171
headTail (node {hˡ = suc _} k₃ t₁₂ t₄ bal) with headTail t₁₂
@@ -174,8 +175,8 @@ module _ {v} {V : Value v} where
174
175
-- Logarithmic in the size of the tree.
175
176
176
177
initLast : ∀ {l u h} → Tree V l u (1 + h) →
177
- ∃ λ (k : K& V) → [ proj₁ k ] <⁺ u ×
178
- ∃ λ i → Tree V l [ proj₁ k ] (i ⊕ h)
178
+ ∃ λ (k : K& V) → [ k .key ] <⁺ u ×
179
+ ∃ λ i → Tree V l [ k .key ] (i ⊕ h)
179
180
initLast (node k₂ t₁ (leaf k₂<u) ∼-) = (k₂ , k₂<u , (0# , t₁))
180
181
initLast (node k₂ t₁ (leaf k₂<u) ∼0) = (k₂ , k₂<u , (0# , t₁))
181
182
initLast (node {hʳ = suc _} k₂ t₁ t₃₄ bal) with initLast t₃₄
0 commit comments