Skip to content

Commit 2e22c85

Browse files
authored
feat: add intersection on ExtDTreeMap/ExtTreeMap/ExtTreeSet (#11292)
This PR adds intersection operation on `ExtDTreeMap`/`ExtTreeMap`/`ExtTreeSet` and proves several lemmas about it.
1 parent e7ece45 commit 2e22c85

File tree

13 files changed

+871
-0
lines changed

13 files changed

+871
-0
lines changed

src/Std/Data/DTreeMap/Internal/Lemmas.lean

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4147,6 +4147,57 @@ theorem contains_inter!_eq_false_of_contains_eq_false_right [TransOrd α]
41474147
apply contains_inter_eq_false_of_contains_eq_false_right h₁ h₂
41484148
all_goals wf_trivial
41494149

4150+
/- Equiv -/
4151+
theorem Equiv.inter_left {m₃ : Impl α β} [TransOrd α]
4152+
(h₁ : m₁.WF) (h₂ : m₂.WF) (h₃ : m₃.WF) (equiv : m₁.Equiv m₂) :
4153+
(m₁.inter m₃ h₁.balanced).Equiv (m₂.inter m₃ h₂.balanced) := by
4154+
revert equiv
4155+
simp_to_model [Equiv, inter]
4156+
intro equiv
4157+
apply List.Perm.filter
4158+
wf_trivial
4159+
4160+
theorem Equiv.inter!_left {m₃ : Impl α β} [TransOrd α]
4161+
(h₁ : m₁.WF) (h₂ : m₂.WF) (h₃ : m₃.WF) (equiv : m₁.Equiv m₂) :
4162+
(m₁.inter! m₃).Equiv (m₂.inter! m₃) := by
4163+
rw [← inter_eq_inter!, ← inter_eq_inter!]
4164+
apply Equiv.inter_left
4165+
all_goals wf_trivial
4166+
4167+
theorem Equiv.inter_right {m₃ : Impl α β} [TransOrd α]
4168+
(h₁ : m₁.WF) (h₂ : m₂.WF) (h₃ : m₃.WF) (equiv : m₂.Equiv m₃) :
4169+
(m₁.inter m₂ h₁.balanced).Equiv (m₁.inter m₃ h₁.balanced) := by
4170+
revert equiv
4171+
simp_to_model [Equiv, inter]
4172+
intro equiv
4173+
apply List.perm_filter_containsKey_of_perm equiv
4174+
all_goals wf_trivial
4175+
4176+
theorem Equiv.inter!_right {m₃ : Impl α β} [TransOrd α]
4177+
(h₁ : m₁.WF) (h₂ : m₂.WF) (h₃ : m₃.WF) (equiv : m₂.Equiv m₃) :
4178+
(m₁.inter! m₂).Equiv (m₁.inter! m₃) := by
4179+
rw [← inter_eq_inter!, ← inter_eq_inter!]
4180+
apply Equiv.inter_right
4181+
all_goals wf_trivial
4182+
4183+
theorem Equiv.inter_congr {m₃ m₄ : Impl α β} [TransOrd α]
4184+
(h₁ : m₁.WF) (h₂ : m₂.WF) (h₃ : m₃.WF) (h₄ : m₄.WF)
4185+
(equiv₁ : m₁.Equiv m₃) (equiv₂ : m₂.Equiv m₄) :
4186+
(m₁.inter m₂ h₁.balanced).Equiv (m₃.inter m₄ h₃.balanced) := by
4187+
revert equiv₁ equiv₂
4188+
simp_to_model [Equiv, inter]
4189+
intro equiv₁ equiv₂
4190+
apply List.congr_filter_containsKey_of_perm
4191+
all_goals wf_trivial
4192+
4193+
theorem Equiv.inter!_congr {m₃ m₄ : Impl α β} [TransOrd α]
4194+
(h₁ : m₁.WF) (h₂ : m₂.WF) (h₃ : m₃.WF) (h₄ : m₄.WF)
4195+
(equiv₁ : m₁.Equiv m₃) (equiv₂ : m₂.Equiv m₄) :
4196+
(m₁.inter! m₂).Equiv (m₃.inter! m₄) := by
4197+
rw [← inter_eq_inter!, ← inter_eq_inter!]
4198+
apply Equiv.inter_congr
4199+
all_goals wf_trivial
4200+
41504201
/- get? -/
41514202
theorem get?_inter [TransOrd α] [LawfulEqOrd α] (h₁ : m₁.WF) (h₂ : m₂.WF) {k : α} :
41524203
(m₁.inter m₂ h₁.balanced).get? k =

src/Std/Data/DTreeMap/Lemmas.lean

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2567,6 +2567,22 @@ theorem not_mem_inter_of_not_mem_right [TransCmp cmp]
25672567
rw [← contains_eq_false_iff_not_mem] at h ⊢
25682568
exact Impl.contains_inter_eq_false_of_contains_eq_false_right t₁.wf t₂.wf h
25692569

2570+
/- Equiv -/
2571+
theorem Equiv.inter_left {t₃ : DTreeMap α β cmp} [TransCmp cmp]
2572+
(equiv : t₁ ~m t₂) :
2573+
(t₁ ∩ t₃).Equiv (t₂ ∩ t₃) :=
2574+
⟨Impl.Equiv.inter_left t₁.wf t₂.wf t₃.wf equiv.1
2575+
2576+
theorem Equiv.inter_right {t₃ : DTreeMap α β cmp} [TransCmp cmp]
2577+
(equiv : t₂ ~m t₃) :
2578+
(t₁ ∩ t₂).Equiv (t₁ ∩ t₃) :=
2579+
⟨Impl.Equiv.inter_right t₁.wf t₂.wf t₃.wf equiv.1
2580+
2581+
theorem Equiv.inter_congr {t₃ t₄ : DTreeMap α β cmp} [TransCmp cmp]
2582+
(equiv₁ : t₁ ~m t₃) (equiv₂ : t₂ ~m t₄) :
2583+
(t₁ ∩ t₂).Equiv (t₃ ∩ t₄) :=
2584+
⟨Impl.Equiv.inter_congr t₁.wf t₂.wf t₃.wf t₄.wf equiv₁.1 equiv₂.1
2585+
25702586
/- get? -/
25712587
theorem get?_inter [TransCmp cmp] [LawfulEqCmp cmp] {k : α} :
25722588
(t₁ ∩ t₂).get? k =

src/Std/Data/DTreeMap/Raw/Lemmas.lean

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2691,6 +2691,25 @@ theorem not_mem_inter_of_not_mem_right [TransCmp cmp] (h₁ : t₁.WF) (h₂ : t
26912691
simp only [Inter.inter]
26922692
exact Impl.contains_inter!_eq_false_of_contains_eq_false_right h₁ h₂ h
26932693

2694+
theorem Equiv.inter_left [TransCmp cmp] {t₃ : Raw α β cmp}
2695+
(h₁ : t₁.WF) (h₂ : t₂.WF) (h₃ : t₃.WF) (equiv : t₁ ~m t₂) :
2696+
(t₁ ∩ t₃).Equiv (t₂ ∩ t₃) := by
2697+
simp only [Inter.inter]
2698+
exact ⟨@Impl.Equiv.inter!_left _ _ ⟨cmp⟩ t₁.inner t₂.inner t₃.inner _ h₁.out h₂.out h₃.out equiv.1
2699+
2700+
theorem Equiv.inter_right [TransCmp cmp] {t₃ : Raw α β cmp}
2701+
(h₁ : t₁.WF) (h₂ : t₂.WF) (h₃ : t₃.WF) (equiv : t₂ ~m t₃) :
2702+
(t₁ ∩ t₂).Equiv (t₁ ∩ t₃) := by
2703+
simp only [Inter.inter]
2704+
exact ⟨@Impl.Equiv.inter!_right _ _ ⟨cmp⟩ t₁.inner t₂.inner t₃.inner _ h₁.out h₂.out h₃.out equiv.1
2705+
2706+
theorem Equiv.inter_congr [TransCmp cmp] {t₃ t₄ : Raw α β cmp}
2707+
(h₁ : t₁.WF) (h₂ : t₂.WF) (h₃ : t₃.WF) (h₄ : t₄.WF)
2708+
(equiv₁ : t₁ ~m t₃) (equiv₂ : t₂ ~m t₄) :
2709+
(t₁ ∩ t₂).Equiv (t₃ ∩ t₄) := by
2710+
simp only [Inter.inter]
2711+
exact ⟨@Impl.Equiv.inter!_congr _ _ ⟨cmp⟩ t₁.inner t₂.inner t₃.inner t₄.inner _ h₁.out h₂.out h₃.out h₄.out equiv₁.1 equiv₂.1
2712+
26942713
/- get? -/
26952714
theorem get?_inter [TransCmp cmp] [LawfulEqCmp cmp] (h₁ : t₁.WF) (h₂ : t₂.WF)
26962715
{k : α} :

src/Std/Data/ExtDTreeMap/Basic.lean

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -918,6 +918,17 @@ def union [TransCmp cmp] (m₁ m₂ : ExtDTreeMap α β cmp) : ExtDTreeMap α β
918918

919919
instance [TransCmp cmp] : Union (ExtDTreeMap α β cmp) := ⟨union⟩
920920

921+
@[inline, inherit_doc DTreeMap.union]
922+
def inter [TransCmp cmp] (m₁ m₂ : ExtDTreeMap α β cmp) : ExtDTreeMap α β cmp := lift₂ (fun x y : DTreeMap α β cmp => mk (x.inter y))
923+
(fun a b c d equiv₁ equiv₂ => by
924+
simp only [DTreeMap.inter_eq, mk'.injEq]
925+
apply Quotient.sound
926+
apply DTreeMap.Equiv.inter_congr
927+
. exact equiv₁
928+
. exact equiv₂) m₁ m₂
929+
930+
instance [TransCmp cmp] : Inter (ExtDTreeMap α β cmp) := ⟨inter⟩
931+
921932
instance [TransCmp cmp] [Repr α] [(a : α) → Repr (β a)] : Repr (ExtDTreeMap α β cmp) where
922933
reprPrec m prec := Repr.addAppParen ("Std.ExtDTreeMap.ofList " ++ repr m.toList) prec
923934

0 commit comments

Comments
 (0)