18 definition [code del]: "(f\<Colon>'a \<Rightarrow>f 'b) < g \<longleftrightarrow> f \<le> g \<and> \<not> f \<ge> g" |
18 definition [code del]: "(f\<Colon>'a \<Rightarrow>f 'b) < g \<longleftrightarrow> f \<le> g \<and> \<not> f \<ge> g" |
19 |
19 |
20 instance .. |
20 instance .. |
21 |
21 |
22 lemma le_finfun_code [code]: |
22 lemma le_finfun_code [code]: |
23 "f \<le> g \<longleftrightarrow> finfun_All ((\<lambda>(x, y). x \<le> y) \<circ>\<^isub>f (f, g)\<^sup>f)" |
23 "f \<le> g \<longleftrightarrow> finfun_All ((\<lambda>(x, y). x \<le> y) \<circ>$ (f, g)\<^sup>f)" |
24 by(simp add: le_finfun_def finfun_All_All o_def) |
24 by(simp add: le_finfun_def finfun_All_All o_def) |
25 |
25 |
26 end |
26 end |
27 |
27 |
28 instance "finfun" :: (type, preorder) preorder |
28 instance "finfun" :: (type, preorder) preorder |
46 |
46 |
47 lemma top_finfun_apply [simp]: "op $ top = (\<lambda>_. top)" |
47 lemma top_finfun_apply [simp]: "op $ top = (\<lambda>_. top)" |
48 by(auto simp add: top_finfun_def) |
48 by(auto simp add: top_finfun_def) |
49 |
49 |
50 instantiation "finfun" :: (type, inf) inf begin |
50 instantiation "finfun" :: (type, inf) inf begin |
51 definition [code]: "inf f g = (\<lambda>(x, y). inf x y) \<circ>\<^isub>f (f, g)\<^sup>f" |
51 definition [code]: "inf f g = (\<lambda>(x, y). inf x y) \<circ>$ (f, g)\<^sup>f" |
52 instance .. |
52 instance .. |
53 end |
53 end |
54 |
54 |
55 lemma inf_finfun_apply [simp]: "op $ (inf f g) = inf (op $ f) (op $ g)" |
55 lemma inf_finfun_apply [simp]: "op $ (inf f g) = inf (op $ f) (op $ g)" |
56 by(auto simp add: inf_finfun_def o_def inf_fun_def) |
56 by(auto simp add: inf_finfun_def o_def inf_fun_def) |
57 |
57 |
58 instantiation "finfun" :: (type, sup) sup begin |
58 instantiation "finfun" :: (type, sup) sup begin |
59 definition [code]: "sup f g = (\<lambda>(x, y). sup x y) \<circ>\<^isub>f (f, g)\<^sup>f" |
59 definition [code]: "sup f g = (\<lambda>(x, y). sup x y) \<circ>$ (f, g)\<^sup>f" |
60 instance .. |
60 instance .. |
61 end |
61 end |
62 |
62 |
63 lemma sup_finfun_apply [simp]: "op $ (sup f g) = sup (op $ f) (op $ g)" |
63 lemma sup_finfun_apply [simp]: "op $ (sup f g) = sup (op $ f) (op $ g)" |
64 by(auto simp add: sup_finfun_def o_def sup_fun_def) |
64 by(auto simp add: sup_finfun_def o_def sup_fun_def) |
76 |
76 |
77 instance "finfun" :: (type, distrib_lattice) distrib_lattice |
77 instance "finfun" :: (type, distrib_lattice) distrib_lattice |
78 by(intro_classes)(simp add: sup_finfun_def inf_finfun_def expand_finfun_eq o_def sup_inf_distrib1) |
78 by(intro_classes)(simp add: sup_finfun_def inf_finfun_def expand_finfun_eq o_def sup_inf_distrib1) |
79 |
79 |
80 instantiation "finfun" :: (type, minus) minus begin |
80 instantiation "finfun" :: (type, minus) minus begin |
81 definition "f - g = split (op -) \<circ>\<^isub>f (f, g)\<^sup>f" |
81 definition "f - g = split (op -) \<circ>$ (f, g)\<^sup>f" |
82 instance .. |
82 instance .. |
83 end |
83 end |
84 |
84 |
85 lemma minus_finfun_apply [simp]: "op $ (f - g) = op $ f - op $ g" |
85 lemma minus_finfun_apply [simp]: "op $ (f - g) = op $ f - op $ g" |
86 by(simp add: minus_finfun_def o_def fun_diff_def) |
86 by(simp add: minus_finfun_def o_def fun_diff_def) |
87 |
87 |
88 instantiation "finfun" :: (type, uminus) uminus begin |
88 instantiation "finfun" :: (type, uminus) uminus begin |
89 definition "- A = uminus \<circ>\<^isub>f A" |
89 definition "- A = uminus \<circ>$ A" |
90 instance .. |
90 instance .. |
91 end |
91 end |
92 |
92 |
93 lemma uminus_finfun_apply [simp]: "op $ (- g) = - op $ g" |
93 lemma uminus_finfun_apply [simp]: "op $ (- g) = - op $ g" |
94 by(simp add: uminus_finfun_def o_def fun_Compl_def) |
94 by(simp add: uminus_finfun_def o_def fun_Compl_def) |
248 |
248 |
249 lemma iso_finfun_Bex_Bex: |
249 lemma iso_finfun_Bex_Bex: |
250 "(\<exists>x. A $ x \<and> P x) \<longleftrightarrow> finfun_Bex A P" |
250 "(\<exists>x. A $ x \<and> P x) \<longleftrightarrow> finfun_Bex A P" |
251 by(simp add: finfun_Bex_def) |
251 by(simp add: finfun_Bex_def) |
252 |
252 |
253 text {* Test replacement setup *} |
253 text {* Test code setup *} |
254 |
254 |
255 notepad begin |
255 notepad begin |
256 have "inf ((\<lambda>_ :: nat. False)(1 := True, 2 := True)) ((\<lambda>_. True)(3 := False)) \<le> |
256 have "inf ((\<lambda>_ :: nat. False)(1 := True, 2 := True)) ((\<lambda>_. True)(3 := False)) \<le> |
257 sup ((\<lambda>_. False)(1 := True, 5 := True)) (- ((\<lambda>_. True)(2 := False, 3 := False)))" |
257 sup ((\<lambda>_. False)(1 := True, 5 := True)) (- ((\<lambda>_. True)(2 := False, 3 := False)))" |
258 by eval |
258 by eval |