Skip to content

Commit

Permalink
Merge pull request #272 from fifth-postulate/priorityqueue
Browse files Browse the repository at this point in the history
[WIP] implement a PriorityQueue
  • Loading branch information
VictorTaelin committed Aug 21, 2021
2 parents 40bbf30 + fd9dcfe commit 2bec13e
Show file tree
Hide file tree
Showing 21 changed files with 103 additions and 0 deletions.
3 changes: 3 additions & 0 deletions base/PriorityQueue.kind
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
type PriorityQueue<A: Type> {
new(priority: A -> Nat, tree: PriorityQueue.Tree<A>)
}
3 changes: 3 additions & 0 deletions base/PriorityQueue/In.kind
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
PriorityQueue.In<A: Type>(queue: PriorityQueue<A>, a: A): Type
open queue
PriorityQueue.Tree.In!(queue.tree, a)
4 changes: 4 additions & 0 deletions base/PriorityQueue/Tree.kind
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
type PriorityQueue.Tree <A: Type> {
empty
node(rank: Nat, element: A, left: PriorityQueue.Tree<A>, right: PriorityQueue.Tree<A>)
}
5 changes: 5 additions & 0 deletions base/PriorityQueue/Tree/Either.kind
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
type PriorityQueue.Tree.Either<A: Type, B: Type, C:Type> {
left(value: A)
here(value: B)
right(value: C)
}
6 changes: 6 additions & 0 deletions base/PriorityQueue/Tree/In.kind
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
PriorityQueue.Tree.In<A: Type>(tree: PriorityQueue.Tree<A>, a: A): Type
case tree {
empty: Empty
node:
PriorityQueue.Tree.Either<PriorityQueue.Tree.In!(tree.left, a), tree.element == a, PriorityQueue.Tree.In!(tree.right, a)>
}
2 changes: 2 additions & 0 deletions base/PriorityQueue/Tree/empty_tree_is_empty.kind
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
PriorityQueue.Tree.empty_tree_is_empty<A: Type>: PriorityQueue.Tree.is_empty(A, PriorityQueue.Tree.empty(A)) == true
refl
5 changes: 5 additions & 0 deletions base/PriorityQueue/Tree/is_empty.kind
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
PriorityQueue.Tree.is_empty<A: Type>(tree: PriorityQueue.Tree<A>): Bool
case tree {
empty: true
node: false
}
7 changes: 7 additions & 0 deletions base/PriorityQueue/Tree/make.kind
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
PriorityQueue.Tree.make<A: Type>(element: A, a: PriorityQueue.Tree<A>, b: PriorityQueue.Tree<A>): PriorityQueue.Tree<A>
let rank_a = PriorityQueue.Tree.rank!(a)
let rank_b = PriorityQueue.Tree.rank!(b)
if Nat.gte(rank_a, rank_b) then
PriorityQueue.Tree.node!(Nat.succ(rank_b), element, a b)
else
PriorityQueue.Tree.node!(Nat.succ(rank_a), element, b a)
13 changes: 13 additions & 0 deletions base/PriorityQueue/Tree/merge.kind
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
PriorityQueue.Tree.merge<A: Type>(priority: A -> Nat, a: PriorityQueue.Tree<A>, b: PriorityQueue.Tree<A>): PriorityQueue.Tree<A>
case a {
empty: b
node:
case b {
empty: a
node:
if Nat.lte(priority(a.element), priority(b.element)) then
PriorityQueue.Tree.make!(a.element, a.left, PriorityQueue.Tree.merge!(priority, a.right, b))
else
PriorityQueue.Tree.make!(b.element, b.left, PriorityQueue.Tree.merge!(priority, a, b.right))
}
}
9 changes: 9 additions & 0 deletions base/PriorityQueue/Tree/peek.kind
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
PriorityQueue.Tree.peek<A: Type>(tree: PriorityQueue.Tree<A>)<Hyp: PriorityQueue.Tree.is_empty!(tree) == false>: A
case tree with Hyp {
empty:
let hypothesis = Hyp :: rewrite x in (x == false) with PriorityQueue.Tree.empty_tree_is_empty<A>
let impossible = Bool.true_neq_false(hypothesis)
Empty.absurd!(impossible)
node: tree.element
}!

6 changes: 6 additions & 0 deletions base/PriorityQueue/Tree/rank.kind
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
PriorityQueue.Tree.rank<A: Type>(tree: PriorityQueue.Tree<A>): Nat
case tree {
empty: 0
node: tree.rank
}

2 changes: 2 additions & 0 deletions base/PriorityQueue/Tree/singleton.kind
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
PriorityQueue.Tree.singleton<A: Type>(a: A): PriorityQueue.Tree<A>
PriorityQueue.Tree.node!(1, a, PriorityQueue.Tree.empty!, PriorityQueue.Tree.empty!)
2 changes: 2 additions & 0 deletions base/PriorityQueue/empty.kind
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
PriorityQueue.empty<A: Type>(priority: A -> Nat): PriorityQueue<A>
PriorityQueue.new!(priority, PriorityQueue.Tree.empty!)
6 changes: 6 additions & 0 deletions base/PriorityQueue/head.kind
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
PriorityQueue.head<A: Type>(queue: PriorityQueue<A>): Maybe<A>
open queue
case queue.tree {
empty: Maybe.none!
node: Maybe.some!(queue.tree.element)
}
5 changes: 5 additions & 0 deletions base/PriorityQueue/insert.kind
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
PriorityQueue.insert<A: Type>(a: A, queue: PriorityQueue<A>): PriorityQueue<A>
open queue
let singleton = PriorityQueue.Tree.singleton!(a)
let merged = PriorityQueue.Tree.merge!(queue.priority, singleton queue.tree)
PriorityQueue.new!(queue.priority, merged)
3 changes: 3 additions & 0 deletions base/PriorityQueue/is_empty.kind
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
PriorityQueue.is_empty<A: Type>(queue: PriorityQueue<A>): Bool
open queue
PriorityQueue.Tree.is_empty!(queue.tree)
4 changes: 4 additions & 0 deletions base/PriorityQueue/is_empty_queue_implies_is_empty_tree.kind
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
PriorityQueue.is_empty_queue_implies_is_empty_tree<A: Type>(queue: PriorityQueue<A>): PriorityQueue.is_empty!(queue) == PriorityQueue.Tree.is_empty!(PriorityQueue.tree_of!(queue))
case queue {
new: refl
}!
3 changes: 3 additions & 0 deletions base/PriorityQueue/priority.kind
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
PriorityQueue.priority<A: Type>(queue: PriorityQueue<A>, a: A): Nat
open queue
queue.priority(a)
3 changes: 3 additions & 0 deletions base/PriorityQueue/safe_head.kind
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
PriorityQueue.safe_head<A: Type>(queue: PriorityQueue<A>)<Hyp: PriorityQueue.is_empty!(queue) == false>: A
let hypothesis = Hyp :: rewrite x in (x == false) with PriorityQueue.is_empty_queue_implies_is_empty_tree!(queue)
PriorityQueue.Tree.peek!(PriorityQueue.tree_of!(queue), hypothesis)
9 changes: 9 additions & 0 deletions base/PriorityQueue/tail.kind
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
PriorityQueue.tail<A: Type>(queue: PriorityQueue<A>): PriorityQueue<A>
open queue
case queue.tree {
empty: queue
node:
let priority = queue.priority
let merged = PriorityQueue.Tree.merge!(priority, queue.tree.left, queue.tree.right)
PriorityQueue.new!(queue.priority, merged)
}
3 changes: 3 additions & 0 deletions base/PriorityQueue/tree_of.kind
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
PriorityQueue.tree_of<A: Type>(queue: PriorityQueue<A>): PriorityQueue.Tree<A>
open queue
queue.tree

0 comments on commit 2bec13e

Please sign in to comment.