@@ -7945,4 +7945,114 @@ end Const
79457945
79467946end map
79477947
7948+ theorem prune_LE_eq_filter {α β} [Ord α] [TransOrd α] (t : Internal.Impl α β) (ord_t : t.Ordered) (lower_bound : α) :
7949+ (t.prune_LE ord_t lower_bound).toList = t.toList.filter (fun e => (compare e.fst lower_bound).isGE) := by
7950+ induction t
7951+ case leaf =>
7952+ simp only [prune_LE, toList_eq_toListModel, toListModel_leaf, List.filter_nil]
7953+ case inner _ k v l r l_ih r_ih =>
7954+ simp only [prune_LE, toList_eq_toListModel, toListModel_inner, List.filter_append]
7955+ generalize heq : compare lower_bound k = x
7956+ cases x
7957+ case lt =>
7958+ simp only [toListModel_inner]
7959+ specialize l_ih (Internal.Impl.Ordered.left ord_t)
7960+ rw [toList_eq_toListModel] at l_ih
7961+ simp only [l_ih, toList_eq_toListModel, List.filter, List.append_cancel_left_eq]
7962+ rw [OrientedOrd.eq_swap, Ordering.swap_eq_lt] at heq
7963+ simp only [heq, Ordering.isGE_gt, List.cons.injEq, true_and]
7964+ symm
7965+ apply List.filter_eq_self.2
7966+ intro a mem
7967+ apply Ordering.isGE_of_eq_gt
7968+ apply TransCmp.gt_trans ?_ heq
7969+ rw [OrientedOrd.eq_swap, Ordering.swap_eq_gt]
7970+ exact Internal.Impl.Ordered.compare_right ord_t mem
7971+ case eq =>
7972+ simp only [toListModel_inner, toListModel_leaf, List.nil_append, List.filter]
7973+ rw [OrientedCmp.eq_comm] at heq
7974+ simp only [heq, Ordering.isGE_eq]
7975+ suffices new_goal : List.filter (fun e => (compare e.fst lower_bound).isGE) l.toListModel = [] from by
7976+ simp only [new_goal, List.nil_append, List.cons.injEq, true_and]
7977+ symm
7978+ apply List.filter_eq_self.2
7979+ intro a mem
7980+ apply Ordering.isGE_of_eq_gt
7981+ apply TransCmp.gt_of_gt_of_eq ?_ heq
7982+ rw [OrientedOrd.eq_swap, Ordering.swap_eq_gt]
7983+ apply Internal.Impl.Ordered.compare_right ord_t mem
7984+ rw [List.filter_eq_nil_iff]
7985+ intro a mem
7986+ simp only [Bool.not_eq_true, Ordering.isGE_eq_false]
7987+ exact TransCmp.lt_of_lt_of_eq (Internal.Impl.Ordered.compare_left ord_t mem) heq
7988+ case gt =>
7989+ simp only [List.filter]
7990+ rw [OrientedOrd.eq_swap, Ordering.swap_eq_gt] at heq
7991+ rw [heq]
7992+ suffices new_goal : List.filter (fun e => (compare e.fst lower_bound).isGE) l.toListModel = [] from by
7993+ simp only [new_goal, Ordering.isGE_lt, List.nil_append]
7994+ simp only [toList_eq_toListModel] at r_ih
7995+ apply r_ih
7996+ rw [List.filter_eq_nil_iff]
7997+ intro a mem
7998+ simp only [Bool.not_eq_true, Ordering.isGE_eq_false]
7999+ exact TransCmp.lt_trans (Internal.Impl.Ordered.compare_left ord_t mem) heq
8000+
8001+ theorem prune_LT_eq_filter {α β} [Ord α] [TransOrd α] (t : Internal.Impl α β) (ord_t : t.Ordered) (lower_bound : α) :
8002+ (t.prune_LT ord_t lower_bound).toList = t.toList.filter (fun e => (compare e.fst lower_bound).isGT) := by
8003+ induction t
8004+ case leaf =>
8005+ simp only [prune_LT, toList_eq_toListModel, toListModel_leaf, List.filter_nil]
8006+ case inner _ k v l r l_ih r_ih =>
8007+ simp only [prune_LT, toList_eq_toListModel, toListModel_inner, List.filter_append]
8008+ generalize heq : compare lower_bound k = x
8009+ cases x
8010+ case lt =>
8011+ simp
8012+ specialize l_ih (Internal.Impl.Ordered.left ord_t)
8013+ rw [toList_eq_toListModel] at l_ih
8014+ simp only [l_ih, toList_eq_toListModel, List.filter, List.append_cancel_left_eq]
8015+ rw [OrientedOrd.eq_swap, Ordering.swap_eq_lt] at heq
8016+ simp only [heq, Ordering.isGT_gt, List.cons.injEq, true_and]
8017+ symm
8018+ apply List.filter_eq_self.2
8019+ intro a mem
8020+ rw [Ordering.isGT_iff_eq_gt]
8021+ apply TransCmp.gt_trans ?_ heq
8022+ rw [OrientedOrd.eq_swap, Ordering.swap_eq_gt]
8023+ exact Internal.Impl.Ordered.compare_right ord_t mem
8024+ case eq =>
8025+ simp only [List.filter]
8026+ rw [OrientedCmp.eq_comm] at heq
8027+ rw [heq]
8028+ suffices new_goal : List.filter (fun e => (compare e.fst lower_bound).isGT) l.toListModel = [] ∧
8029+ List.filter (fun e => (compare e.fst lower_bound).isGT) r.toListModel = r.toListModel from by
8030+ simp only [new_goal, Ordering.isGT_eq, List.nil_append]
8031+ apply And.intro
8032+ . rw [List.filter_eq_nil_iff]
8033+ intro a mem
8034+ simp only [Ordering.isGT_iff_eq_gt, ← Ordering.isLE_iff_ne_gt]
8035+ apply TransOrd.isLE_trans _ (Ordering.isLE_of_eq_eq heq)
8036+ apply Ordering.isLE_of_eq_lt
8037+ exact Internal.Impl.Ordered.compare_left ord_t mem
8038+ . apply List.filter_eq_self.2
8039+ intro a mem
8040+ rw [Ordering.isGT_iff_eq_gt]
8041+ apply TransCmp.gt_of_gt_of_eq ?_ heq
8042+ rw [OrientedOrd.eq_swap, Ordering.swap_eq_gt]
8043+ exact Internal.Impl.Ordered.compare_right ord_t mem
8044+ case gt =>
8045+ simp only [List.filter]
8046+ rw [OrientedOrd.eq_swap] at heq
8047+ rw [Ordering.swap_eq_gt] at heq
8048+ simp only [heq, Ordering.isGT_lt]
8049+ specialize r_ih (Ordered.right ord_t)
8050+ rw [toList_eq_toListModel] at r_ih
8051+ simp only [r_ih, toList_eq_toListModel, List.self_eq_append_left, List.filter_eq_nil_iff,
8052+ Ordering.isGT_iff_eq_gt]
8053+ intro a mem
8054+ rw [← Ordering.isLE_iff_ne_gt]
8055+ apply Ordering.isLE_of_eq_lt
8056+ exact TransCmp.lt_trans (Internal.Impl.Ordered.compare_left ord_t mem) heq
8057+
79488058end Std.DTreeMap.Internal.Impl
0 commit comments