refactor BBT to new syntax

This commit is contained in:
imaqtkatt 2024-03-20 09:28:46 -03:00
parent de14d56d3d
commit af0ed6bb8d
18 changed files with 751 additions and 477 deletions

View File

@ -1,15 +1,19 @@
BBT
: ∀(K: *) ∀(V: *) *
= λK λV
$(self: (BBT K V))
∀(P: ∀(bbt: (BBT K V)) *)
∀(bin:
∀(size: U60)
∀(key: K)
∀(val: V)
∀(lft: (BBT K V))
∀(rgt: (BBT K V))
(P (BBT.bin K V size key val lft rgt))
)
∀(tip: (P (BBT.tip K V)))
(P self)
//BBT
//: ∀(K: *) ∀(V: *) *
//= λK λV
//$(self: (BBT K V))
//∀(P: ∀(bbt: (BBT K V)) *)
//∀(bin:
//∀(size: U60)
//∀(key: K)
//∀(val: V)
//∀(lft: (BBT K V))
//∀(rgt: (BBT K V))
//(P (BBT.bin K V size key val lft rgt))
//)
//∀(tip: (P (BBT.tip K V)))
//(P self)
data BBT K V
| bin (size: U60) (key: K) (val: V) (lft: (BBT K V)) (rgt: (BBT K V))
| tip

View File

@ -1,66 +1,97 @@
BBT.balance
: ∀(K: *)
∀(V: *)
∀(cmp: ∀(a: K) ∀(b: K) Cmp)
∀(set_key: K)
∀(node_key: K)
∀(val: V)
∀(lft: (BBT K V))
∀(rgt: (BBT K V))
(BBT K V)
= λK λV λcmp λset_key λnode_key λval λlft λrgt
use P = λx (BBT K V)
use new = λlft.size λlft
use P = λx (BBT K V)
use new = λrgt.size λrgt
use new_size = (+ 1 (U60.max lft.size rgt.size))
use balance = (U60.abs_diff lft.size rgt.size)
use P = λx
∀(new_size: U60)
∀(node_key: K)
∀(val: V)
∀(lft: (BBT K V))
∀(rgt: (BBT K V))
(BBT K V)
use true = λnew_size λnode_key λval λlft λrgt
use P = λx
∀(K: *)
∀(V: *)
∀(cmp: ∀(a: K) ∀(b: K) Cmp)
∀(new_size: U60)
∀(node_key: K)
∀(set_key: K)
∀(val: V)
∀(lft: (BBT K V))
∀(rgt: (BBT K V))
(BBT K V)
use true = BBT.balance.lft_heavier
use false = BBT.balance.rgt_heavier
(~(U60.to_bool (< rgt.size lft.size))
P
true
false
K
V
cmp
new_size
node_key
set_key
val
lft
rgt
)
use false = λnew_size λnode_key λval λlft λrgt
(BBT.bin K V new_size node_key val lft rgt)
(~(U60.to_bool (> balance 1))
P
true
false
new_size
node_key
val
lft
rgt
)
(~(BBT.got_size K V rgt) P new)
(~(BBT.got_size K V lft) P new)
use BBT/{bin,tip}
use Bool/{true,false}
balance <K> <V>
(cmp: ∀(a: K) ∀(b: K) Cmp)
(set_key: K)
(node_key: K)
(val: V)
(lft: (BBT K V))
(rgt: (BBT K V))
: (BBT K V) =
match got_lft = (BBT/got_size lft) {
Pair/new:
match got_rgt = (BBT/got_size rgt) {
Pair/new:
use new_size = (+ got_lft.fst got_rgt.fst)
use balance = (U60/abs_diff got_lft.fst got_rgt.fst)
match _ = (U60/to_bool (> balance 1)) {
true:
match _ = (U60/to_bool (< got_lft.fst got_rgt.fst)) {
true: (BBT/balance/lft_heavier cmp new_size node_key set_key val lft rgt)
false: (BBT/balance/rgt_heavier cmp new_size node_key set_key val lft rgt)
}
false: (bin K V new_size node_key val lft rgt)
}
}
}
//BBT.balance
//: ∀(K: *)
//∀(V: *)
//∀(cmp: ∀(a: K) ∀(b: K) Cmp)
//∀(set_key: K)
//∀(node_key: K)
//∀(val: V)
//∀(lft: (BBT K V))
//∀(rgt: (BBT K V))
//(BBT K V)
//= λK λV λcmp λset_key λnode_key λval λlft λrgt
//use P = λx (BBT K V)
//use new = λlft.size λlft
//use P = λx (BBT K V)
//use new = λrgt.size λrgt
//use new_size = (+ 1 (U60.max lft.size rgt.size))
//use balance = (U60.abs_diff lft.size rgt.size)
//use P = λx
//∀(new_size: U60)
//∀(node_key: K)
//∀(val: V)
//∀(lft: (BBT K V))
//∀(rgt: (BBT K V))
//(BBT K V)
//use true = λnew_size λnode_key λval λlft λrgt
//use P = λx
//∀(K: *)
//∀(V: *)
//∀(cmp: ∀(a: K) ∀(b: K) Cmp)
//∀(new_size: U60)
//∀(node_key: K)
//∀(set_key: K)
//∀(val: V)
//∀(lft: (BBT K V))
//∀(rgt: (BBT K V))
//(BBT K V)
//use true = BBT.balance.lft_heavier
//use false = BBT.balance.rgt_heavier
//(~(U60.to_bool (< rgt.size lft.size))
//P
//true
//false
//K
//V
//cmp
//new_size
//node_key
//set_key
//val
//lft
//rgt
//)
//use false = λnew_size λnode_key λval λlft λrgt
//(BBT.bin K V new_size node_key val lft rgt)
//(~(U60.to_bool (> balance 1))
//P
//true
//false
//new_size
//node_key
//val
//lft
//rgt
//)
//(~(BBT.got_size K V rgt) P new)
//(~(BBT.got_size K V lft) P new)

View File

@ -1,53 +1,80 @@
BBT.balance.lft_heavier
: ∀(K: *)
∀(V: *)
∀(cmp: ∀(a: K) ∀(b: K) Cmp)
∀(new_size: U60)
∀(node_key: K)
∀(set_key: K)
∀(val: V)
∀(lft: (BBT K V))
∀(rgt: (BBT K V))
(BBT K V)
= λK λV λcmp λnew_size λnode_key λset_key λval λlft λrgt
use P = λx (BBT K V)
use bin = λlft.size λlft.key λlft.val λlft.lft λlft.rgt
use P = λx
∀(new_size: U60)
∀(key: K)
∀(val: V)
∀(lft.key: K)
∀(lft.val: V)
∀(lft.lft: (BBT K V))
∀(lft.rgt: (BBT K V))
∀(rgt: (BBT K V))
(BBT K V)
use true = λnew_size λkey λval λlft.key λlft.val λlft.lft λlft.rgt λrgt
use lft = (BBT.lft_rotate
K
V
lft.size
lft.key
lft.val
lft.lft
lft.rgt
)
(BBT.rgt_rotate K V new_size key val lft rgt)
use false = λnew_size λkey λval λlft.key λlft.val λlft.lft λlft.rgt λrgt
use lft = (BBT.bin K V lft.size lft.key lft.val lft.lft lft.rgt)
(BBT.rgt_rotate K V new_size key val lft rgt)
(~(Cmp.is_gtn (cmp set_key lft.key))
P
true
false
new_size
node_key
val
lft.key
lft.val
lft.lft
lft.rgt
rgt
)
use tip = (BBT.tip K V)
(~lft P bin tip)
use BBT/{bin,tip,lft_rotate,rgt_rotate}
use Bool/{true,false}
lft_heavier <K> <V>
(cmp: ∀(a: K) ∀(b: K) Cmp)
(new_size: U60)
(node_key: K)
(set_key: K)
(val: V)
(lft: (BBT K V))
(rgt: (BBT K V))
: (BBT K V) =
match lft {
bin:
match _ = (Cmp/is_gtn (cmp set_key lft.key)) {
true:
use lft = (lft_rotate lft.size lft.key lft.val lft.lft lft.rgt)
(rgt_rotate new_size lft.key val lft rgt)
false:
use lft = (bin K V lft.size lft.key lft.val lft.lft lft.rgt)
(rgt_rotate new_size lft.key val lft rgt)
}
tip: (tip K V)
}
//BBT.balance.lft_heavier
//: ∀(K: *)
//∀(V: *)
//∀(cmp: ∀(a: K) ∀(b: K) Cmp)
//∀(new_size: U60)
//∀(node_key: K)
//∀(set_key: K)
//∀(val: V)
//∀(lft: (BBT K V))
//∀(rgt: (BBT K V))
//(BBT K V)
//= λK λV λcmp λnew_size λnode_key λset_key λval λlft λrgt
//use P = λx (BBT K V)
//use bin = λlft.size λlft.key λlft.val λlft.lft λlft.rgt
//use P = λx
//∀(new_size: U60)
//∀(key: K)
//∀(val: V)
//∀(lft.key: K)
//∀(lft.val: V)
//∀(lft.lft: (BBT K V))
//∀(lft.rgt: (BBT K V))
//∀(rgt: (BBT K V))
//(BBT K V)
//use true = λnew_size λkey λval λlft.key λlft.val λlft.lft λlft.rgt λrgt
//use lft = (BBT.lft_rotate
//K
//V
//lft.size
//lft.key
//lft.val
//lft.lft
//lft.rgt
//)
//(BBT.rgt_rotate K V new_size key val lft rgt)
//use false = λnew_size λkey λval λlft.key λlft.val λlft.lft λlft.rgt λrgt
//use lft = (BBT.bin K V lft.size lft.key lft.val lft.lft lft.rgt)
//(BBT.rgt_rotate K V new_size key val lft rgt)
//(~(Cmp.is_gtn (cmp set_key lft.key))
//P
//true
//false
//new_size
//node_key
//val
//lft.key
//lft.val
//lft.lft
//lft.rgt
//rgt
//)
//use tip = (BBT.tip K V)
//(~lft P bin tip)

View File

@ -1,53 +1,80 @@
BBT.balance.rgt_heavier
: ∀(K: *)
∀(V: *)
∀(cmp: ∀(a: K) ∀(b: K) Cmp)
∀(new_size: U60)
∀(node_key: K)
∀(set_key: K)
∀(val: V)
∀(lft: (BBT K V))
∀(rgt: (BBT K V))
(BBT K V)
= λK λV λcmp λnew_size λnode_key λset_key λval λlft λrgt
use P = λx (BBT K V)
use bin = λrgt.size λrgt.key λrgt.val λrgt.lft λrgt.rgt
use P = λx
∀(new_size: U60)
∀(key: K)
∀(val: V)
∀(lft: (BBT K V))
∀(rgt.key: K)
∀(rgt.val: V)
∀(rgt.lft: (BBT K V))
∀(rgt.rgt: (BBT K V))
(BBT K V)
use true = λnew_size λkey λval λlft λrgt.key λrgt.val λrgt.lft λrgt.rgt
use rgt = (BBT.bin K V rgt.size rgt.key rgt.val rgt.lft rgt.rgt)
(BBT.lft_rotate K V new_size key val lft rgt)
use false = λnew_size λkey λval λlft λrgt.key λrgt.val λrgt.lft λrgt.rgt
use rgt = (BBT.rgt_rotate
K
V
rgt.size
rgt.key
rgt.val
rgt.lft
rgt.rgt
)
(BBT.lft_rotate K V new_size key val lft rgt)
(~(Cmp.is_gtn (cmp set_key rgt.key))
P
true
false
new_size
node_key
val
lft
rgt.key
rgt.val
rgt.lft
rgt.rgt
)
use tip = (BBT.tip K V)
(~rgt P bin tip)
use BBT/{bin,tip,lft_rotate,rgt_rotate}
use Bool/{true,false}
rgt_heavier <K> <V>
(cmp: ∀(a: K) ∀(b: K) Cmp)
(new_size: U60)
(node_key: K)
(set_key: K)
(val: V)
(lft: (BBT K V))
(rgt: (BBT K V))
: (BBT K V) =
match rgt {
bin:
match _ = (Cmp/is_gtn (cmp set_key rgt.key)) {
true:
use rgt = (bin K V rgt.size rgt.key rgt.val rgt.lft rgt.rgt)
(lft_rotate new_size rgt.key val lft rgt)
false:
use rgt = (rgt_rotate rgt.size rgt.key rgt.val rgt.lft rgt.rgt)
(lft_rotate new_size rgt.key val lft rgt)
}
tip: (tip K V)
}
//BBT.balance.rgt_heavier
//: ∀(K: *)
//∀(V: *)
//∀(cmp: ∀(a: K) ∀(b: K) Cmp)
//∀(new_size: U60)
//∀(node_key: K)
//∀(set_key: K)
//∀(val: V)
//∀(lft: (BBT K V))
//∀(rgt: (BBT K V))
//(BBT K V)
//= λK λV λcmp λnew_size λnode_key λset_key λval λlft λrgt
//use P = λx (BBT K V)
//use bin = λrgt.size λrgt.key λrgt.val λrgt.lft λrgt.rgt
//use P = λx
//∀(new_size: U60)
//∀(key: K)
//∀(val: V)
//∀(lft: (BBT K V))
//∀(rgt.key: K)
//∀(rgt.val: V)
//∀(rgt.lft: (BBT K V))
//∀(rgt.rgt: (BBT K V))
//(BBT K V)
//use true = λnew_size λkey λval λlft λrgt.key λrgt.val λrgt.lft λrgt.rgt
//use rgt = (BBT.bin K V rgt.size rgt.key rgt.val rgt.lft rgt.rgt)
//(BBT.lft_rotate K V new_size key val lft rgt)
//use false = λnew_size λkey λval λlft λrgt.key λrgt.val λrgt.lft λrgt.rgt
//use rgt = (BBT.rgt_rotate
//K
//V
//rgt.size
//rgt.key
//rgt.val
//rgt.lft
//rgt.rgt
//)
//(BBT.lft_rotate K V new_size key val lft rgt)
//(~(Cmp.is_gtn (cmp set_key rgt.key))
//P
//true
//false
//new_size
//node_key
//val
//lft
//rgt.key
//rgt.val
//rgt.lft
//rgt.rgt
//)
//use tip = (BBT.tip K V)
//(~rgt P bin tip)

View File

@ -8,4 +8,4 @@ BBT.bin
∀(rgt: (BBT K V))
(BBT K V)
= λK λV λsize λkey λval λlft λrgt
~λP λbin λtip (bin size key val lft rgt)
~λP λbin λtip (bin size key val lft rgt)

View File

@ -1,15 +1,28 @@
BBT.from_list
: ∀(K: *)
∀(V: *)
∀(cmp: ∀(a: K) ∀(b: K) Cmp)
∀(list: (List (Pair K V)))
(BBT K V)
= λK λV λcmp λlist
use P = λx (BBT K V)
use cons = λhead λtail
use P = λx (BBT K V)
use new = λkey λval
(BBT.set K V cmp key val (BBT.from_list K V cmp tail))
(~head P new)
use nil = (BBT.tip K V)
(~list P cons nil)
use BBT/{bin,tip,set}
from_list <K> <V> (cmp: ∀(a: K) ∀(b: K) Cmp) (list: (List (Pair K V))) : (BBT K V) =
match list {
List/cons:
match pair = list.head {
Pair/new: (set cmp pair.fst pair.snd (from_list cmp list.tail))
}
List/nil: (tip K V)
}
//BBT.from_list
//: ∀(K: *)
//∀(V: *)
//∀(cmp: ∀(a: K) ∀(b: K) Cmp)
//∀(list: (List (Pair K V)))
//(BBT K V)
//= λK λV λcmp λlist
//use P = λx (BBT K V)
//use cons = λhead λtail
//use P = λx (BBT K V)
//use new = λkey λval
//(BBT.set K V cmp key val (BBT.from_list K V cmp tail))
//(~head P new)
//use nil = (BBT.tip K V)
//(~list P cons nil)

View File

@ -1,18 +1,34 @@
BBT.get
: ∀(K: *)
∀(V: *)
∀(cmp: ∀(a: K) ∀(b: K) Cmp)
∀(key: K)
∀(map: (BBT K V))
(Maybe V)
= λK λV λcmp λkey λmap
use P = λx (Maybe V)
use bin = λ_size λnext.key λnext.val λnext.lft λnext.rgt
use P = λx
∀(cmp: ∀(a: K) ∀(b: K) Cmp) ∀(key: K) (Maybe V)
use ltn = λcmp λkey (BBT.get K V cmp key next.lft)
use eql = λcmp λkey (Maybe.some V next.val)
use gtn = λcmp λkey (BBT.get K V cmp key next.rgt)
(~(cmp key next.key) P ltn eql gtn cmp key)
use tip = (Maybe.none V)
(~map P bin tip)
use BBT/{bin,tip}
use Cmp/{ltn,eql,gtn}
get <K> <V> (cmp: ∀(a: K) ∀(b: K) Cmp) (key: K) (map: (BBT K V)) : (Maybe V) =
match map {
bin:
match _ = (cmp key map.key) {
ltn: (get cmp key map.lft)
eql: (Maybe/some map.val)
gtn: (get cmp key map.rgt)
}
tip: Maybe/none
}
//BBT.get
//: ∀(K: *)
//∀(V: *)
//∀(cmp: ∀(a: K) ∀(b: K) Cmp)
//∀(key: K)
//∀(map: (BBT K V))
//(Maybe V)
//= λK λV λcmp λkey λmap
//use P = λx (Maybe V)
//use bin = λ_size λnext.key λnext.val λnext.lft λnext.rgt
//use P = λx
//∀(cmp: ∀(a: K) ∀(b: K) Cmp) ∀(key: K) (Maybe V)
//use ltn = λcmp λkey (BBT.get K V cmp key next.lft)
//use eql = λcmp λkey (Maybe.some V next.val)
//use gtn = λcmp λkey (BBT.get K V cmp key next.rgt)
//(~(cmp key next.key) P ltn eql gtn cmp key)
//use tip = (Maybe.none V)
//(~map P bin tip)

View File

@ -1,43 +1,70 @@
BBT.got
: ∀(K: *)
∀(V: *)
∀(cmp: ∀(a: K) ∀(b: K) Cmp)
∀(key: K)
∀(map: (BBT K V))
(Pair (Maybe V) (BBT K V))
= λK λV λcmp λkey λmap
use P = λx (Pair (Maybe V) (BBT K V))
use bin = λsize λnext.key λnext.val λnext.lft λnext.rgt
use P = λx
∀(cmp: ∀(a: K) ∀(b: K) Cmp) ∀(key: K)
(Pair (Maybe V) (BBT K V))
use ltn = λcmp λkey
use new_pair = (BBT.got K V cmp key next.lft)
use P = λx (Pair (Maybe V) (BBT K V))
use new = λval λlft
use map = (BBT.bin K V size next.key next.val lft next.rgt)
(Pair.new (Maybe V) (BBT K V) val map)
(~new_pair P new)
use eql = λcmp λkey
use map = (BBT.bin K V size next.key next.val next.lft next.rgt)
(Pair.new
(Maybe V)
(BBT K V)
(Maybe.some V next.val)
map
)
use gtn = λcmp λkey
use new_pair = (BBT.got K V cmp key next.rgt)
use P = λx (Pair (Maybe V) (BBT K V))
use new = λval λrgt
use map = (BBT.bin K V size next.key next.val next.lft rgt)
(Pair.new (Maybe V) (BBT K V) val map)
(~new_pair P new)
(~(cmp key next.key) P ltn eql gtn cmp key)
use tip = (Pair.new
(Maybe V)
(BBT K V)
(Maybe.none V)
(BBT.tip K V)
)
(~map P bin tip)
use BBT/{bin,tip}
use Maybe/{some,none}
use Cmp/{ltn,eql,gtn}
got <K> <V> (cmp: ∀(a: K) ∀(b: K) Cmp) (key: K) (map: (BBT K V)) : (Pair (Maybe V) (BBT K V)) =
match map {
bin:
match _ = (cmp key map.key) {
ltn:
match new_pair = (got cmp key map.lft) {
Pair/new:
let map = (bin K V map.size map.key map.val new_pair.snd map.rgt)
(Pair/new new_pair.fst map)
}
eql: (Pair/new (some map.val) map)
gtn:
match new_pair = (got cmp key map.rgt) {
Pair/new:
let map = (bin K V map.size map.key map.val map.lft new_pair.snd)
(Pair/new new_pair.fst map)
}
}
tip: (Pair/new none (tip K V))
}
//BBT.got
//: ∀(K: *)
//∀(V: *)
//∀(cmp: ∀(a: K) ∀(b: K) Cmp)
//∀(key: K)
//∀(map: (BBT K V))
//(Pair (Maybe V) (BBT K V))
//= λK λV λcmp λkey λmap
//use P = λx (Pair (Maybe V) (BBT K V))
//use bin = λsize λnext.key λnext.val λnext.lft λnext.rgt
//use P = λx
//∀(cmp: ∀(a: K) ∀(b: K) Cmp) ∀(key: K)
//(Pair (Maybe V) (BBT K V))
//use ltn = λcmp λkey
//use new_pair = (BBT.got K V cmp key next.lft)
//use P = λx (Pair (Maybe V) (BBT K V))
//use new = λval λlft
//use map = (BBT.bin K V size next.key next.val lft next.rgt)
//(Pair.new (Maybe V) (BBT K V) val map)
//(~new_pair P new)
//use eql = λcmp λkey
//use map = (BBT.bin K V size next.key next.val next.lft next.rgt)
//(Pair.new
//(Maybe V)
//(BBT K V)
//(Maybe.some V next.val)
//map
//)
//use gtn = λcmp λkey
//use new_pair = (BBT.got K V cmp key next.rgt)
//use P = λx (Pair (Maybe V) (BBT K V))
//use new = λval λrgt
//use map = (BBT.bin K V size next.key next.val next.lft rgt)
//(Pair.new (Maybe V) (BBT K V) val map)
//(~new_pair P new)
//(~(cmp key next.key) P ltn eql gtn cmp key)
//use tip = (Pair.new
//(Maybe V)
//(BBT K V)
//(Maybe.none V)
//(BBT.tip K V)
//)
//(~map P bin tip)

View File

@ -1,10 +1,20 @@
BBT.got_size
: ∀(K: *) ∀(V: *) ∀(map: (BBT K V))
(Pair U60 (BBT K V))
= λK λV λmap
use P = λx (Pair U60 (BBT K V))
use bin = λsize λnext.key λnext.val λnext.lft λnext.rgt
use map = (BBT.bin K V size next.key next.val next.lft next.rgt)
(Pair.new U60 (BBT K V) size map)
use tip = (Pair.new U60 (BBT K V) 0 (BBT.tip K V))
(~map P bin tip)
use BBT/{bin,tip}
got_size <K> <V> (map: (BBT K V)) : (Pair U60 (BBT K V)) =
match map {
bin: (Pair/new map.size map)
tip: (Pair/new 0 (tip K V))
}
//BBT.got_size
//: ∀(K: *) ∀(V: *) ∀(map: (BBT K V))
//(Pair U60 (BBT K V))
//= λK λV λmap
//use P = λx (Pair U60 (BBT K V))
//use bin = λsize λnext.key λnext.val λnext.lft λnext.rgt
//use map = (BBT.bin K V size next.key next.val next.lft next.rgt)
//(Pair.new U60 (BBT K V) size map)
//use tip = (Pair.new U60 (BBT K V) 0 (BBT.tip K V))
//(~map P bin tip)

View File

@ -1,17 +1,33 @@
BBT.has
: ∀(K: *)
∀(V: *)
∀(cmp: ∀(a: K) ∀(b: K) Cmp)
∀(key: K)
∀(map: (BBT K V))
Bool
= λK λV λcmp λkey λmap
use P = λx Bool
use bin = λnext.size λnext.key λnext.val λnext.lft λnext.rgt
use P = λx ∀(cmp: ∀(a: K) ∀(b: K) Cmp) ∀(key: K) Bool
use ltn = λcmp λkey (BBT.has K V cmp key next.lft)
use eql = λcmp λkey Bool.true
use gtn = λcmp λkey (BBT.has K V cmp key next.rgt)
(~(cmp key next.key) P ltn eql gtn cmp key)
use tip = Bool.false
(~map P bin tip)
use BBT/{bin,tip}
use Cmp/{ltn,eql,gtn}
has <K> <V> (cmp: ∀(a: K) ∀(b: K) Cmp) (key: K) (map: (BBT K V)) : Bool =
match map {
bin:
match _ = (cmp key map.key) {
ltn: (has cmp key map.lft)
eql: Bool/true
gtn: (has cmp key map.rgt)
}
tip: Bool/false
}
//BBT.has
//: ∀(K: *)
//∀(V: *)
//∀(cmp: ∀(a: K) ∀(b: K) Cmp)
//∀(key: K)
//∀(map: (BBT K V))
//Bool
//= λK λV λcmp λkey λmap
//use P = λx Bool
//use bin = λnext.size λnext.key λnext.val λnext.lft λnext.rgt
//use P = λx ∀(cmp: ∀(a: K) ∀(b: K) Cmp) ∀(key: K) Bool
//use ltn = λcmp λkey (BBT.has K V cmp key next.lft)
//use eql = λcmp λkey Bool.true
//use gtn = λcmp λkey (BBT.has K V cmp key next.rgt)
//(~(cmp key next.key) P ltn eql gtn cmp key)
//use tip = Bool.false
//(~map P bin tip)

View File

@ -1,51 +1,74 @@
BBT.has.linear
: ∀(K: *)
∀(V: *)
∀(cmp: ∀(a: K) ∀(b: K) Cmp)
∀(key: K)
∀(map: (BBT K V))
(Pair Bool (BBT K V))
= λK λV λcmp λhas_key λmap
use P = λx (Pair Bool (BBT K V))
use bin = λsize λnode_key λval λlft λrgt
use P = λx
∀(cmp: ∀(a: K) ∀(b: K) Cmp)
∀(size: U60)
∀(node_key: K)
∀(val: V)
∀(lft: (BBT K V))
∀(rgt: (BBT K V))
∀(key: K)
(Pair Bool (BBT K V))
use ltn = λcmp λsize λnode_key λval λlft λrgt λhas_key
use P = λx (Pair Bool (BBT K V))
use new = λbool λlft
use map = (BBT.bin K V size node_key val lft rgt)
(Pair.new Bool (BBT K V) bool map)
(~(BBT.has.linear K V cmp has_key lft) P new)
use eql = λcmp λsize λnode_key λval λlft λrgt λhas_key
(Pair.new
Bool
(BBT K V)
Bool.true
(BBT.bin K V size node_key val lft rgt)
)
use gtn = λcmp λsize λnode_key λval λlft λrgt λhas_key
use P = λx (Pair Bool (BBT K V))
use new = λbool λrgt
use map = (BBT.bin K V size node_key val lft rgt)
(Pair.new Bool (BBT K V) bool rgt)
(~(BBT.has.linear K V cmp has_key rgt) P new)
((~(cmp has_key node_key) P ltn eql gtn)
cmp
size
node_key
val
lft
rgt
has_key
)
use tip = (Pair.new Bool (BBT K V) Bool.false (BBT.tip K V))
(~map P bin tip)
use BBT/{bin,tip}
use Bool/{false,true}
use Cmp/{ltn,eql,gtn}
linear <K> <V> (cmp: ∀(a: K) ∀(b: K) Cmp) (key: K) (map: (BBT K V)) : (Pair Bool (BBT K V)) =
match map {
bin:
match _ = (cmp key map.key) {
ltn:
match result = (linear cmp key map.lft) {
Pair/new:
(Pair/new result.fst (bin K V map.size map.key map.val result.snd map.rgt))
}
eql: (Pair/new true (bin K V map.size map.key map.val map.lft map.rgt))
gtn:
match result = (linear cmp key map.rgt) {
Pair/new:
(Pair/new result.fst (bin K V map.size map.key map.val map.lft result.snd))
}
}
tip: (Pair/new false (tip K V))
}
//BBT.has.linear
//: ∀(K: *)
//∀(V: *)
//∀(cmp: ∀(a: K) ∀(b: K) Cmp)
//∀(key: K)
//∀(map: (BBT K V))
//(Pair Bool (BBT K V))
//= λK λV λcmp λhas_key λmap
//use P = λx (Pair Bool (BBT K V))
//use bin = λsize λnode_key λval λlft λrgt
//use P = λx
//∀(cmp: ∀(a: K) ∀(b: K) Cmp)
//∀(size: U60)
//∀(node_key: K)
//∀(val: V)
//∀(lft: (BBT K V))
//∀(rgt: (BBT K V))
//∀(key: K)
//(Pair Bool (BBT K V))
//use ltn = λcmp λsize λnode_key λval λlft λrgt λhas_key
//use P = λx (Pair Bool (BBT K V))
//use new = λbool λlft
//use map = (BBT.bin K V size node_key val lft rgt)
//(Pair.new Bool (BBT K V) bool map)
//(~(BBT.has.linear K V cmp has_key lft) P new)
//use eql = λcmp λsize λnode_key λval λlft λrgt λhas_key
//(Pair.new
//Bool
//(BBT K V)
//Bool.true
//(BBT.bin K V size node_key val lft rgt)
//)
//use gtn = λcmp λsize λnode_key λval λlft λrgt λhas_key
//use P = λx (Pair Bool (BBT K V))
//use new = λbool λrgt
//use map = (BBT.bin K V size node_key val lft rgt)
//(Pair.new Bool (BBT K V) bool rgt)
//(~(BBT.has.linear K V cmp has_key rgt) P new)
//((~(cmp has_key node_key) P ltn eql gtn)
//cmp
//size
//node_key
//val
//lft
//rgt
//has_key
//)
//use tip = (Pair.new Bool (BBT K V) Bool.false (BBT.tip K V))
//(~map P bin tip)

View File

@ -1,18 +1,31 @@
BBT.lft_rotate
: ∀(K: *)
∀(V: *)
∀(size: U60)
∀(key: K)
∀(val: V)
∀(lft: (BBT K V))
∀(rgt: (BBT K V))
(BBT K V)
= λK λV λsize λkey λval λlft λrgt
use P = λx ∀(key: K) ∀(val: V) ∀(lft: (BBT K V)) (BBT K V)
use bin = λ_size λrgt.key λrgt.val λrgt.lft λrgt.rgt λkey λval λlft
use b = (BBT.new_node K V key val lft rgt.lft)
use a = (BBT.new_node K V rgt.key rgt.val b rgt.rgt)
a
use tip = λkey λval λlft
(BBT.bin K V size key val lft (BBT.tip K V))
(~rgt P bin tip key val lft)
use BBT/{bin,tip}
lft_rotate <K> <V> (size: U60) (key: K) (val: V) (lft: (BBT K V)) (rgt: (BBT K V)) : (BBT K V) =
match rgt {
bin:
use b = (BBT/new_node key val lft rgt.lft)
use a = (BBT/new_node rgt.key rgt.val b rgt.rgt)
a
tip: (bin K V size key val lft (tip K V))
}
//BBT.lft_rotate
//: ∀(K: *)
//∀(V: *)
//∀(size: U60)
//∀(key: K)
//∀(val: V)
//∀(lft: (BBT K V))
//∀(rgt: (BBT K V))
//(BBT K V)
//= λK λV λsize λkey λval λlft λrgt
//use P = λx ∀(key: K) ∀(val: V) ∀(lft: (BBT K V)) (BBT K V)
//use bin = λ_size λrgt.key λrgt.val λrgt.lft λrgt.rgt λkey λval λlft
//use b = (BBT.new_node K V key val lft rgt.lft)
//use a = (BBT.new_node K V rgt.key rgt.val b rgt.rgt)
//a
//use tip = λkey λval λlft
//(BBT.bin K V size key val lft (BBT.tip K V))
//(~rgt P bin tip key val lft)

View File

@ -1,17 +1,30 @@
BBT.new_node
: ∀(K: *)
∀(V: *)
∀(key: K)
∀(val: V)
∀(lft: (BBT K V))
∀(rgt: (BBT K V))
(BBT K V)
= λK λV λkey λval λlft λrgt
use P = λx (BBT K V)
use new = λlft.size λlft
use P = λx (BBT K V)
use new = λrgt.size λrgt
use new_size = (+ 1 (U60.max rgt.size lft.size))
(BBT.bin K V new_size key val lft rgt)
(~(BBT.got_size K V rgt) P new)
(~(BBT.got_size K V lft) P new)
use BBT/{bin}
new_node <K> <V> (key: K) (val: V) (lft: (BBT K V)) (rgt: (BBT K V)) : (BBT K V) =
match lft_size = (BBT/got_size lft) {
Pair/new: match rgt_size = (BBT/got_size rgt) {
Pair/new:
use new_size = (+ 1 (U60/max lft_size.fst rgt_size.fst))
(bin K V new_size key val lft rgt)
}
}
//BBT.new_node
//: ∀(K: *)
//∀(V: *)
//∀(key: K)
//∀(val: V)
//∀(lft: (BBT K V))
//∀(rgt: (BBT K V))
//(BBT K V)
//= λK λV λkey λval λlft λrgt
//use P = λx (BBT K V)
//use new = λlft.size λlft
//use P = λx (BBT K V)
//use new = λrgt.size λrgt
//use new_size = (+ 1 (U60.max rgt.size lft.size))
//(BBT.bin K V new_size key val lft rgt)
//(~(BBT.got_size K V rgt) P new)
//(~(BBT.got_size K V lft) P new)

View File

@ -1,18 +1,31 @@
BBT.rgt_rotate
: ∀(K: *)
∀(V: *)
∀(size: U60)
∀(key: K)
∀(val: V)
∀(lft: (BBT K V))
∀(rgt: (BBT K V))
(BBT K V)
= λK λV λsize λkey λval λlft λrgt
use P = λx ∀(key: K) ∀(val: V) ∀(rgt: (BBT K V)) (BBT K V)
use bin = λ_size λlft.key λlft.val λlft.lft λlft.rgt λkey λval λrgt
use b = (BBT.new_node K V key val lft.rgt rgt)
use a = (BBT.new_node K V lft.key lft.val lft.lft b)
a
use tip = λkey λval λrgt
(BBT.bin K V size key val (BBT.tip K V) rgt)
(~lft P bin tip key val rgt)
use BBT/{bin,tip}
rgt_rotate <K> <V> (size: U60) (key: K) (val: V) (lft: (BBT K V)) (rgt: (BBT K V)) : (BBT K V) =
match lft {
bin:
use b = (BBT/new_node key val lft.rgt rgt)
use a = (BBT/new_node lft.key lft.val lft.lft b)
a
tip: (bin K V size key val (tip K V) rgt)
}
//BBT.rgt_rotate
//: ∀(K: *)
//∀(V: *)
//∀(size: U60)
//∀(key: K)
//∀(val: V)
//∀(lft: (BBT K V))
//∀(rgt: (BBT K V))
//(BBT K V)
//= λK λV λsize λkey λval λlft λrgt
//use P = λx ∀(key: K) ∀(val: V) ∀(rgt: (BBT K V)) (BBT K V)
//use bin = λ_size λlft.key λlft.val λlft.lft λlft.rgt λkey λval λrgt
//use b = (BBT.new_node K V key val lft.rgt rgt)
//use a = (BBT.new_node K V lft.key lft.val lft.lft b)
//a
//use tip = λkey λval λrgt
//(BBT.bin K V size key val (BBT.tip K V) rgt)
//(~lft P bin tip key val rgt)

View File

@ -1,61 +1,81 @@
BBT.set
: ∀(K: *)
∀(V: *)
∀(cmp: ∀(a: K) ∀(b: K) Cmp)
∀(key: K)
∀(val: V)
∀(map: (BBT K V))
(BBT K V)
= λK λV λcmp λkey λval λmap
use P = λx ∀(key: K) ∀(val: V) (BBT K V)
use bin = λsize λnext.key λnext.val λnext.lft λnext.rgt λkey λval
use P = λx
∀(key: K)
∀(next.key: K)
∀(next.val: V)
∀(next.lft: (BBT K V))
∀(next.rgt: (BBT K V))
∀(key: K)
∀(val: V)
(BBT K V)
use ltn = λkey λnext.key λnext.val λnext.lft λnext.rgt λkey λval
use new_lft = (BBT.set K V cmp key val next.lft)
(BBT.balance
K
V
cmp
key
next.key
next.val
new_lft
next.rgt
)
use eql = λkey λnext.key λnext.val λnext.lft λnext.rgt λkey λval
(BBT.bin K V size next.key val next.lft next.rgt)
use gtn = λkey λnext.key λnext.val λnext.lft λnext.rgt λkey λval
use new_rgt = (BBT.set K V cmp key val next.rgt)
(BBT.balance
K
V
cmp
key
next.key
next.val
next.lft
new_rgt
)
(~(cmp key next.key)
P
ltn
eql
gtn
key
next.key
next.val
next.lft
next.rgt
key
val
)
use tip = λkey λval (BBT.singleton K V key val)
(~map P bin tip key val)
use BBT/{bin,tip}
use Cmp/{ltn,eql,gtn}
set <K> <V> (cmp: ∀(a: K) ∀(b: K) Cmp) (key: K) (val: V) (map: (BBT K V)) : (BBT K V) =
match map {
bin:
match _ = (cmp key map.key) {
ltn:
use new_lft = (set cmp key val map.lft)
(BBT/balance cmp key map.key map.val new_lft map.rgt)
eql: (bin K V map.size map.key val map.lft map.rgt)
gtn:
use new_rgt = (set cmp key val map.rgt)
(BBT/balance cmp key map.key map.val map.lft new_rgt)
}
tip: (BBT/singleton key val)
}
//BBT.set
//: ∀(K: *)
//∀(V: *)
//∀(cmp: ∀(a: K) ∀(b: K) Cmp)
//∀(key: K)
//∀(val: V)
//∀(map: (BBT K V))
//(BBT K V)
//= λK λV λcmp λkey λval λmap
//use P = λx ∀(key: K) ∀(val: V) (BBT K V)
//use bin = λsize λnext.key λnext.val λnext.lft λnext.rgt λkey λval
//use P = λx
//∀(key: K)
//∀(next.key: K)
//∀(next.val: V)
//∀(next.lft: (BBT K V))
//∀(next.rgt: (BBT K V))
//∀(key: K)
//∀(val: V)
//(BBT K V)
//use ltn = λkey λnext.key λnext.val λnext.lft λnext.rgt λkey λval
//use new_lft = (BBT.set K V cmp key val next.lft)
//(BBT.balance
//K
//V
//cmp
//key
//next.key
//next.val
//new_lft
//next.rgt
//)
//use eql = λkey λnext.key λnext.val λnext.lft λnext.rgt λkey λval
//(BBT.bin K V size next.key val next.lft next.rgt)
//use gtn = λkey λnext.key λnext.val λnext.lft λnext.rgt λkey λval
//use new_rgt = (BBT.set K V cmp key val next.rgt)
//(BBT.balance
//K
//V
//cmp
//key
//next.key
//next.val
//next.lft
//new_rgt
//)
//(~(cmp key next.key)
//P
//ltn
//eql
//gtn
//key
//next.key
//next.val
//next.lft
//next.rgt
//key
//val
//)
//use tip = λkey λval (BBT.singleton K V key val)
//(~map P bin tip key val)

View File

@ -1,4 +1,10 @@
BBT.singleton
: ∀(K: *) ∀(V: *) ∀(key: K) ∀(val: V) (BBT K V)
= λK λV λkey λval
(BBT.bin K V 1 key val (BBT.tip K V) (BBT.tip K V))
singleton <K> <V> (key: K) (val: V) : (BBT K V) =
use tip = (BBT/tip K V)
(BBT/bin K V 1 key val tip tip)
//BBT.singleton
//: ∀(K: *) ∀(V: *) ∀(key: K) ∀(val: V) (BBT K V)
//= λK λV λkey λval
//(BBT.bin K V 1 key val (BBT.tip K V) (BBT.tip K V))

View File

@ -1,3 +1,3 @@
BBT.tip
: ∀(K: *) ∀(V: *) (BBT K V)
= λK λV ~λP λbin λtip tip
= λK λV ~λP λbin λtip tip

View File

@ -1,17 +1,32 @@
BBT.to_list
: ∀(K: *) ∀(V: *) ∀(map: (BBT K V))
(List (Pair K V))
= λK λV λmap
use P = λx (List (Pair K V))
use bin = λsize λkey λval λlft λrgt
use lft = (BBT.to_list K V lft)
use rgt = (BBT.to_list K V rgt)
use pair = (Pair.new K V key val)
use list = (List.cons
(Pair K V)
pair
(List.concat (Pair K V) lft rgt)
)
list
use tip = (List.nil (Pair K V))
(~map P bin tip)
use BBT/{bin,tip}
to_list <K> <V> (map: (BBT K V)) : (List (Pair K V)) =
match map {
bin:
use lft = (to_list map.lft)
use rgt = (to_list map.rgt)
use pair = (Pair/new map.key map.val)
use list = (List/cons pair (List/concat lft rgt))
list
tip: List/nil
}
//BBT.to_list
//: ∀(K: *) ∀(V: *) ∀(map: (BBT K V))
//(List (Pair K V))
//= λK λV λmap
//use P = λx (List (Pair K V))
//use bin = λsize λkey λval λlft λrgt
//use lft = (BBT.to_list K V lft)
//use rgt = (BBT.to_list K V rgt)
//use pair = (Pair.new K V key val)
//use list = (List.cons
//(Pair K V)
//pair
//(List.concat (Pair K V) lft rgt)
//)
//list
//use tip = (List.nil (Pair K V))
//(~map P bin tip)