@@ -44,23 +44,23 @@ boolean ring, generalized boolean algebra, boolean algebra, symmetric difference
44
44
45
45
open function
46
46
47
+ variables {α : Type *}
48
+
47
49
/-- 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 \ b ⊔ b \ a
49
51
50
52
/- This notation might conflict with the Laplacian once we have it. Feel free to put it in locale
51
53
`order` or `symm_diff` if that happens. -/
52
54
infix ` ∆ `:100 := symm_diff
53
55
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
57
57
58
58
lemma symm_diff_eq_xor (p q : Prop ) : p ∆ q = xor p q := rfl
59
59
60
60
@[simp] lemma bool.symm_diff_eq_bxor : ∀ p q : bool, p ∆ q = bxor p q := dec_trivial
61
61
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 : α)
64
64
65
65
lemma symm_diff_comm : a ∆ b = b ∆ a := by simp only [(∆), sup_comm]
66
66
@@ -70,8 +70,86 @@ instance symm_diff_is_comm : is_commutative α (∆) := ⟨symm_diff_comm⟩
70
70
@[simp] lemma symm_diff_bot : a ∆ ⊥ = a := by rw [(∆), sdiff_bot, bot_sdiff, sup_bot_eq]
71
71
@[simp] lemma bot_symm_diff : ⊥ ∆ a = a := by rw [symm_diff_comm, symm_diff_bot]
72
72
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 : α)
75
153
76
154
@[simp] lemma sup_sdiff_symm_diff : (a ⊔ b) \ (a ∆ b) = a ⊓ b :=
77
155
sdiff_eq_symm inf_le_sup (by rw symm_diff_eq_sup_sdiff_inf)
82
160
exact disjoint_sdiff_self_left,
83
161
end
84
162
85
- lemma symm_diff_le_sup : a ∆ b ≤ a ⊔ b := by { rw symm_diff_eq_sup_sdiff_inf, exact sdiff_le }
86
-
87
163
lemma inf_symm_diff_distrib_left : a ⊓ (b ∆ c) = (a ⊓ b) ∆ (a ⊓ c) :=
88
164
by rw [symm_diff_eq_sup_sdiff_inf, inf_sdiff_distrib_left, inf_sup_left, inf_inf_distrib_left,
89
165
symm_diff_eq_sup_sdiff_inf]
@@ -97,9 +173,6 @@ by simp only [(∆), sdiff_sdiff_sup_sdiff']
97
173
lemma sdiff_symm_diff' : c \ (a ∆ b) = (c ⊓ a ⊓ b) ⊔ (c \ (a ⊔ b)) :=
98
174
by rw [sdiff_symm_diff, sdiff_sup, sup_comm]
99
175
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
-
103
176
@[simp] lemma symm_diff_sdiff_left : (a ∆ b) \ a = b \ a :=
104
177
by rw [symm_diff_def, sup_sdiff, sdiff_idem, sdiff_sdiff_self, bot_sup_eq]
105
178
@@ -108,31 +181,11 @@ by rw [symm_diff_comm, symm_diff_sdiff_left]
108
181
109
182
@[simp] lemma sdiff_symm_diff_self : a \ (a ∆ b) = a ⊓ b := by simp [sdiff_symm_diff]
110
183
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
-
130
184
lemma symm_diff_eq_sup : a ∆ b = a ⊔ b ↔ disjoint a b :=
131
185
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,
136
189
end
137
190
138
191
@[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 _ _
163
216
... = (a \ (b ⊔ c)) ⊔ (b \ (a ⊔ c)) ⊔
164
217
(c \ (a ⊔ b)) ⊔ (a ⊓ b ⊓ c) : by ac_refl
165
218
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
-
179
219
lemma symm_diff_assoc : a ∆ b ∆ c = a ∆ (b ∆ c) :=
180
220
by rw [symm_diff_symm_diff_left, symm_diff_symm_diff_right]
181
221
@@ -228,28 +268,30 @@ protected lemma disjoint.symm_diff_right (ha : disjoint a b) (hb : disjoint a c)
228
268
disjoint a (b ∆ c) :=
229
269
(ha.symm.symm_diff_left hb.symm).symm
230
270
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
+
231
277
end generalized_boolean_algebra
232
278
233
279
section boolean_algebra
234
- variables {α : Type *} [boolean_algebra α] (a b c : α)
280
+ variables [boolean_algebra α] (a b c : α)
235
281
236
282
lemma symm_diff_eq : a ∆ b = (a ⊓ bᶜ) ⊔ (b ⊓ aᶜ) := by simp only [(∆), sdiff_eq]
237
283
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' _
240
286
241
287
lemma compl_symm_diff : (a ∆ b)ᶜ = (a ⊓ b) ⊔ (aᶜ ⊓ bᶜ) :=
242
288
by simp only [←top_sdiff, sdiff_symm_diff, top_inf_eq]
243
289
244
290
lemma symm_diff_eq_top_iff : a ∆ b = ⊤ ↔ is_compl a b :=
245
291
by rw [symm_diff_eq_iff_sdiff_eq le_top, top_sdiff, compl_eq_iff_is_compl]
246
292
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 _
253
295
254
296
lemma symm_diff_symm_diff_right' :
255
297
a ∆ (b ∆ c) = (a ⊓ b ⊓ c) ⊔ (a ⊓ bᶜ ⊓ cᶜ) ⊔ (aᶜ ⊓ b ⊓ cᶜ) ⊔ (aᶜ ⊓ bᶜ ⊓ c) :=
0 commit comments