aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Grois <andi@grois.info>2024-08-20 23:50:11 +0200
committerAndreas Grois <andi@grois.info>2024-08-20 23:50:11 +0200
commit7df84f9a3e399587c65a149bf4247154d9b07cc7 (patch)
tree035388c2093a1541c2da4e94eccbbd80e7098f0f
parent7d5df252a6e885f8b1ffab49196e0a4cc4b0131a (diff)
heapRemoveAtReturnsElementAt
-rw-r--r--BinaryHeap/CompleteTree/AdditionalProofs.lean1
-rw-r--r--BinaryHeap/CompleteTree/AdditionalProofs/HeapRemoveAt.lean29
2 files changed, 30 insertions, 0 deletions
diff --git a/BinaryHeap/CompleteTree/AdditionalProofs.lean b/BinaryHeap/CompleteTree/AdditionalProofs.lean
index 3659fa4..4ab43f0 100644
--- a/BinaryHeap/CompleteTree/AdditionalProofs.lean
+++ b/BinaryHeap/CompleteTree/AdditionalProofs.lean
@@ -3,3 +3,4 @@ import BinaryHeap.CompleteTree.AdditionalProofs.HeapRemoveLast
import BinaryHeap.CompleteTree.AdditionalProofs.HeapUpdateRoot
import BinaryHeap.CompleteTree.AdditionalProofs.HeapPop
import BinaryHeap.CompleteTree.AdditionalProofs.HeapUpdateAt
+import BinaryHeap.CompleteTree.AdditionalProofs.HeapRemoveAt
diff --git a/BinaryHeap/CompleteTree/AdditionalProofs/HeapRemoveAt.lean b/BinaryHeap/CompleteTree/AdditionalProofs/HeapRemoveAt.lean
new file mode 100644
index 0000000..ca4299f
--- /dev/null
+++ b/BinaryHeap/CompleteTree/AdditionalProofs/HeapRemoveAt.lean
@@ -0,0 +1,29 @@
+import BinaryHeap.CompleteTree.AdditionalProofs.HeapUpdateAt
+import BinaryHeap.CompleteTree.AdditionalProofs.Get
+import BinaryHeap.CompleteTree.AdditionalProofs.HeapPop
+import BinaryHeap.CompleteTree.AdditionalProofs.HeapRemoveLast
+
+namespace BinaryHeap.CompleteTree.AdditionalProofs
+
+theorem heapRemoveAtReturnsElementAt {α : Type u} {n : Nat} (le : α → α → Bool) (heap : CompleteTree α (n+1)) (index : Fin (n+1)) : (heap.heapRemoveAt le index).snd = heap.get' index := by
+ unfold heapRemoveAt
+ if h₁ : index = 0 then
+ simp only [h₁, ↓reduceDIte]
+ rw[get_eq_get', ←Fin.zero_eta, ←get_zero_eq_root]
+ exact heapPopReturnsRoot heap le
+ else
+ simp only [h₁, ↓reduceDIte, ge_iff_le]
+ if h₂ : index = (Internal.heapRemoveLastWithIndex heap).2.snd then
+ simp only [h₂, ↓reduceDIte]
+ exact Eq.symm $ CompleteTree.AdditionalProofs.heapRemoveLastWithIndexReturnsItemAtIndex heap
+ else
+ if h₃ : (Internal.heapRemoveLastWithIndex heap).2.snd ≤ index then
+ simp only[h₂, h₃, ↓reduceDIte]
+ have h₄ := CompleteTree.AdditionalProofs.heapRemoveLastWithIndexRelationGt heap index $ Nat.lt_of_le_of_ne h₃ (Fin.val_ne_iff.mpr (Ne.symm h₂))
+ rewrite[get_eq_get', ←h₄]
+ exact Eq.symm $ heapUpdateAtReturnsElementAt le _ _ _ _
+ else
+ simp only[h₂, h₃, ↓reduceDIte]
+ have h₄ := CompleteTree.AdditionalProofs.heapRemoveLastWithIndexRelationLt heap index (Nat.gt_of_not_le h₃)
+ rewrite[get_eq_get', ←h₄]
+ exact Eq.symm $ heapUpdateAtReturnsElementAt le _ _ _ _