100 |
100 |
101 |
101 |
102 subsection \<open>Conjunction\<close> |
102 subsection \<open>Conjunction\<close> |
103 |
103 |
104 lemma conj_zero_right [simp]: "x \<^bold>\<sqinter> \<zero> = \<zero>" |
104 lemma conj_zero_right [simp]: "x \<^bold>\<sqinter> \<zero> = \<zero>" |
105 proof - |
105 using conj.left_idem conj_cancel_right by fastforce |
106 from conj_cancel_right have "x \<^bold>\<sqinter> \<zero> = x \<^bold>\<sqinter> (x \<^bold>\<sqinter> \<sim> x)" |
|
107 by simp |
|
108 also from conj_assoc have "\<dots> = (x \<^bold>\<sqinter> x) \<^bold>\<sqinter> \<sim> x" |
|
109 by (simp only: ac_simps) |
|
110 also from conj_absorb have "\<dots> = x \<^bold>\<sqinter> \<sim> x" |
|
111 by simp |
|
112 also have "\<dots> = \<zero>" |
|
113 by simp |
|
114 finally show ?thesis . |
|
115 qed |
|
116 |
106 |
117 lemma compl_one [simp]: "\<sim> \<one> = \<zero>" |
107 lemma compl_one [simp]: "\<sim> \<one> = \<zero>" |
118 by (rule compl_unique [OF conj_zero_right disj_zero_right]) |
108 by (rule compl_unique [OF conj_zero_right disj_zero_right]) |
119 |
109 |
120 lemma conj_zero_left [simp]: "\<zero> \<^bold>\<sqinter> x = \<zero>" |
110 lemma conj_zero_left [simp]: "\<zero> \<^bold>\<sqinter> x = \<zero>" |
239 lemmas xor_left_commute = xor.left_commute |
229 lemmas xor_left_commute = xor.left_commute |
240 |
230 |
241 lemmas xor_ac = xor.assoc xor.commute xor.left_commute |
231 lemmas xor_ac = xor.assoc xor.commute xor.left_commute |
242 |
232 |
243 lemma xor_def2: "x \<oplus> y = (x \<^bold>\<squnion> y) \<^bold>\<sqinter> (\<sim> x \<^bold>\<squnion> \<sim> y)" |
233 lemma xor_def2: "x \<oplus> y = (x \<^bold>\<squnion> y) \<^bold>\<sqinter> (\<sim> x \<^bold>\<squnion> \<sim> y)" |
244 by (simp only: xor_def conj_disj_distribs disj_ac conj_ac conj_cancel_right disj_zero_left) |
234 using conj.commute conj_disj_distrib2 disj.commute xor_def by auto |
245 |
235 |
246 lemma xor_zero_right [simp]: "x \<oplus> \<zero> = x" |
236 lemma xor_zero_right [simp]: "x \<oplus> \<zero> = x" |
247 by (simp only: xor_def compl_zero conj_one_right conj_zero_right disj_zero_right) |
237 by (simp only: xor_def compl_zero conj_one_right conj_zero_right disj_zero_right) |
248 |
238 |
249 lemma xor_zero_left [simp]: "\<zero> \<oplus> x = x" |
239 lemma xor_zero_left [simp]: "\<zero> \<oplus> x = x" |
260 |
250 |
261 lemma xor_left_self [simp]: "x \<oplus> (x \<oplus> y) = y" |
251 lemma xor_left_self [simp]: "x \<oplus> (x \<oplus> y) = y" |
262 by (simp only: xor_assoc [symmetric] xor_self xor_zero_left) |
252 by (simp only: xor_assoc [symmetric] xor_self xor_zero_left) |
263 |
253 |
264 lemma xor_compl_left [simp]: "\<sim> x \<oplus> y = \<sim> (x \<oplus> y)" |
254 lemma xor_compl_left [simp]: "\<sim> x \<oplus> y = \<sim> (x \<oplus> y)" |
265 apply (simp only: xor_def de_Morgan_disj de_Morgan_conj double_compl) |
255 by (metis xor_assoc xor_one_left) |
266 apply (simp only: conj_disj_distribs) |
|
267 apply (simp only: conj_cancel_right conj_cancel_left) |
|
268 apply (simp only: disj_zero_left disj_zero_right) |
|
269 apply (simp only: disj_ac conj_ac) |
|
270 done |
|
271 |
256 |
272 lemma xor_compl_right [simp]: "x \<oplus> \<sim> y = \<sim> (x \<oplus> y)" |
257 lemma xor_compl_right [simp]: "x \<oplus> \<sim> y = \<sim> (x \<oplus> y)" |
273 apply (simp only: xor_def de_Morgan_disj de_Morgan_conj double_compl) |
258 using xor_commute xor_compl_left by auto |
274 apply (simp only: conj_disj_distribs) |
|
275 apply (simp only: conj_cancel_right conj_cancel_left) |
|
276 apply (simp only: disj_zero_left disj_zero_right) |
|
277 apply (simp only: disj_ac conj_ac) |
|
278 done |
|
279 |
259 |
280 lemma xor_cancel_right: "x \<oplus> \<sim> x = \<one>" |
260 lemma xor_cancel_right: "x \<oplus> \<sim> x = \<one>" |
281 by (simp only: xor_compl_right xor_self compl_zero) |
261 by (simp only: xor_compl_right xor_self compl_zero) |
282 |
262 |
283 lemma xor_cancel_left: "\<sim> x \<oplus> x = \<one>" |
263 lemma xor_cancel_left: "\<sim> x \<oplus> x = \<one>" |
293 xor_def de_Morgan_disj de_Morgan_conj double_compl |
273 xor_def de_Morgan_disj de_Morgan_conj double_compl |
294 conj_disj_distribs conj_ac disj_ac) |
274 conj_disj_distribs conj_ac disj_ac) |
295 qed |
275 qed |
296 |
276 |
297 lemma conj_xor_distrib2: "(y \<oplus> z) \<^bold>\<sqinter> x = (y \<^bold>\<sqinter> x) \<oplus> (z \<^bold>\<sqinter> x)" |
277 lemma conj_xor_distrib2: "(y \<oplus> z) \<^bold>\<sqinter> x = (y \<^bold>\<sqinter> x) \<oplus> (z \<^bold>\<sqinter> x)" |
298 proof - |
278 by (simp add: conj.commute conj_xor_distrib) |
299 have "x \<^bold>\<sqinter> (y \<oplus> z) = (x \<^bold>\<sqinter> y) \<oplus> (x \<^bold>\<sqinter> z)" |
|
300 by (rule conj_xor_distrib) |
|
301 then show "(y \<oplus> z) \<^bold>\<sqinter> x = (y \<^bold>\<sqinter> x) \<oplus> (z \<^bold>\<sqinter> x)" |
|
302 by (simp only: conj_commute) |
|
303 qed |
|
304 |
279 |
305 lemmas conj_xor_distribs = conj_xor_distrib conj_xor_distrib2 |
280 lemmas conj_xor_distribs = conj_xor_distrib conj_xor_distrib2 |
306 |
281 |
307 end |
282 end |
308 |
283 |