diff options
| author | Andreas Grois <andi@grois.info> | 2024-07-23 22:19:57 +0200 |
|---|---|---|
| committer | Andreas Grois <andi@grois.info> | 2024-07-23 22:19:57 +0200 |
| commit | c8371da0cbc68f6a2455da7c64c3d3346b7f4d45 (patch) | |
| tree | 228087a00aafb9a988a737129aa360c85147355e /BinaryHeap/CompleteTree/Basic.lean | |
| parent | a4734cad1ef5f69cf9505c923eb2990c5403616c (diff) | |
Split code in multiple source files. Separate proofs and logic.
Diffstat (limited to 'BinaryHeap/CompleteTree/Basic.lean')
| -rw-r--r-- | BinaryHeap/CompleteTree/Basic.lean | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/BinaryHeap/CompleteTree/Basic.lean b/BinaryHeap/CompleteTree/Basic.lean new file mode 100644 index 0000000..52ea93d --- /dev/null +++ b/BinaryHeap/CompleteTree/Basic.lean @@ -0,0 +1,48 @@ +namespace BinaryHeap + +inductive CompleteTree (α : Type u) : Nat → Type u + | leaf : CompleteTree α 0 + | branch : + (val : α) + → (left : CompleteTree α n) + → (right : CompleteTree α m) + → m ≤ n + → n < 2*(m+1) + → (n+1).isPowerOfTwo ∨ (m+1).isPowerOfTwo + → CompleteTree α (n+m+1) +deriving Repr + +/--Creates an empty CompleteTree.-/ +abbrev CompleteTree.empty {α : Type u} := CompleteTree.leaf (α := α) + +/-- Returns the element stored in the root node. -/ +def CompleteTree.root (tree : CompleteTree α n) (_ : 0 < n) : α := match tree with +| .branch a _ _ _ _ _ => a + +/-- Same as CompleteTree.root, but a bit more ergonomic to use. However, CompleteTree.root is better suited for proofs-/ +def CompleteTree.root' (tree : CompleteTree α (n+1)) : α := tree.root (Nat.zero_lt_succ n) + +/-- Extracts the element count. For when pattern matching is too much work. -/ +def CompleteTree.length : CompleteTree α n → Nat := λ_ ↦ n + +/-- Returns the lenght of the left sub-tree. Mostly exists as a helper for expressing the return type of CompleteTree.left -/ +def CompleteTree.leftLen (tree : CompleteTree α n) (_ : n > 0) : Nat := match n, tree with +| (_+_), .branch _ l _ _ _ _ => l.length + +def CompleteTree.leftLen' (tree : CompleteTree α (n+1)) : Nat := tree.leftLen (Nat.zero_lt_succ n) + +/-- Returns the lenght of the right sub-tree. Mostly exists as a helper for expressing the return type of CompleteTree.right -/ +def CompleteTree.rightLen (tree : CompleteTree α n) (_ : n > 0) : Nat := match n, tree with +| (_+_), .branch _ _ r _ _ _ => r.length + +def CompleteTree.rightLen' (tree : CompleteTree α (n+1)) : Nat := tree.rightLen (Nat.zero_lt_succ n) + +def CompleteTree.left (tree : CompleteTree α n) (h₁ : n > 0) : CompleteTree α (tree.leftLen h₁) := match n, tree with +| (_+_), .branch _ l _ _ _ _ => l + +def CompleteTree.left' (tree : CompleteTree α (n+1)) : CompleteTree α (tree.leftLen (Nat.zero_lt_succ n)) := tree.left (Nat.zero_lt_succ n) + +def CompleteTree.right (tree : CompleteTree α n) (h₁ : n > 0) : CompleteTree α (tree.rightLen h₁) := match n, tree with +| (_+_), .branch _ _ r _ _ _ => r + +def CompleteTree.right' (tree : CompleteTree α (n+1)) : CompleteTree α (tree.rightLen (Nat.zero_lt_succ n)) := tree.right (Nat.zero_lt_succ n) |
