src/HOL/Library/More_List.thy
changeset 39302 d7728f65b353
parent 39198 f967a16dfcdd
child 39773 38852e989efa
equal deleted inserted replaced
39301:e1bd8a54c40f 39302:d7728f65b353
    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