src/HOL/Library/Saturated.thy
changeset 82246 3505a7b02fc2
parent 73793 26c0ccf17f31
equal deleted inserted replaced
82245:fba16c509af0 82246:3505a7b02fc2
   127   show "(a + b) * c = a * c + b * c"
   127   show "(a + b) * c = a * c + b * c"
   128   proof(cases "c = 0")
   128   proof(cases "c = 0")
   129     case True thus ?thesis by (simp add: sat_eq_iff)
   129     case True thus ?thesis by (simp add: sat_eq_iff)
   130   next
   130   next
   131     case False thus ?thesis
   131     case False thus ?thesis
   132       by (simp add: sat_eq_iff nat_mult_min_left add_mult_distrib min_add_distrib_left min_add_distrib_right min.assoc min.absorb2)
   132       by (simp add: sat_eq_iff nat_mult_min_left add_mult_distrib min_add_distrib_left min_add_distrib_right min.assoc)
   133   qed
   133   qed
   134 qed (simp_all add: sat_eq_iff mult.commute)
   134 qed (simp_all add: sat_eq_iff mult.commute)
   135 
   135 
   136 end
   136 end
   137 
   137 
   249     by (auto simp: top_sat_def)
   249     by (auto simp: top_sat_def)
   250   show "Sup {} = (bot::'a sat)"
   250   show "Sup {} = (bot::'a sat)"
   251     by (auto simp: bot_sat_def)
   251     by (auto simp: bot_sat_def)
   252 qed
   252 qed
   253 
   253 
   254 end
   254 
       
   255 subsection \<open>Enumeration\<close>
       
   256 
       
   257 lemma inj_on_sat_of_nat:
       
   258   shows "inj_on (of_nat :: nat \<Rightarrow> 'a::len sat) {0..<LENGTH('a)}"
       
   259 by (rule inj_onI) (simp add: sat_eq_iff)
       
   260 
       
   261 lemma UNIV_sat_eq_of_nat:
       
   262   shows "(UNIV :: 'a::len sat set) = of_nat ` {0..LENGTH('a)}" (is "?lhs = ?rhs")
       
   263 proof -
       
   264   have "x \<in> ?rhs" for x :: "'a sat"
       
   265     by (simp add: image_eqI[where x="nat_of x"] sat_eq_iff)
       
   266   then show ?thesis
       
   267     by blast
       
   268 qed
       
   269 
       
   270 instantiation sat :: (len) enum
       
   271 begin
       
   272 
       
   273 definition enum_sat :: "'a sat list" where
       
   274   "enum_sat = map of_nat [0..<Suc(LENGTH('a))]"
       
   275 
       
   276 definition enum_all_sat :: "('a sat \<Rightarrow> bool) \<Rightarrow> bool" where
       
   277   "enum_all_sat = All"
       
   278 
       
   279 definition enum_ex_sat :: "('a sat \<Rightarrow> bool) \<Rightarrow> bool" where
       
   280   "enum_ex_sat = Ex"
       
   281 
       
   282 instance
       
   283 proof intro_classes
       
   284   show "UNIV = set (enum_class.enum :: 'a sat list)"
       
   285     by (simp only: enum_sat_def UNIV_sat_eq_of_nat set_map flip: atLeastAtMost_upt)
       
   286   show "distinct (enum_class.enum :: 'a sat list)"
       
   287     by (clarsimp simp: enum_sat_def distinct_map inj_on_sat_of_nat sat_eq_iff)
       
   288 qed (simp_all add: enum_all_sat_def enum_ex_sat_def)
       
   289 
       
   290 end
       
   291 
       
   292 lemma enum_sat_code [code]:
       
   293   fixes P :: "'a::len sat \<Rightarrow> bool"
       
   294   shows "Enum.enum_all P \<longleftrightarrow> list_all P Enum.enum"
       
   295     and "Enum.enum_ex P \<longleftrightarrow> list_ex P Enum.enum"
       
   296 by (simp_all add: enum_all_sat_def enum_ex_sat_def enum_UNIV list_all_iff list_ex_iff)
       
   297 
       
   298 end