src/HOL/Library/Boolean_Algebra.thy
changeset 70737 e4825ec20468
parent 70189 6d2effbbf8d4
child 71042 400e9512f1d3
equal deleted inserted replaced
70726:91587befabfd 70737:e4825ec20468
   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