diff -r b0fe60800623 -r 343da052b961 src/HOL/Finite_Set.thy --- a/src/HOL/Finite_Set.thy Thu Dec 22 14:22:11 2005 +0100 +++ b/src/HOL/Finite_Set.thy Thu Dec 22 17:57:09 2005 +0100 @@ -1972,7 +1972,9 @@ locale ACIfSL = ACIf + fixes below :: "'a \ 'a \ bool" (infixl "\" 50) + and strict_below :: "'a \ 'a \ bool" (infixl "\" 50) assumes below_def: "(x \ y) = (x\y = x)" + defines strict_below_def: "(x \ y) \ (x \ y \ x \ y)" locale ACIfSLlin = ACIfSL + assumes lin: "x\y \ {x,y}" @@ -2036,6 +2038,17 @@ qed +lemma (in ACIfSLlin) strict_below_f_conv[simp]: "x \ y \ z = (x \ y \ x \ z)" +apply(simp add: strict_below_def) +using lin[of y z] by (auto simp:below_def ACI) + + +lemma (in ACIfSLlin) strict_above_f_conv: + "x \ y \ z = (x \ z \ y \ z)" +apply(simp add: strict_below_def above_f_conv) +using lin[of y z] lin[of x z] by (auto simp:below_def ACI) + + subsubsection{* Lemmas about @{text fold1} *} lemma (in ACf) fold1_Un: @@ -2076,6 +2089,11 @@ using A by(induct rule:finite_ne_induct) simp_all +lemma (in ACIfSLlin) strict_below_fold1_iff: + "finite A \ A \ {} \ x \ fold1 f A = (\a\A. x \ a)" +by(induct rule:finite_ne_induct) simp_all + + lemma (in ACIfSL) fold1_belowI: assumes A: "finite A" "A \ {}" shows "a \ A \ fold1 f A \ a" @@ -2101,12 +2119,19 @@ qed qed + lemma (in ACIfSLlin) fold1_below_iff: assumes A: "finite A" "A \ {}" shows "fold1 f A \ x = (\a\A. a \ x)" using A by(induct rule:finite_ne_induct)(simp_all add:above_f_conv) +lemma (in ACIfSLlin) fold1_strict_below_iff: +assumes A: "finite A" "A \ {}" +shows "fold1 f A \ x = (\a\A. a \ x)" +using A +by(induct rule:finite_ne_induct)(simp_all add:strict_above_f_conv) + lemma (in ACIfSLlin) fold1_antimono: assumes "A \ {}" and "A \ B" and "finite B" @@ -2120,7 +2145,7 @@ also have "\ = f (fold1 f A) (fold1 f (B-A))" proof - have "finite A" by(rule finite_subset[OF `A \ B` `finite B`]) - moreover have "finite(B-A)" by(blast intro:finite_Diff prems) + moreover have "finite(B-A)" by(rule finite_Diff[OF `finite B`]) (* by(blast intro:finite_Diff prems) fails *) moreover have "(B-A) \ {}" using prems by blast moreover have "A Int (B-A) = {}" using prems by blast ultimately show ?thesis using `A \ {}` by(rule_tac fold1_Un) @@ -2130,6 +2155,7 @@ qed + subsubsection{* Lattices *} locale Lattice = lattice + @@ -2342,25 +2368,27 @@ done interpretation min: - ACIfSL ["min:: 'a::linorder \ 'a \ 'a" "op \"] + ACIfSL ["min:: 'a::linorder \ 'a \ 'a" "op \" "op <"] +apply(simp add:order_less_le) apply(rule ACIfSL_axioms.intro) apply(auto simp:min_def) done interpretation min: - ACIfSLlin ["min :: 'a::linorder \ 'a \ 'a" "op \"] + ACIfSLlin ["min :: 'a::linorder \ 'a \ 'a" "op \" "op <"] apply(rule ACIfSLlin_axioms.intro) apply(auto simp:min_def) done interpretation max: - ACIfSL ["max :: 'a::linorder \ 'a \ 'a" "%x y. y\x"] + ACIfSL ["max :: 'a::linorder \ 'a \ 'a" "%x y. y\x" "%x y. y 'a \ 'a" "%x y. y\x"] + ACIfSLlin ["max :: 'a::linorder \ 'a \ 'a" "%x y. y\x" "%x y. y finite A; A \ {} \ \ (Max A \ x) = (\a\A. a \ x)" by(simp add: Max_def max.below_fold1_iff) +lemma Min_gr_iff[simp]: + "\ finite A; A \ {} \ \ (x < Min A) = (\a\A. x < a)" +by(simp add: Min_def min.strict_below_fold1_iff) + +lemma Max_less_iff[simp]: + "\ finite A; A \ {} \ \ (Max A < x) = (\a\A. a < x)" +by(simp add: Max_def max.strict_below_fold1_iff) + lemma Min_le_iff: "\ finite A; A \ {} \ \ (Min A \ x) = (\a\A. a \ x)" by(simp add: Min_def min.fold1_below_iff) @@ -2432,6 +2468,14 @@ "\ finite A; A \ {} \ \ (x \ Max A) = (\a\A. x \ a)" by(simp add: Max_def max.fold1_below_iff) +lemma Min_le_iff: + "\ finite A; A \ {} \ \ (Min A < x) = (\a\A. a < x)" +by(simp add: Min_def min.fold1_strict_below_iff) + +lemma Max_ge_iff: + "\ finite A; A \ {} \ \ (x < Max A) = (\a\A. x < a)" +by(simp add: Max_def max.fold1_strict_below_iff) + lemma Min_Un: "\finite A; A \ {}; finite B; B \ {}\ \ Min (A \ B) = min (Min A) (Min B)" by(simp add:Min_def min.f.fold1_Un2)