# HG changeset patch # User nipkow # Date 1107332140 -3600 # Node ID 2636ec211ec841f96c2267f823fdd379ce672fe6 # Parent 704b3ce6d0f77abee09afa772974674a586a4080 fold and fol1 changes diff -r 704b3ce6d0f7 -r 2636ec211ec8 src/HOL/Finite_Set.thy --- a/src/HOL/Finite_Set.thy Wed Feb 02 08:53:03 2005 +0100 +++ b/src/HOL/Finite_Set.thy Wed Feb 02 09:15:40 2005 +0100 @@ -58,6 +58,24 @@ qed qed +lemma finite_ne_induct[case_names singleton insert, consumes 2]: +assumes fin: "finite F" shows "F \ {} \ + \ \x. P{x}; + \x F. \ finite F; F \ {}; x \ F; P F \ \ P (insert x F) \ + \ P F" +using fin +proof induct + case empty thus ?case by simp +next + case (insert x F) + show ?case + proof cases + assume "F = {}" thus ?thesis using insert(4) by simp + next + assume "F \ {}" thus ?thesis using insert by blast + qed +qed + lemma finite_subset_induct [consumes 2, case_names empty insert]: "finite F ==> F \ A ==> P {} ==> (!!a F. finite F ==> a \ A ==> a \ F ==> P F ==> P (insert a F)) ==> @@ -745,6 +763,10 @@ with finA show ?thesis by simp qed +lemma (in ACIf) foldI_conv_id: + "finite A \ fold f g z A = fold f id z (g ` A)" +by(erule finite_induct)(simp_all add: fold_insert2 del: fold_insert) + subsubsection{*Lemmas about @{text fold}*} lemma (in ACf) fold_commute: @@ -1850,7 +1872,7 @@ cong add: conj_cong simp add: fold1_def [symmetric] foldSet1_equality) done -lemma (in ACIf) fold1_insert2: +lemma (in ACIf) fold1_insert2[simp]: assumes finA: "finite A" and nonA: "A \ {}" shows "fold1 f (insert a A) = f a (fold1 f A)" proof cases @@ -1876,7 +1898,6 @@ with finA nonA show ?thesis by(simp add:fold1_insert) qed - text{* Now the recursion rules for definitions: *} lemma fold1_singleton_def: "g \ fold1 f \ g {a} = a" @@ -1891,6 +1912,67 @@ by(simp add:fold1_insert2) +subsubsection{* Lemmas about {@text fold1} *} + +lemma (in ACf) fold1_Un: +assumes A: "finite A" "A \ {}" +shows "finite B \ B \ {} \ A Int B = {} \ + fold1 f (A Un B) = f (fold1 f A) (fold1 f B)" +using A +proof(induct rule:finite_ne_induct) + case singleton thus ?case by(simp add:fold1_insert) +next + case insert thus ?case by (simp add:fold1_insert assoc) +qed + +lemma (in ACIf) fold1_Un2: +assumes A: "finite A" "A \ {}" +shows "finite B \ B \ {} \ + fold1 f (A Un B) = f (fold1 f A) (fold1 f B)" +using A +proof(induct rule:finite_ne_induct) + case singleton thus ?case by(simp add:fold1_insert2) +next + case insert thus ?case by (simp add:fold1_insert2 assoc) +qed + +lemma (in ACf) fold1_in: + assumes A: "finite (A)" "A \ {}" and elem: "\x y. x\y \ {x,y}" + shows "fold1 f A \ A" +using A +proof (induct rule:finite_ne_induct) + case singleton thus ?case by(simp) +next + case insert thus ?case using elem by (force simp add:fold1_insert) +qed + +lemma fold1_le: + assumes ACf: "ACf(f::'a::linorder \ 'a \ 'a)" + and A: "finite (A)" "A \ {}" and le: "\x y. f x y \ x" + shows "a \ A \ fold1 f A \ a" +using A +proof (induct rule:finite_ne_induct) + case singleton thus ?case by(simp) +next + from le have le2: "\x y. f x y \ y" by (fastsimp simp:ACf.commute[OF ACf]) + case (insert x F) thus ?case using le le2 + by (simp add:ACf.fold1_insert[OF ACf]) (blast intro: le order_trans) +qed + +lemma fold1_ge: + assumes ACf: "ACf(f::'a::linorder \ 'a \ 'a)" + and A: "finite (A)" "A \ {}" and ge: "\x y. x \ f x y" + shows "a \ A \ a \ fold1 f A" +using A +proof (induct rule:finite_ne_induct) + case singleton thus ?case by(simp) +next + from ge have ge2: "\x y. y \ f x y" by (fastsimp simp:ACf.commute[OF ACf]) + case (insert x F) thus ?case using ge ge2 + by (simp add:ACf.fold1_insert[OF ACf]) (blast intro: ge order_trans) +qed + + subsection{*Min and Max*} text{* As an application of @{text fold1} we define the minimal and @@ -1937,71 +2019,22 @@ fold1_singleton_def[OF Max_def, simp] ACIf.fold1_insert2_def[OF ACIf_max Max_def, simp] -text{* Now we prove some properties by induction: *} +text{* Now we instantiate some @{text fold1} properties: *} lemma Min_in [simp]: - assumes a: "finite S" - shows "S \ {} \ Min S \ S" -using a -proof induct - case empty thus ?case by simp -next - case (insert x S) - show ?case - proof cases - assume "S = {}" thus ?thesis by simp - next - assume "S \ {}" thus ?thesis using insert by (simp add:min_def) - qed -qed - -lemma Min_le [simp]: - assumes a: "finite S" - shows "\ S \ {}; x \ S \ \ Min S \ x" -using a -proof induct - case empty thus ?case by simp -next - case (insert y S) - show ?case - proof cases - assume "S = {}" thus ?thesis using insert by simp - next - assume "S \ {}" thus ?thesis using insert by (auto simp add:min_def) - qed -qed + shows "finite A \ A \ {} \ Min A \ A" +using ACf.fold1_in[OF ACf_min] +by(fastsimp simp: Min_def min_def) lemma Max_in [simp]: - assumes a: "finite S" - shows "S \ {} \ Max S \ S" -using a -proof induct - case empty thus ?case by simp -next - case (insert x S) - show ?case - proof cases - assume "S = {}" thus ?thesis by simp - next - assume "S \ {}" thus ?thesis using insert by (simp add:max_def) - qed -qed + shows "finite A \ A \ {} \ Max A \ A" +using ACf.fold1_in[OF ACf_max] +by(fastsimp simp: Max_def max_def) -lemma Max_le [simp]: - assumes a: "finite S" - shows "\ S \ {}; x \ S \ \ x \ Max S" -using a -proof induct - case empty thus ?case by simp -next - case (insert y S) - show ?case - proof cases - assume "S = {}" thus ?thesis using insert by simp - next - assume "S \ {}" thus ?thesis using insert by (auto simp add:max_def) - qed -qed +lemma Min_le [simp]: "\ finite A; A \ {}; x \ A \ \ Min A \ x" +by(simp add: Min_def fold1_le[OF ACf_min] min_le_iff_disj) +lemma Max_ge [simp]: "\ finite A; A \ {}; x \ A \ \ x \ Max A" +by(simp add: Max_def fold1_ge[OF ACf_max] le_max_iff_disj) end