equal
deleted
inserted
replaced
28 "foldl f s xs = fold (\<lambda>x s. f s x) xs s" |
28 "foldl f s xs = fold (\<lambda>x s. f s x) xs s" |
29 by (induct xs arbitrary: s) simp_all |
29 by (induct xs arbitrary: s) simp_all |
30 |
30 |
31 lemma foldr_fold_rev: |
31 lemma foldr_fold_rev: |
32 "foldr f xs = fold f (rev xs)" |
32 "foldr f xs = fold f (rev xs)" |
33 by (simp add: foldr_foldl foldl_fold ext_iff) |
33 by (simp add: foldr_foldl foldl_fold fun_eq_iff) |
34 |
34 |
35 lemma fold_rev_conv [code_unfold]: |
35 lemma fold_rev_conv [code_unfold]: |
36 "fold f (rev xs) = foldr f xs" |
36 "fold f (rev xs) = foldr f xs" |
37 by (simp add: foldr_fold_rev) |
37 by (simp add: foldr_fold_rev) |
38 |
38 |
47 using assms by (induct xs) simp_all |
47 using assms by (induct xs) simp_all |
48 |
48 |
49 lemma fold_apply: |
49 lemma fold_apply: |
50 assumes "\<And>x. x \<in> set xs \<Longrightarrow> h \<circ> g x = f x \<circ> h" |
50 assumes "\<And>x. x \<in> set xs \<Longrightarrow> h \<circ> g x = f x \<circ> h" |
51 shows "h \<circ> fold g xs = fold f xs \<circ> h" |
51 shows "h \<circ> fold g xs = fold f xs \<circ> h" |
52 using assms by (induct xs) (simp_all add: ext_iff) |
52 using assms by (induct xs) (simp_all add: fun_eq_iff) |
53 |
53 |
54 lemma fold_invariant: |
54 lemma fold_invariant: |
55 assumes "\<And>x. x \<in> set xs \<Longrightarrow> Q x" and "P s" |
55 assumes "\<And>x. x \<in> set xs \<Longrightarrow> Q x" and "P s" |
56 and "\<And>x s. Q x \<Longrightarrow> P s \<Longrightarrow> P (f x s)" |
56 and "\<And>x s. Q x \<Longrightarrow> P s \<Longrightarrow> P (f x s)" |
57 shows "P (fold f xs s)" |
57 shows "P (fold f xs s)" |
162 by (simp add: Inf_fin_def fold1_set del: set.simps) |
162 by (simp add: Inf_fin_def fold1_set del: set.simps) |
163 qed |
163 qed |
164 |
164 |
165 lemma (in lattice) Inf_fin_set_foldr [code_unfold]: |
165 lemma (in lattice) Inf_fin_set_foldr [code_unfold]: |
166 "Inf_fin (set (x # xs)) = foldr inf xs x" |
166 "Inf_fin (set (x # xs)) = foldr inf xs x" |
167 by (simp add: Inf_fin_set_fold ac_simps foldr_fold ext_iff del: set.simps) |
167 by (simp add: Inf_fin_set_fold ac_simps foldr_fold fun_eq_iff del: set.simps) |
168 |
168 |
169 lemma (in lattice) Sup_fin_set_fold: |
169 lemma (in lattice) Sup_fin_set_fold: |
170 "Sup_fin (set (x # xs)) = fold sup xs x" |
170 "Sup_fin (set (x # xs)) = fold sup xs x" |
171 proof - |
171 proof - |
172 interpret ab_semigroup_idem_mult "sup :: 'a \<Rightarrow> 'a \<Rightarrow> 'a" |
172 interpret ab_semigroup_idem_mult "sup :: 'a \<Rightarrow> 'a \<Rightarrow> 'a" |
175 by (simp add: Sup_fin_def fold1_set del: set.simps) |
175 by (simp add: Sup_fin_def fold1_set del: set.simps) |
176 qed |
176 qed |
177 |
177 |
178 lemma (in lattice) Sup_fin_set_foldr [code_unfold]: |
178 lemma (in lattice) Sup_fin_set_foldr [code_unfold]: |
179 "Sup_fin (set (x # xs)) = foldr sup xs x" |
179 "Sup_fin (set (x # xs)) = foldr sup xs x" |
180 by (simp add: Sup_fin_set_fold ac_simps foldr_fold ext_iff del: set.simps) |
180 by (simp add: Sup_fin_set_fold ac_simps foldr_fold fun_eq_iff del: set.simps) |
181 |
181 |
182 lemma (in linorder) Min_fin_set_fold: |
182 lemma (in linorder) Min_fin_set_fold: |
183 "Min (set (x # xs)) = fold min xs x" |
183 "Min (set (x # xs)) = fold min xs x" |
184 proof - |
184 proof - |
185 interpret ab_semigroup_idem_mult "min :: 'a \<Rightarrow> 'a \<Rightarrow> 'a" |
185 interpret ab_semigroup_idem_mult "min :: 'a \<Rightarrow> 'a \<Rightarrow> 'a" |
188 by (simp add: Min_def fold1_set del: set.simps) |
188 by (simp add: Min_def fold1_set del: set.simps) |
189 qed |
189 qed |
190 |
190 |
191 lemma (in linorder) Min_fin_set_foldr [code_unfold]: |
191 lemma (in linorder) Min_fin_set_foldr [code_unfold]: |
192 "Min (set (x # xs)) = foldr min xs x" |
192 "Min (set (x # xs)) = foldr min xs x" |
193 by (simp add: Min_fin_set_fold ac_simps foldr_fold ext_iff del: set.simps) |
193 by (simp add: Min_fin_set_fold ac_simps foldr_fold fun_eq_iff del: set.simps) |
194 |
194 |
195 lemma (in linorder) Max_fin_set_fold: |
195 lemma (in linorder) Max_fin_set_fold: |
196 "Max (set (x # xs)) = fold max xs x" |
196 "Max (set (x # xs)) = fold max xs x" |
197 proof - |
197 proof - |
198 interpret ab_semigroup_idem_mult "max :: 'a \<Rightarrow> 'a \<Rightarrow> 'a" |
198 interpret ab_semigroup_idem_mult "max :: 'a \<Rightarrow> 'a \<Rightarrow> 'a" |
201 by (simp add: Max_def fold1_set del: set.simps) |
201 by (simp add: Max_def fold1_set del: set.simps) |
202 qed |
202 qed |
203 |
203 |
204 lemma (in linorder) Max_fin_set_foldr [code_unfold]: |
204 lemma (in linorder) Max_fin_set_foldr [code_unfold]: |
205 "Max (set (x # xs)) = foldr max xs x" |
205 "Max (set (x # xs)) = foldr max xs x" |
206 by (simp add: Max_fin_set_fold ac_simps foldr_fold ext_iff del: set.simps) |
206 by (simp add: Max_fin_set_fold ac_simps foldr_fold fun_eq_iff del: set.simps) |
207 |
207 |
208 lemma (in complete_lattice) Inf_set_fold: |
208 lemma (in complete_lattice) Inf_set_fold: |
209 "Inf (set xs) = fold inf xs top" |
209 "Inf (set xs) = fold inf xs top" |
210 proof - |
210 proof - |
211 interpret fun_left_comm_idem "inf :: 'a \<Rightarrow> 'a \<Rightarrow> 'a" |
211 interpret fun_left_comm_idem "inf :: 'a \<Rightarrow> 'a \<Rightarrow> 'a" |
213 show ?thesis by (simp add: Inf_fold_inf fold_set inf_commute) |
213 show ?thesis by (simp add: Inf_fold_inf fold_set inf_commute) |
214 qed |
214 qed |
215 |
215 |
216 lemma (in complete_lattice) Inf_set_foldr [code_unfold]: |
216 lemma (in complete_lattice) Inf_set_foldr [code_unfold]: |
217 "Inf (set xs) = foldr inf xs top" |
217 "Inf (set xs) = foldr inf xs top" |
218 by (simp add: Inf_set_fold ac_simps foldr_fold ext_iff) |
218 by (simp add: Inf_set_fold ac_simps foldr_fold fun_eq_iff) |
219 |
219 |
220 lemma (in complete_lattice) Sup_set_fold: |
220 lemma (in complete_lattice) Sup_set_fold: |
221 "Sup (set xs) = fold sup xs bot" |
221 "Sup (set xs) = fold sup xs bot" |
222 proof - |
222 proof - |
223 interpret fun_left_comm_idem "sup :: 'a \<Rightarrow> 'a \<Rightarrow> 'a" |
223 interpret fun_left_comm_idem "sup :: 'a \<Rightarrow> 'a \<Rightarrow> 'a" |
225 show ?thesis by (simp add: Sup_fold_sup fold_set sup_commute) |
225 show ?thesis by (simp add: Sup_fold_sup fold_set sup_commute) |
226 qed |
226 qed |
227 |
227 |
228 lemma (in complete_lattice) Sup_set_foldr [code_unfold]: |
228 lemma (in complete_lattice) Sup_set_foldr [code_unfold]: |
229 "Sup (set xs) = foldr sup xs bot" |
229 "Sup (set xs) = foldr sup xs bot" |
230 by (simp add: Sup_set_fold ac_simps foldr_fold ext_iff) |
230 by (simp add: Sup_set_fold ac_simps foldr_fold fun_eq_iff) |
231 |
231 |
232 lemma (in complete_lattice) INFI_set_fold: |
232 lemma (in complete_lattice) INFI_set_fold: |
233 "INFI (set xs) f = fold (inf \<circ> f) xs top" |
233 "INFI (set xs) f = fold (inf \<circ> f) xs top" |
234 unfolding INFI_def set_map [symmetric] Inf_set_fold fold_map .. |
234 unfolding INFI_def set_map [symmetric] Inf_set_fold fold_map .. |
235 |
235 |