Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit 20fca1c

Browse files
ChrisHughes24johoelzl
authored andcommitted
feat(data/finset): disjoint finsets
1 parent 844c665 commit 20fca1c

File tree

2 files changed

+60
-5
lines changed

2 files changed

+60
-5
lines changed

data/finset.lean

Lines changed: 57 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@ Author: Leonardo de Moura, Jeremy Avigad, Minchao Wu, Mario Carneiro
55
66
Finite sets.
77
-/
8-
import data.multiset order.boolean_algebra algebra.order_functions
9-
data.sigma.basic logic.embedding
8+
import logic.embedding order.boolean_algebra algebra.order_functions
9+
data.multiset data.sigma.basic data.set.lattice
10+
1011
open multiset subtype nat lattice
1112

1213
variables {α : Type*} {β : Type*} {γ : Type*}
@@ -341,9 +342,6 @@ by simp [subset_iff] {contextual:=tt}; finish
341342

342343
@[simp] theorem empty_inter (s : finset α) : ∅ ∩ s = ∅ := ext.2 $ by simp
343344

344-
theorem inter_eq_empty_iff_disjoint {s₁ s₂ : finset α} : s₁ ∩ s₂ = ∅ ↔ s₁.1.disjoint s₂.1 :=
345-
by rw ← val_eq_zero; simp [inter_eq_zero_iff_disjoint]
346-
347345
@[simp] theorem insert_inter_of_mem {s₁ s₂ : finset α} {a : α} (h : a ∈ s₂) :
348346
insert a s₁ ∩ s₂ = insert a (s₁ ∩ s₂) :=
349347
ext.2 $ by simp; intro x; constructor; finish
@@ -1272,8 +1270,62 @@ sort_eq _ _
12721270

12731271
@[simp] theorem sort_to_finset [decidable_eq α] (s : finset α) : (sort r s).to_finset = s :=
12741272
list.to_finset_eq (sort_nodup r s) ▸ eq_of_veq (sort_eq r s)
1273+
12751274
end sort
12761275

1276+
section disjoint
1277+
variable [decidable_eq α]
1278+
1279+
theorem disjoint_iff_inter_eq_empty {s t : finset α} : disjoint s t ↔ s ∩ t = ∅ :=
1280+
iff.rfl
1281+
1282+
theorem disjoint_left {s t : finset α} : disjoint s t ↔ ∀ {a}, a ∈ s → a ∉ t :=
1283+
by simp [disjoint_iff_inter_eq_empty, ext, mem_inter]
1284+
1285+
theorem disjoint_right {s t : finset α} : disjoint s t ↔ ∀ {a}, a ∈ t → a ∉ s :=
1286+
by rw [_root_.disjoint_comm, disjoint_left]
1287+
1288+
theorem disjoint_iff_ne {s t : finset α} : disjoint s t ↔ ∀ a ∈ s, ∀ b ∈ t, a ≠ b :=
1289+
by simp [disjoint_left, imp_not_comm]
1290+
1291+
theorem disjoint_of_subset_left {s t u : finset α} (h : s ⊆ u) (d : disjoint u t) : disjoint s t :=
1292+
disjoint_left.2 (λ x m₁, (disjoint_left.1 d) (h m₁))
1293+
1294+
theorem disjoint_of_subset_right {s t u : finset α} (h : t ⊆ u) (d : disjoint s u) : disjoint s t :=
1295+
disjoint_right.2 (λ x m₁, (disjoint_right.1 d) (h m₁))
1296+
1297+
@[simp] theorem disjoint_empty_left (s : finset α) : disjoint ∅ s := bot_inf_eq
1298+
1299+
@[simp] theorem disjoint_empty_right (s : finset α) : disjoint s ∅ := inf_bot_eq
1300+
1301+
@[simp] theorem singleton_disjoint {s : finset α} {a : α} : disjoint (singleton a) s ↔ a ∉ s :=
1302+
by simp [disjoint_left]; refl
1303+
1304+
@[simp] theorem disjoint_singleton {s : finset α} {a : α} : disjoint s (singleton a) ↔ a ∉ s :=
1305+
by rw _root_.disjoint_comm; simp
1306+
1307+
@[simp] theorem disjoint_insert_left {a : α} {s t : finset α} :
1308+
disjoint (insert a s) t ↔ a ∉ t ∧ disjoint s t :=
1309+
by simp [disjoint_left, or_imp_distrib, forall_and_distrib]; refl
1310+
1311+
@[simp] theorem disjoint_insert_right {a : α} {s t : finset α} :
1312+
disjoint s (insert a t) ↔ a ∉ s ∧ disjoint s t :=
1313+
_root_.disjoint_comm.trans $ by simp [disjoint_insert_left]
1314+
1315+
@[simp] theorem disjoint_union_left {s t u : finset α} :
1316+
disjoint (s ∪ t) u ↔ disjoint s u ∧ disjoint t u :=
1317+
by simp [disjoint_left, or_imp_distrib, forall_and_distrib]
1318+
1319+
@[simp] theorem disjoint_union_right {s t u : finset α} :
1320+
disjoint s (t ∪ u) ↔ disjoint s t ∧ disjoint s u :=
1321+
by simp [disjoint_right, or_imp_distrib, forall_and_distrib]
1322+
1323+
@[simp] theorem card_disjoint_union {s t : finset α} :
1324+
disjoint s t → card (s ∪ t) = card s + card t :=
1325+
finset.induction_on s (by simp) $ by simp {contextual := tt}
1326+
1327+
end disjoint
1328+
12771329
theorem sort_sorted_lt [decidable_linear_order α] (s : finset α) :
12781330
list.sorted (<) (sort (≤) s) :=
12791331
(sort_sorted _ _).imp₂ (@lt_of_le_of_ne _ _) (sort_nodup _ _)

data/set/lattice.lean

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -512,6 +512,9 @@ def disjoint (a b : α) : Prop := a ⊓ b = ⊥
512512
theorem disjoint_symm {a b : α} : disjoint a b → disjoint b a :=
513513
assume : a ⊓ b = ⊥, show b ⊓ a = ⊥, from this ▸ inf_comm
514514

515+
@[simp] lemma disjoint_comm {a b : α} : disjoint a b ↔ disjoint b a :=
516+
⟨disjoint_symm, disjoint_symm⟩
517+
515518
theorem disjoint_bot_left {a : α} : disjoint ⊥ a := bot_inf_eq
516519
theorem disjoint_bot_right {a : α} : disjoint a ⊥ := inf_bot_eq
517520

0 commit comments

Comments
 (0)