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

Commit 57bbd9e

Browse files
committed
chore(order/symm_diff): Generalize to co-Heyting algebras (#16282)
Generalize the `symm_diff` material from `(generalized_)boolean_algebra` to `(generalized_)coheyting_algebra`.
1 parent f7e477f commit 57bbd9e

File tree

5 files changed

+135
-71
lines changed

5 files changed

+135
-71
lines changed

src/data/dfinsupp/interval.lean

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,10 @@ def range_Icc (f g : Π₀ i, α i) : Π₀ i, finset (α i) :=
9292
{ to_fun := λ i, Icc (f i) (g i),
9393
support' := f.support'.bind $ λ fs, g.support'.map $ λ gs,
9494
⟨fs + gs, λ i, or_iff_not_imp_left.2 $ λ h, begin
95-
have hf : f i = 0 :=
96-
(fs.prop i).resolve_left (multiset.not_mem_mono (multiset.le_add_right _ _).subset h),
97-
have hg : g i = 0 :=
98-
(gs.prop i).resolve_left (multiset.not_mem_mono (multiset.le_add_left _ _).subset h),
95+
have hf : f i = 0 := (fs.prop i).resolve_left
96+
(multiset.not_mem_mono (multiset.le.subset $ multiset.le_add_right _ _) h),
97+
have hg : g i = 0 := (gs.prop i).resolve_left
98+
(multiset.not_mem_mono (multiset.le.subset $ multiset.le_add_left _ _) h),
9999
rw [hf, hg],
100100
exact Icc_self _,
101101
end⟩ }

src/data/finset/basic.lean

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1339,6 +1339,13 @@ sup_eq_sdiff_sup_sdiff_sup_inf
13391339
lemma erase_eq_empty_iff (s : finset α) (a : α) : s.erase a = ∅ ↔ s = ∅ ∨ s = {a} :=
13401340
by rw [←sdiff_singleton_eq_erase, sdiff_eq_empty_iff_subset, subset_singleton_iff]
13411341

1342+
/-! ### Symmetric difference -/
1343+
1344+
lemma mem_symm_diff : a ∈ s ∆ t ↔ a ∈ s ∧ a ∉ t ∨ a ∈ t ∧ a ∉ s :=
1345+
by simp_rw [symm_diff, sup_eq_union, mem_union, mem_sdiff]
1346+
1347+
@[simp, norm_cast] lemma coe_symm_diff : (↑(s ∆ t) : set α) = s ∆ t := set.ext $ λ _, mem_symm_diff
1348+
13421349
end decidable_eq
13431350

13441351
/-! ### attach -/

src/data/set/basic.lean

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ Copyright (c) 2014 Jeremy Avigad. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Jeremy Avigad, Leonardo de Moura
55
-/
6-
import order.boolean_algebra
6+
import order.symm_diff
77

88
/-!
99
# Basic properties of sets
@@ -77,7 +77,7 @@ universes u v w x
7777

7878
namespace set
7979

80-
variable {α : Type*}
80+
variables {α : Type*} {s t : set α}
8181

8282
instance : has_le (set α) := ⟨λ s t, ∀ ⦃x⦄, x ∈ s → x ∈ t⟩
8383
instance : has_subset (set α) := ⟨(≤)⟩
@@ -104,6 +104,12 @@ instance : has_inter (set α) := ⟨(⊓)⟩
104104
@[simp] lemma le_eq_subset : ((≤) : set α → set α → Prop) = (⊆) := rfl
105105
@[simp] lemma lt_eq_ssubset : ((<) : set α → set α → Prop) = (⊂) := rfl
106106

107+
lemma le_iff_subset : s ≤ t ↔ s ⊆ t := iff.rfl
108+
lemma lt_iff_ssubset : s ≤ t ↔ s ⊆ t := iff.rfl
109+
110+
alias le_iff_subset ↔ _root_.has_le.le.subset _root_.has_subset.subset.le
111+
alias lt_iff_ssubset ↔ _root_.has_lt.lt.ssubset _root_.has_ssubset.ssubset.lt
112+
107113
/-- Coercion from a set to the corresponding subtype. -/
108114
instance {α : Type u} : has_coe_to_sort (set α) (Type u) := ⟨λ s, {x // x ∈ s}⟩
109115

@@ -1178,6 +1184,18 @@ lemma union_eq_diff_union_diff_union_inter (s t : set α) :
11781184
s ∪ t = (s \ t) ∪ (t \ s) ∪ (s ∩ t) :=
11791185
sup_eq_sdiff_sup_sdiff_sup_inf
11801186

1187+
/-! ### Symmetric difference -/
1188+
1189+
lemma mem_symm_diff : a ∈ s ∆ t ↔ a ∈ s ∧ a ∉ t ∨ a ∈ t ∧ a ∉ s := iff.rfl
1190+
1191+
lemma symm_diff_subset_union : s ∆ t ⊆ s ∪ t := @symm_diff_le_sup (set α) _ _ _
1192+
1193+
lemma inter_symm_diff_distrib_left (s t u : set α) : s ∩ t ∆ u = (s ∩ t) ∆ (s ∩ u) :=
1194+
inf_symm_diff_distrib_left _ _ _
1195+
1196+
lemma inter_symm_diff_distrib_right (s t u : set α) : s ∆ t ∩ u = (s ∩ u) ∆ (t ∩ u) :=
1197+
inf_symm_diff_distrib_right _ _ _
1198+
11811199
/-! ### Powerset -/
11821200

11831201
/-- `𝒫 s = set.powerset s` is the set of all subsets of `s`. -/

src/measure_theory/decomposition/jordan.lean

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ end jordan_decomposition
169169

170170
namespace signed_measure
171171

172-
open measure vector_measure jordan_decomposition classical
172+
open classical jordan_decomposition measure set vector_measure
173173

174174
variables {s : signed_measure α} {μ ν : measure α} [is_finite_measure μ] [is_finite_measure ν]
175175

@@ -293,12 +293,9 @@ lemma of_inter_eq_of_symm_diff_eq_zero_positive
293293
begin
294294
have hwuv : s ((w ∩ u) ∆ (w ∩ v)) = 0,
295295
{ refine subset_positive_null_set (hu.union hv) ((hw.inter hu).symm_diff (hw.inter hv))
296-
(hu.symm_diff hv) (restrict_le_restrict_union _ _ hu hsu hv hsv) hs _ _,
297-
{ exact symm_diff_le_sup u v },
298-
{ rintro x (⟨⟨hxw, hxu⟩, hx⟩ | ⟨⟨hxw, hxv⟩, hx⟩);
299-
rw [set.mem_inter_eq, not_and] at hx,
300-
{ exact or.inl ⟨hxu, hx hxw⟩ },
301-
{ exact or.inr ⟨hxv, hx hxw⟩ } } },
296+
(hu.symm_diff hv) (restrict_le_restrict_union _ _ hu hsu hv hsv) hs symm_diff_subset_union _,
297+
rw ←inter_symm_diff_distrib_left,
298+
exact inter_subset_right _ _ },
302299
obtain ⟨huv, hvu⟩ := of_diff_eq_zero_of_symm_diff_eq_zero_positive
303300
(hw.inter hu) (hw.inter hv)
304301
(restrict_le_restrict_subset _ _ hu hsu (w.inter_subset_right u))

src/order/symm_diff.lean

Lines changed: 100 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -44,23 +44,23 @@ boolean ring, generalized boolean algebra, boolean algebra, symmetric difference
4444

4545
open function
4646

47+
variables {α : Type*}
48+
4749
/-- The symmetric difference operator on a type with `⊔` and `\` is `(A \ B) ⊔ (B \ A)`. -/
48-
def symm_diff {α : Type*} [has_sup α] [has_sdiff α] (A B : α) : α := (A \ B)(B \ A)
50+
def symm_diff [has_sup α] [has_sdiff α] (a b : α) : α := a \ bb \ a
4951

5052
/- This notation might conflict with the Laplacian once we have it. Feel free to put it in locale
5153
`order` or `symm_diff` if that happens. -/
5254
infix ` ∆ `:100 := symm_diff
5355

54-
lemma symm_diff_def {α : Type*} [has_sup α] [has_sdiff α] (A B : α) :
55-
A ∆ B = (A \ B) ⊔ (B \ A) :=
56-
rfl
56+
lemma symm_diff_def [has_sup α] [has_sdiff α] (a b : α) : a ∆ b = (a \ b) ⊔ (b \ a) := rfl
5757

5858
lemma symm_diff_eq_xor (p q : Prop) : p ∆ q = xor p q := rfl
5959

6060
@[simp] lemma bool.symm_diff_eq_bxor : ∀ p q : bool, p ∆ q = bxor p q := dec_trivial
6161

62-
section generalized_boolean_algebra
63-
variables {α : Type*} [generalized_boolean_algebra α] (a b c d : α)
62+
section generalized_coheyting_algebra
63+
variables [generalized_coheyting_algebra α] (a b c d : α)
6464

6565
lemma symm_diff_comm : a ∆ b = b ∆ a := by simp only [(∆), sup_comm]
6666

@@ -70,8 +70,86 @@ instance symm_diff_is_comm : is_commutative α (∆) := ⟨symm_diff_comm⟩
7070
@[simp] lemma symm_diff_bot : a ∆ ⊥ = a := by rw [(∆), sdiff_bot, bot_sdiff, sup_bot_eq]
7171
@[simp] lemma bot_symm_diff : ⊥ ∆ a = a := by rw [symm_diff_comm, symm_diff_bot]
7272

73-
lemma symm_diff_eq_sup_sdiff_inf : a ∆ b = (a ⊔ b) \ (a ⊓ b) :=
74-
by simp [sup_sdiff, sdiff_inf, sup_comm, (∆)]
73+
lemma symm_diff_of_le {a b : α} (h : a ≤ b) : a ∆ b = b \ a :=
74+
by rw [symm_diff, sdiff_eq_bot_iff.2 h, bot_sup_eq]
75+
76+
lemma symm_diff_of_ge {a b : α} (h : b ≤ a) : a ∆ b = a \ b :=
77+
by rw [symm_diff, sdiff_eq_bot_iff.2 h, sup_bot_eq]
78+
79+
lemma symm_diff_le {a b c : α} (ha : a ≤ b ⊔ c) (hb : b ≤ a ⊔ c) : a ∆ b ≤ c :=
80+
sup_le (sdiff_le_iff.2 ha) $ sdiff_le_iff.2 hb
81+
82+
lemma symm_diff_le_iff {a b c : α} : a ∆ b ≤ c ↔ a ≤ b ⊔ c ∧ b ≤ a ⊔ c :=
83+
by simp_rw [symm_diff, sup_le_iff, sdiff_le_iff]
84+
85+
@[simp] lemma symm_diff_le_sup {a b : α} : a ∆ b ≤ a ⊔ b := sup_le_sup sdiff_le sdiff_le
86+
87+
lemma symm_diff_eq_sup_sdiff_inf : a ∆ b = (a ⊔ b) \ (a ⊓ b) := by simp [sup_sdiff, symm_diff]
88+
89+
lemma disjoint.symm_diff_eq_sup {a b : α} (h : disjoint a b) : a ∆ b = a ⊔ b :=
90+
by rw [(∆), h.sdiff_eq_left, h.sdiff_eq_right]
91+
92+
lemma symm_diff_sdiff : (a ∆ b) \ c = a \ (b ⊔ c) ⊔ b \ (a ⊔ c) :=
93+
by rw [symm_diff, sup_sdiff_distrib, sdiff_sdiff_left, sdiff_sdiff_left]
94+
95+
@[simp] lemma symm_diff_sdiff_inf : a ∆ b \ (a ⊓ b) = a ∆ b :=
96+
by { rw symm_diff_sdiff, simp [symm_diff] }
97+
98+
@[simp] lemma symm_diff_sdiff_eq_sup : a ∆ (b \ a) = a ⊔ b :=
99+
begin
100+
rw [symm_diff, sdiff_idem],
101+
exact le_antisymm (sup_le_sup sdiff_le sdiff_le)
102+
(sup_le le_sdiff_sup $ le_sdiff_sup.trans $ sup_le le_sup_right le_sdiff_sup),
103+
end
104+
105+
@[simp] lemma sdiff_symm_diff_eq_sup : (a \ b) ∆ b = a ⊔ b :=
106+
by rw [symm_diff_comm, symm_diff_sdiff_eq_sup, sup_comm]
107+
108+
@[simp] lemma symm_diff_sup_inf : a ∆ b ⊔ a ⊓ b = a ⊔ b :=
109+
begin
110+
refine le_antisymm (sup_le symm_diff_le_sup inf_le_sup) _,
111+
rw [sup_inf_left, symm_diff],
112+
refine sup_le (le_inf le_sup_right _) (le_inf _ le_sup_right),
113+
{ rw sup_right_comm,
114+
exact le_sup_of_le_left le_sdiff_sup },
115+
{ rw sup_assoc,
116+
exact le_sup_of_le_right le_sdiff_sup }
117+
end
118+
119+
@[simp] lemma inf_sup_symm_diff : a ⊓ b ⊔ a ∆ b = a ⊔ b := by rw [sup_comm, symm_diff_sup_inf]
120+
121+
@[simp] lemma symm_diff_symm_diff_inf : a ∆ b ∆ (a ⊓ b) = a ⊔ b :=
122+
by rw [←symm_diff_sdiff_inf a, sdiff_symm_diff_eq_sup, symm_diff_sup_inf]
123+
124+
@[simp] lemma inf_symm_diff_symm_diff : (a ⊓ b) ∆ (a ∆ b) = a ⊔ b :=
125+
by rw [symm_diff_comm, symm_diff_symm_diff_inf]
126+
127+
lemma symm_diff_triangle : a ∆ c ≤ a ∆ b ⊔ b ∆ c :=
128+
begin
129+
refine (sup_le_sup (sdiff_triangle a b c) $ sdiff_triangle _ b _).trans_eq _,
130+
rw [@sup_comm _ _ (c \ b), sup_sup_sup_comm, symm_diff, symm_diff],
131+
end
132+
133+
end generalized_coheyting_algebra
134+
135+
section coheyting_algebra
136+
variables [coheyting_algebra α] (a : α)
137+
138+
@[simp] lemma symm_diff_top' : a ∆ ⊤ = ¬a := by simp [symm_diff]
139+
@[simp] lemma top_symm_diff' : ⊤ ∆ a = ¬a := by simp [symm_diff]
140+
141+
@[simp] lemma hnot_symm_diff_self : (¬a) ∆ a = ⊤ :=
142+
by { rw [eq_top_iff, symm_diff, hnot_sdiff, sup_sdiff_self], exact codisjoint_hnot_left }
143+
144+
@[simp] lemma symm_diff_hnot_self : a ∆ ¬a = ⊤ := by rw [symm_diff_comm, hnot_symm_diff_self]
145+
146+
lemma is_compl.symm_diff_eq_top {a b : α} (h : is_compl a b) : a ∆ b = ⊤ :=
147+
by rw [h.eq_hnot, hnot_symm_diff_self]
148+
149+
end coheyting_algebra
150+
151+
section generalized_boolean_algebra
152+
variables [generalized_boolean_algebra α] (a b c d : α)
75153

76154
@[simp] lemma sup_sdiff_symm_diff : (a ⊔ b) \ (a ∆ b) = a ⊓ b :=
77155
sdiff_eq_symm inf_le_sup (by rw symm_diff_eq_sup_sdiff_inf)
@@ -82,8 +160,6 @@ begin
82160
exact disjoint_sdiff_self_left,
83161
end
84162

85-
lemma symm_diff_le_sup : a ∆ b ≤ a ⊔ b := by { rw symm_diff_eq_sup_sdiff_inf, exact sdiff_le }
86-
87163
lemma inf_symm_diff_distrib_left : a ⊓ (b ∆ c) = (a ⊓ b) ∆ (a ⊓ c) :=
88164
by rw [symm_diff_eq_sup_sdiff_inf, inf_sdiff_distrib_left, inf_sup_left, inf_inf_distrib_left,
89165
symm_diff_eq_sup_sdiff_inf]
@@ -97,9 +173,6 @@ by simp only [(∆), sdiff_sdiff_sup_sdiff']
97173
lemma sdiff_symm_diff' : c \ (a ∆ b) = (c ⊓ a ⊓ b) ⊔ (c \ (a ⊔ b)) :=
98174
by rw [sdiff_symm_diff, sdiff_sup, sup_comm]
99175

100-
lemma symm_diff_sdiff : (a ∆ b) \ c = (a \ (b ⊔ c)) ⊔ (b \ (a ⊔ c)) :=
101-
by rw [symm_diff_def, sup_sdiff, sdiff_sdiff_left, sdiff_sdiff_left]
102-
103176
@[simp] lemma symm_diff_sdiff_left : (a ∆ b) \ a = b \ a :=
104177
by rw [symm_diff_def, sup_sdiff, sdiff_idem, sdiff_sdiff_self, bot_sup_eq]
105178

@@ -108,31 +181,11 @@ by rw [symm_diff_comm, symm_diff_sdiff_left]
108181

109182
@[simp] lemma sdiff_symm_diff_self : a \ (a ∆ b) = a ⊓ b := by simp [sdiff_symm_diff]
110183

111-
lemma symm_diff_eq_iff_sdiff_eq {a b c : α} (ha : a ≤ c) :
112-
a ∆ b = c ↔ c \ a = b :=
113-
begin
114-
split; intro h,
115-
{ have hba : disjoint (a ⊓ b) c := begin
116-
rw [←h, disjoint.comm],
117-
exact disjoint_symm_diff_inf _ _,
118-
end,
119-
have hca : _ := congr_arg (\ a) h,
120-
rw [symm_diff_sdiff_left] at hca,
121-
rw [←hca, sdiff_eq_self_iff_disjoint],
122-
exact hba.of_disjoint_inf_of_le ha },
123-
{ have hd : disjoint a b := by { rw ←h, exact disjoint_sdiff_self_right },
124-
rw [symm_diff_def, hd.sdiff_eq_left, hd.sdiff_eq_right, ←h, sup_sdiff_cancel_right ha] }
125-
end
126-
127-
lemma disjoint.symm_diff_eq_sup {a b : α} (h : disjoint a b) : a ∆ b = a ⊔ b :=
128-
by rw [(∆), h.sdiff_eq_left, h.sdiff_eq_right]
129-
130184
lemma symm_diff_eq_sup : a ∆ b = a ⊔ b ↔ disjoint a b :=
131185
begin
132-
split; intro h,
133-
{ rw [symm_diff_eq_sup_sdiff_inf, sdiff_eq_self_iff_disjoint] at h,
134-
exact h.of_disjoint_inf_of_le le_sup_left, },
135-
{ exact h.symm_diff_eq_sup, },
186+
refine ⟨λ h, _, disjoint.symm_diff_eq_sup⟩,
187+
rw [symm_diff_eq_sup_sdiff_inf, sdiff_eq_self_iff_disjoint] at h,
188+
exact h.of_disjoint_inf_of_le le_sup_left,
136189
end
137190

138191
@[simp] lemma le_symm_diff_iff_left : a ≤ a ∆ b ↔ disjoint a b :=
@@ -163,19 +216,6 @@ calc a ∆ (b ∆ c) = (a \ (b ∆ c)) ⊔ ((b ∆ c) \ a) : symm_diff_def _ _
163216
... = (a \ (b ⊔ c)) ⊔ (b \ (a ⊔ c)) ⊔
164217
(c \ (a ⊔ b)) ⊔ (a ⊓ b ⊓ c) : by ac_refl
165218

166-
@[simp] lemma symm_diff_symm_diff_inf : a ∆ b ∆ (a ⊓ b) = a ⊔ b :=
167-
by rw [symm_diff_eq_iff_sdiff_eq (symm_diff_le_sup _ _), sup_sdiff_symm_diff]
168-
169-
@[simp] lemma inf_symm_diff_symm_diff : (a ⊓ b) ∆ (a ∆ b) = a ⊔ b :=
170-
by rw [symm_diff_comm, symm_diff_symm_diff_inf]
171-
172-
lemma symm_diff_triangle : a ∆ c ≤ a ∆ b ⊔ b ∆ c :=
173-
begin
174-
refine (sup_le_sup (sdiff_triangle a b c) $ sdiff_triangle _ b _).trans_eq _,
175-
rw [@sup_comm _ _ (c \ b), sup_sup_sup_comm],
176-
refl,
177-
end
178-
179219
lemma symm_diff_assoc : a ∆ b ∆ c = a ∆ (b ∆ c) :=
180220
by rw [symm_diff_symm_diff_left, symm_diff_symm_diff_right]
181221

@@ -228,28 +268,30 @@ protected lemma disjoint.symm_diff_right (ha : disjoint a b) (hb : disjoint a c)
228268
disjoint a (b ∆ c) :=
229269
(ha.symm.symm_diff_left hb.symm).symm
230270

271+
lemma symm_diff_eq_iff_sdiff_eq (ha : a ≤ c) : a ∆ b = c ↔ c \ a = b :=
272+
begin
273+
rw ←symm_diff_of_le ha,
274+
exact ((symm_diff_right_involutive a).to_perm _).apply_eq_iff_eq_symm_apply.trans eq_comm,
275+
end
276+
231277
end generalized_boolean_algebra
232278

233279
section boolean_algebra
234-
variables {α : Type*} [boolean_algebra α] (a b c : α)
280+
variables [boolean_algebra α] (a b c : α)
235281

236282
lemma symm_diff_eq : a ∆ b = (a ⊓ bᶜ) ⊔ (b ⊓ aᶜ) := by simp only [(∆), sdiff_eq]
237283

238-
@[simp] lemma symm_diff_top : a ∆ ⊤ = aᶜ := by simp [symm_diff_eq]
239-
@[simp] lemma top_symm_diff : ⊤ ∆ a = aᶜ := by rw [symm_diff_comm, symm_diff_top]
284+
lemma symm_diff_top : a ∆ ⊤ = aᶜ := symm_diff_top' _
285+
lemma top_symm_diff : ⊤ ∆ a = aᶜ := top_symm_diff' _
240286

241287
lemma compl_symm_diff : (a ∆ b)ᶜ = (a ⊓ b) ⊔ (aᶜ ⊓ bᶜ) :=
242288
by simp only [←top_sdiff, sdiff_symm_diff, top_inf_eq]
243289

244290
lemma symm_diff_eq_top_iff : a ∆ b = ⊤ ↔ is_compl a b :=
245291
by rw [symm_diff_eq_iff_sdiff_eq le_top, top_sdiff, compl_eq_iff_is_compl]
246292

247-
lemma is_compl.symm_diff_eq_top (h : is_compl a b) : a ∆ b = ⊤ := (symm_diff_eq_top_iff a b).2 h
248-
249-
@[simp] lemma compl_symm_diff_self : aᶜ ∆ a = ⊤ :=
250-
by simp only [symm_diff_eq, compl_compl, inf_idem, compl_sup_eq_top]
251-
252-
@[simp] lemma symm_diff_compl_self : a ∆ aᶜ = ⊤ := by rw [symm_diff_comm, compl_symm_diff_self]
293+
@[simp] lemma compl_symm_diff_self : aᶜ ∆ a = ⊤ := hnot_symm_diff_self _
294+
@[simp] lemma symm_diff_compl_self : a ∆ aᶜ = ⊤ := symm_diff_hnot_self _
253295

254296
lemma symm_diff_symm_diff_right' :
255297
a ∆ (b ∆ c) = (a ⊓ b ⊓ c) ⊔ (a ⊓ bᶜ ⊓ cᶜ) ⊔ (aᶜ ⊓ b ⊓ cᶜ) ⊔ (aᶜ ⊓ bᶜ ⊓ c) :=

0 commit comments

Comments
 (0)