diff options
| author | Andreas Grois <andi@grois.info> | 2024-08-08 23:33:30 +0200 |
|---|---|---|
| committer | Andreas Grois <andi@grois.info> | 2024-08-08 23:33:30 +0200 |
| commit | 904115cbc97c668fc596a6d69eeb7b3db1f4a635 (patch) | |
| tree | a4e25c6d66ea866c52380d7fde3a6ea9294b96a1 | |
| parent | 9c8021d0cd90fe6f0ed9a9c15679b80b099f4229 (diff) | |
heapRemoveLastWithIndexRelation - continued
| -rw-r--r-- | BinaryHeap/CompleteTree/AdditionalProofs/Get.lean | 67 | ||||
| -rw-r--r-- | BinaryHeap/CompleteTree/AdditionalProofs/HeapRemoveLast.lean | 76 |
2 files changed, 89 insertions, 54 deletions
diff --git a/BinaryHeap/CompleteTree/AdditionalProofs/Get.lean b/BinaryHeap/CompleteTree/AdditionalProofs/Get.lean new file mode 100644 index 0000000..f86fd76 --- /dev/null +++ b/BinaryHeap/CompleteTree/AdditionalProofs/Get.lean @@ -0,0 +1,67 @@ +import BinaryHeap.CompleteTree.AdditionalOperations +import BinaryHeap.CompleteTree.Lemmas + +namespace BinaryHeap.CompleteTree.AdditionalProofs + +theorem get_right {α : Type u} {n : Nat} (tree : CompleteTree α n) (index : Fin n) (h₁ : n > 0) (h₂ : index > tree.leftLen h₁) : + have h₃ : ↑index - tree.leftLen h₁ - 1 < tree.rightLen h₁ := by + revert h₂ + unfold leftLen rightLen length + split + intro h₂ + rename_i o p v l r _ _ _ _ + have h₃ := index.isLt + apply Nat.sub_lt_right_of_lt_add + omega + apply Nat.sub_lt_right_of_lt_add + omega + have : p+1+o = (o.add p).succ := by simp_arith + rw[this] + assumption + have h₄ : tree.rightLen h₁ > 0 := Nat.zero_lt_of_lt h₃ + tree.get index h₁ = (tree.right h₁).get ⟨index.val - (tree.leftLen h₁) - 1, h₃⟩ h₄ +:= + match n, tree with + | (o+p+1), .branch v l r _ _ _ => by + simp[right_unfold, leftLen_unfold] + rw[leftLen_unfold] at h₂ + generalize hnew : get ⟨↑index - o - 1, _⟩ r _ = new + unfold get get' + split + case h_1 => + contradiction + case h_2 j h₃ o2 p2 v2 l2 r2 _ _ _ d1 he₁ he₂ _ => + clear d1 + have : o = o2 := heqSameLeftLen (congrArg Nat.succ he₁) (Nat.succ_pos _) he₂ + have : p = p2 := heqSameRightLen (congrArg Nat.succ he₁) (Nat.succ_pos _) he₂ + subst o2 p2 + simp at he₂ + have : v = v2 := he₂.left + have : l = l2 := he₂.right.left + have : r = r2 := he₂.right.right + subst r2 l2 v2 + simp_all + have : ¬j < o := by simp_arith[h₂] + simp[this] + cases p <;> simp + case zero => + omega + case succ pp _ _ _ _ _ _ => + have : j + 1 - o - 1 = j - o := by omega + simp[this] at hnew + rw[get_eq_get'] + assumption + +theorem get_right' {α : Type u} {n m : Nat} {v : α} {l : CompleteTree α n} {r : CompleteTree α m} {m_le_n : m ≤ n} {max_height_diff : n < 2 * (m + 1)} {subtree_complete : (n + 1).isPowerOfTwo ∨ (m + 1).isPowerOfTwo} (index : Fin (n + m + 1)) (h₁ : index > n) : + have h₂ : ↑index - n - 1 < m := by + have h₃ := index.isLt + apply Nat.sub_lt_right_of_lt_add + omega + apply Nat.sub_lt_right_of_lt_add + omega + have : m + 1 + n = n + m + 1 := by simp_arith + rw[this] + assumption + (branch v l r m_le_n max_height_diff subtree_complete).get index (Nat.succ_pos _) = r.get ⟨index.val - n - 1, h₂⟩ (Nat.zero_lt_of_lt h₂) +:= + get_right (branch v l r m_le_n max_height_diff subtree_complete) index (Nat.succ_pos _) h₁ diff --git a/BinaryHeap/CompleteTree/AdditionalProofs/HeapRemoveLast.lean b/BinaryHeap/CompleteTree/AdditionalProofs/HeapRemoveLast.lean index 99ce68a..0d87a2c 100644 --- a/BinaryHeap/CompleteTree/AdditionalProofs/HeapRemoveLast.lean +++ b/BinaryHeap/CompleteTree/AdditionalProofs/HeapRemoveLast.lean @@ -1,6 +1,7 @@ import BinaryHeap.CompleteTree.HeapOperations import BinaryHeap.CompleteTree.HeapProofs.HeapRemoveLast import BinaryHeap.CompleteTree.AdditionalProofs.Contains +import BinaryHeap.CompleteTree.AdditionalProofs.Get namespace BinaryHeap.CompleteTree.AdditionalProofs @@ -741,6 +742,10 @@ private theorem heapRemoveLastWithIndexIndexNeZeroForNGt1 {α : Type u} {n : Nat subst p rfl +private theorem Fin.ne_zero_of_gt {n : Nat} {i j : Fin (n+1)} (h₁ : i > j) : i ≠ 0 := + have : 0 ≤ j := Fin.zero_le _ + by omega + protected theorem heapRemoveLastWithIndexRelationGt {α : Type u} {n : Nat} (heap : CompleteTree α (n+1)) (index : Fin (n+1)) (h₁ : index > (CompleteTree.Internal.heapRemoveLastWithIndex heap).snd.snd) : have : (CompleteTree.Internal.heapRemoveLastWithIndex heap).snd.snd ≥ 0 := Fin.zero_le _ @@ -766,62 +771,25 @@ case isFalse h₃ => contradiction case succ pp _ _ _ _ => generalize hold : get index (branch v l r _ _ _) _ = oldValue - unfold get at hold ⊢ - simp at hold ⊢ - unfold get' at hold ⊢ - split - <;> split at hold - case h_1.h_1 => - exact absurd h₁ $ Fin.not_lt_zero _ - case h_1.h_2 j _ _ _ _ _ _ _ _ _ _ _ _ _ hj => - have h₃ : j = 0 := by simp at hj; exact Fin.val_eq_of_eq hj - subst j + have h₄ : index ≠ 0 := Fin.ne_zero_of_gt h₁ + have h₅ : index.pred h₄ > o := by + simp + rw[Fin.lt_iff_val_lt_val] at h₁ simp at h₁ - have := Fin.lt_iff_val_lt_val.mp h₁ - simp_arith at this - case h_2.h_1 hx => - contradiction - case h_2.h_2 j2 h₃2 or pr vr lr rr _ _ _ d3 he3 he4 j h₃ o2 p2 v2 l2 r2 _ _ _ d2 he1 he2 d1 hje => - clear d2 d3 - have : j = j2 + 1 := by simp at hje; assumption - subst j - have : o = o2 := heqSameLeftLen (congrArg Nat.succ he1) (by omega) he2 - have : (pp+1) = p2 := heqSameRightLen (congrArg Nat.succ he1) (by omega) he2 - subst o2 p2 - simp at he2 - have := he2.left - have := he2.right.left - have := he2.right.right - subst v2 l2 r2 - have : o = or := heqSameLeftLen (congrArg Nat.succ he3) (by omega) he4 - have : (pp + 1 - 1) = pr := heqSameRightLen (congrArg Nat.succ he3) (by omega) he4 - subst or pr - simp at he4 - have := he4.left - have := he4.right.left - subst lr vr - simp at he4 - have : ¬j2 + 1 < o := by simp_arith[Fin.lt_iff_val_lt_val] at h₁; omega - simp[this] at hold - have : ¬j2 < o := by simp_arith[Fin.lt_iff_val_lt_val] at h₁; omega - simp[this] - --cases pp - --omega - split - rename_i d2 d3 d4 d5 d6 d7 d8 - clear d2 d3 d4 d5 d6 d7 d8 hje d1 - rename_i d2 d3 d4 d5 d6 d7 d8 d9 h₆2 pp2 rr2 _ _ _ h₂ h₅ d1 h₆ he6 he5 - clear d1 d2 d3 d4 d5 d6 d7 d8 d9 h₆2 - simp at he6 - subst he6 - simp at he5 - subst rr2 - subst oldValue - have : pp2+1+1 < o + (pp2 + 1 + 1) := by omega - have : ⟨j2 + 1 - o, by omega⟩ > (CompleteTree.Internal.heapRemoveLastWithIndex r).snd.snd := sorry - --have htest := CompleteTree.AdditionalProofs.heapRemoveLastWithIndexRelationGt r ⟨j2 + 1 - o, by omega⟩ this - --simp at htest + omega + have h₆ : index > o := by + simp at h₅ + omega + have h₇ : ↑index - o - 1 < pp + 1 := by + have := index.isLt + simp at h₅ sorry + rw[get_right' _ h₅] + rw[get_right' _ h₆] at hold + rw[←hold] + have := CompleteTree.AdditionalProofs.heapRemoveLastWithIndexRelationGt r ⟨↑index - o - 1, h₇⟩ + --have : (⟨↑(index.pred (this)) - o - 1, _⟩ : Fin (pp+1)) = (⟨↑index - o - 1, _⟩ : Fin (pp + 1 + 1)).pred _:= sorry + sorry case isTrue h₃ => --removed left sorry |
