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 |