PFDS Chapter #05 Examples in Oz
% Functions defined in previous chapters
ORDEREDVALUE =
functor
export
eq : EQ
lt : LT
leq : LEQ
define
fun {EQ X Y} X == Y end
fun {LT X Y} X < Y end
fun {LEQ X Y} X =< Y end
end
[OrderedValue] = {Module.apply [ORDEREDVALUE]}
% Utility functions for tests
proc {HeapTest F}
A = {F.insert 1 F.empty}
B = {F.insert 3 A}
C = {F.insert 7 B}
D = {F.insert 5 C}
X = {F.insert 2 F.empty}
Y = {F.insert 6 X}
Z = {F.insert 4 Y}
H = {F.merge D Z}
in
{Browse D}
{Browse Z}
{Browse H}
{Browse {F.findMin H}}
{Browse {F.findMin {F.deleteMin H}}}
{Browse {F.findMin {F.deleteMin {F.deleteMin H}}}}
{Browse {F.findMin {F.deleteMin {F.deleteMin {F.deleteMin H}}}}}
{Browse {F.findMin {F.deleteMin {F.deleteMin {F.deleteMin {F.deleteMin H}}}}}}
{Browse {F.findMin {F.deleteMin {F.deleteMin {F.deleteMin {F.deleteMin {F.deleteMin H}}}}}}}
{Browse {F.findMin {F.deleteMin {F.deleteMin {F.deleteMin {F.deleteMin {F.deleteMin {F.deleteMin H}}}}}}}}
end
proc {QueueTest F}
A = F.empty
B = {F.snoc A 1}
C = {F.snoc B 2}
D = {F.snoc C 3}
in
{Browse D}
{Browse {F.head D}}
{Browse {F.head {F.tail D}}}
{Browse {F.head {F.tail {F.tail D}}}}
end
% 5.2 BatchedQueue
BATCHEDQUEUE =
functor
export
empty : Empty
isEmpty : IsEmpty
snoc : Snoc
head : Head
tail : Tail
define
Empty = nil#nil
fun {IsEmpty Q}
case Q
of nil#_ then true
else false
end
end
fun {CheckF Q}
case Q
of nil#R then {List.reverse R}#nil
else Q
end
end
fun {Snoc Q=F#R X}
{CheckF F#(X|R)}
end
fun {Head Q}
case Q
of (H|T)#_ then H
else raise empty end
end
end
fun {Tail Q}
case Q
of (H|T)#R then {CheckF T#R}
else raise empty end
end
end
end
[BatchedQueue] = {Module.apply [BATCHEDQUEUE]}
{QueueTest BatchedQueue}
% 5.4 SplayHeap
SPLAYHEAP =
functor
export
initialize : Initialize
empty : Empty
isEmpty : IsEmpty
insert : Insert
merge : Merge
findMin : FindMin
deleteMin : DeleteMin
define
Element
proc {Initialize OrderedSet}
Element = OrderedSet
end
Empty = nil
fun {IsEmpty Heap} Heap == Empty end
fun {Partition Pivot Heap}
case Heap
of nil then nil#nil
[] tree(A X B) then
if {Element.leq X Pivot} then
case B
of nil then Heap#nil
[] tree(B1 Y B2) then
if {Element.leq Y Pivot} then
local
Small#Big = {Partition Pivot B2}
in
tree(tree(A X B1) Y Small)#Big
end
else
local
Small#Big = {Partition Pivot B1}
in
tree(A X Small)#tree(Big Y B2)
end
end
end
else
case A
of nil then nil#Heap
[] tree(A1 Y A2) then
if {Element.leq Y Pivot} then
local
Small#Big = {Partition Pivot A2}
in
tree(A1 Y Small)#tree(Big X B)
end
else
local
Small#Big = {Partition Pivot A1}
in
Small#tree(Big Y tree(A2 X B))
end
end
end
end
end
end
fun {Insert X Heap}
A#B = {Partition X Heap}
in
tree(A X B)
end
fun {Merge Heap1 Heap2}
case Heap1
of nil then Heap2
[] tree(A X B) then
local
Ta#Tb = {Partition X Heap2}
in
tree({Merge Ta A} X {Merge Tb B})
end
end
end
fun {FindMin Heap}
case Heap
of tree(nil X B) then X
[] tree(A X B) then {FindMin A}
else raise empty end
end
end
fun {DeleteMin Heap}
case Heap
of tree(nil X B) then B
[] tree(tree(nil X B) Y C) then tree(B Y C)
[] tree(tree(A X B) Y C) then tree({DeleteMin A} X tree(B Y C))
else raise empty end
end
end
end
[SplayHeap] = {Module.apply [SPLAYHEAP]}
{SplayHeap.initialize OrderedValue}
{HeapTest SplayHeap}
% 5.5 PairingHeap
PAIRINGHEAP =
functor
export
initialize : Initialize
empty : Empty
isEmpty : IsEmpty
insert : Insert
merge : Merge
findMin : FindMin
deleteMin : DeleteMin
define
Element
proc {Initialize OrderedSet}
Element = OrderedSet
end
Empty = nil
fun {IsEmpty Heap} Heap == Empty end
fun {Merge Heap1 Heap2}
case Heap1#Heap2
of _#nil then Heap1
[] nil#_ then Heap2
[] tree(X Hs1)#tree(Y Hs2) then
if {Element.leq X Y} then
tree(X Heap2|Hs1)
else
tree(Y Heap1|Hs2)
end
end
end
fun {Insert X Heap}
{Merge tree(X nil) Heap}
end
fun {MergePairs HeapList}
case HeapList
of nil then nil
[] [X] then X
[] Heap1|Heap2|Hs then {Merge {Merge Heap1 Heap2} {MergePairs Hs}}
end
end
fun {FindMin Heap}
case Heap
of tree(X Hs) then X
else raise empty end
end
end
fun {DeleteMin Heap}
case Heap
of tree(X Hs) then {MergePairs Hs}
else raise empty end
end
end
end
[PairingHeap] = {Module.apply [PAIRINGHEAP]}
{PairingHeap.initialize OrderedValue}
{HeapTest PairingHeap}
|