| author | wenzelm | 
| Wed, 25 Apr 2012 17:15:10 +0200 | |
| changeset 47760 | b9840d8fca43 | 
| parent 46904 | f30e941b4512 | 
| child 48819 | 6cf7a9d8bbaf | 
| permissions | -rw-r--r-- | 
| 
35719
 
99b6152aedf5
split off theory Big_Operators from theory Finite_Set
 
haftmann 
parents: 
35577 
diff
changeset
 | 
1  | 
(* Title: HOL/Big_Operators.thy  | 
| 12396 | 2  | 
Author: Tobias Nipkow, Lawrence C Paulson and Markus Wenzel  | 
| 
16775
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16760 
diff
changeset
 | 
3  | 
with contributions by Jeremy Avigad  | 
| 12396 | 4  | 
*)  | 
5  | 
||
| 
35719
 
99b6152aedf5
split off theory Big_Operators from theory Finite_Set
 
haftmann 
parents: 
35577 
diff
changeset
 | 
6  | 
header {* Big operators and finite (non-empty) sets *}
 | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
7  | 
|
| 
35719
 
99b6152aedf5
split off theory Big_Operators from theory Finite_Set
 
haftmann 
parents: 
35577 
diff
changeset
 | 
8  | 
theory Big_Operators  | 
| 
35722
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
9  | 
imports Plain  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
10  | 
begin  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
11  | 
|
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
12  | 
subsection {* Generic monoid operation over a set *}
 | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
13  | 
|
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
14  | 
no_notation times (infixl "*" 70)  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
15  | 
no_notation Groups.one ("1")
 | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
16  | 
|
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
17  | 
locale comm_monoid_big = comm_monoid +  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
18  | 
  fixes F :: "('b \<Rightarrow> 'a) \<Rightarrow> 'b set \<Rightarrow> 'a"
 | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
19  | 
assumes F_eq: "F g A = (if finite A then fold_image (op *) g 1 A else 1)"  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
20  | 
|
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
21  | 
sublocale comm_monoid_big < folding_image proof  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
22  | 
qed (simp add: F_eq)  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
23  | 
|
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
24  | 
context comm_monoid_big  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
25  | 
begin  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
26  | 
|
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
27  | 
lemma infinite [simp]:  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
28  | 
"\<not> finite A \<Longrightarrow> F g A = 1"  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
29  | 
by (simp add: F_eq)  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
30  | 
|
| 42986 | 31  | 
lemma F_cong:  | 
32  | 
assumes "A = B" "\<And>x. x \<in> B \<Longrightarrow> h x = g x"  | 
|
33  | 
shows "F h A = F g B"  | 
|
34  | 
proof cases  | 
|
35  | 
assume "finite A"  | 
|
36  | 
with assms show ?thesis unfolding `A = B` by (simp cong: cong)  | 
|
37  | 
next  | 
|
38  | 
assume "\<not> finite A"  | 
|
39  | 
then show ?thesis unfolding `A = B` by simp  | 
|
40  | 
qed  | 
|
41  | 
||
42  | 
lemma If_cases:  | 
|
43  | 
fixes P :: "'b \<Rightarrow> bool" and g h :: "'b \<Rightarrow> 'a"  | 
|
44  | 
assumes fA: "finite A"  | 
|
45  | 
shows "F (\<lambda>x. if P x then h x else g x) A =  | 
|
46  | 
         F h (A \<inter> {x. P x}) * F g (A \<inter> - {x. P x})"
 | 
|
47  | 
proof-  | 
|
48  | 
  have a: "A = A \<inter> {x. P x} \<union> A \<inter> -{x. P x}" 
 | 
|
49  | 
          "(A \<inter> {x. P x}) \<inter> (A \<inter> -{x. P x}) = {}" 
 | 
|
50  | 
by blast+  | 
|
51  | 
from fA  | 
|
52  | 
  have f: "finite (A \<inter> {x. P x})" "finite (A \<inter> -{x. P x})" by auto
 | 
|
53  | 
let ?g = "\<lambda>x. if P x then h x else g x"  | 
|
54  | 
from union_disjoint[OF f a(2), of ?g] a(1)  | 
|
55  | 
show ?thesis  | 
|
56  | 
by (subst (1 2) F_cong) simp_all  | 
|
57  | 
qed  | 
|
58  | 
||
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
59  | 
end  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
60  | 
|
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
61  | 
text {* for ad-hoc proofs for @{const fold_image} *}
 | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
62  | 
|
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
63  | 
lemma (in comm_monoid_add) comm_monoid_mult:  | 
| 
36635
 
080b755377c0
locale predicates of classes carry a mandatory "class" prefix
 
haftmann 
parents: 
36622 
diff
changeset
 | 
64  | 
"class.comm_monoid_mult (op +) 0"  | 
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
65  | 
proof qed (auto intro: add_assoc add_commute)  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
66  | 
|
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
67  | 
notation times (infixl "*" 70)  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
68  | 
notation Groups.one ("1")
 | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
69  | 
|
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
70  | 
|
| 15402 | 71  | 
subsection {* Generalized summation over a set *}
 | 
72  | 
||
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
73  | 
definition (in comm_monoid_add) setsum :: "('b \<Rightarrow> 'a) => 'b set => 'a" where
 | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
74  | 
"setsum f A = (if finite A then fold_image (op +) f 0 A else 0)"  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
75  | 
|
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
76  | 
sublocale comm_monoid_add < setsum!: comm_monoid_big "op +" 0 setsum proof  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
77  | 
qed (fact setsum_def)  | 
| 15402 | 78  | 
|
| 19535 | 79  | 
abbreviation  | 
| 
21404
 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 
wenzelm 
parents: 
21249 
diff
changeset
 | 
80  | 
  Setsum  ("\<Sum>_" [1000] 999) where
 | 
| 19535 | 81  | 
"\<Sum>A == setsum (%x. x) A"  | 
82  | 
||
| 15402 | 83  | 
text{* Now: lot's of fancy syntax. First, @{term "setsum (%x. e) A"} is
 | 
84  | 
written @{text"\<Sum>x\<in>A. e"}. *}
 | 
|
85  | 
||
86  | 
syntax  | 
|
| 17189 | 87  | 
  "_setsum" :: "pttrn => 'a set => 'b => 'b::comm_monoid_add"    ("(3SUM _:_. _)" [0, 51, 10] 10)
 | 
| 15402 | 88  | 
syntax (xsymbols)  | 
| 17189 | 89  | 
  "_setsum" :: "pttrn => 'a set => 'b => 'b::comm_monoid_add"    ("(3\<Sum>_\<in>_. _)" [0, 51, 10] 10)
 | 
| 15402 | 90  | 
syntax (HTML output)  | 
| 17189 | 91  | 
  "_setsum" :: "pttrn => 'a set => 'b => 'b::comm_monoid_add"    ("(3\<Sum>_\<in>_. _)" [0, 51, 10] 10)
 | 
| 15402 | 92  | 
|
93  | 
translations -- {* Beware of argument permutation! *}
 | 
|
| 
28853
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
94  | 
"SUM i:A. b" == "CONST setsum (%i. b) A"  | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
95  | 
"\<Sum>i\<in>A. b" == "CONST setsum (%i. b) A"  | 
| 15402 | 96  | 
|
97  | 
text{* Instead of @{term"\<Sum>x\<in>{x. P}. e"} we introduce the shorter
 | 
|
98  | 
 @{text"\<Sum>x|P. e"}. *}
 | 
|
99  | 
||
100  | 
syntax  | 
|
| 17189 | 101  | 
  "_qsetsum" :: "pttrn \<Rightarrow> bool \<Rightarrow> 'a \<Rightarrow> 'a" ("(3SUM _ |/ _./ _)" [0,0,10] 10)
 | 
| 15402 | 102  | 
syntax (xsymbols)  | 
| 17189 | 103  | 
  "_qsetsum" :: "pttrn \<Rightarrow> bool \<Rightarrow> 'a \<Rightarrow> 'a" ("(3\<Sum>_ | (_)./ _)" [0,0,10] 10)
 | 
| 15402 | 104  | 
syntax (HTML output)  | 
| 17189 | 105  | 
  "_qsetsum" :: "pttrn \<Rightarrow> bool \<Rightarrow> 'a \<Rightarrow> 'a" ("(3\<Sum>_ | (_)./ _)" [0,0,10] 10)
 | 
| 15402 | 106  | 
|
107  | 
translations  | 
|
| 
28853
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
108  | 
  "SUM x|P. t" => "CONST setsum (%x. t) {x. P}"
 | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
109  | 
  "\<Sum>x|P. t" => "CONST setsum (%x. t) {x. P}"
 | 
| 15402 | 110  | 
|
111  | 
print_translation {*
 | 
|
112  | 
let  | 
|
| 35115 | 113  | 
  fun setsum_tr' [Abs (x, Tx, t), Const (@{const_syntax Collect}, _) $ Abs (y, Ty, P)] =
 | 
114  | 
if x <> y then raise Match  | 
|
115  | 
else  | 
|
116  | 
let  | 
|
| 42284 | 117  | 
val x' = Syntax_Trans.mark_bound x;  | 
| 35115 | 118  | 
val t' = subst_bound (x', t);  | 
119  | 
val P' = subst_bound (x', P);  | 
|
| 42284 | 120  | 
          in Syntax.const @{syntax_const "_qsetsum"} $ Syntax_Trans.mark_bound x $ P' $ t' end
 | 
| 35115 | 121  | 
| setsum_tr' _ = raise Match;  | 
122  | 
in [(@{const_syntax setsum}, setsum_tr')] end
 | 
|
| 15402 | 123  | 
*}  | 
124  | 
||
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
125  | 
lemma setsum_empty:  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
126  | 
  "setsum f {} = 0"
 | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
127  | 
by (fact setsum.empty)  | 
| 15402 | 128  | 
|
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
129  | 
lemma setsum_insert:  | 
| 
28853
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
130  | 
"finite F ==> a \<notin> F ==> setsum f (insert a F) = f a + setsum f F"  | 
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
131  | 
by (fact setsum.insert)  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
132  | 
|
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
133  | 
lemma setsum_infinite:  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
134  | 
"~ finite A ==> setsum f A = 0"  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
135  | 
by (fact setsum.infinite)  | 
| 15402 | 136  | 
|
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
137  | 
lemma (in comm_monoid_add) setsum_reindex:  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
138  | 
assumes "inj_on f B" shows "setsum h (f ` B) = setsum (h \<circ> f) B"  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
139  | 
proof -  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
140  | 
interpret comm_monoid_mult "op +" 0 by (fact comm_monoid_mult)  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
141  | 
from assms show ?thesis by (auto simp add: setsum_def fold_image_reindex dest!:finite_imageD)  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
142  | 
qed  | 
| 
15409
 
a063687d24eb
new and stronger lemmas and improved simplification for finite sets
 
paulson 
parents: 
15402 
diff
changeset
 | 
143  | 
|
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
144  | 
lemma (in comm_monoid_add) setsum_reindex_id:  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
145  | 
"inj_on f B ==> setsum f B = setsum id (f ` B)"  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
146  | 
by (simp add: setsum_reindex)  | 
| 15402 | 147  | 
|
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
148  | 
lemma (in comm_monoid_add) setsum_reindex_nonzero:  | 
| 
29674
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
149  | 
assumes fS: "finite S"  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
150  | 
and nz: "\<And> x y. x \<in> S \<Longrightarrow> y \<in> S \<Longrightarrow> x \<noteq> y \<Longrightarrow> f x = f y \<Longrightarrow> h (f x) = 0"  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
151  | 
shows "setsum h (f ` S) = setsum (h o f) S"  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
152  | 
using nz  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
153  | 
proof(induct rule: finite_induct[OF fS])  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
154  | 
case 1 thus ?case by simp  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
155  | 
next  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
156  | 
case (2 x F)  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
157  | 
  {assume fxF: "f x \<in> f ` F" hence "\<exists>y \<in> F . f y = f x" by auto
 | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
158  | 
then obtain y where y: "y \<in> F" "f x = f y" by auto  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
159  | 
from "2.hyps" y have xy: "x \<noteq> y" by auto  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
160  | 
|
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
161  | 
from "2.prems"[of x y] "2.hyps" xy y have h0: "h (f x) = 0" by simp  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
162  | 
have "setsum h (f ` insert x F) = setsum h (f ` F)" using fxF by auto  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
163  | 
also have "\<dots> = setsum (h o f) (insert x F)"  | 
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
164  | 
unfolding setsum.insert[OF `finite F` `x\<notin>F`]  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
165  | 
using h0  | 
| 
29674
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
166  | 
apply simp  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
167  | 
apply (rule "2.hyps"(3))  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
168  | 
apply (rule_tac y="y" in "2.prems")  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
169  | 
apply simp_all  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
170  | 
done  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
171  | 
finally have ?case .}  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
172  | 
moreover  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
173  | 
  {assume fxF: "f x \<notin> f ` F"
 | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
174  | 
have "setsum h (f ` insert x F) = h (f x) + setsum h (f ` F)"  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
175  | 
using fxF "2.hyps" by simp  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
176  | 
also have "\<dots> = setsum (h o f) (insert x F)"  | 
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
177  | 
unfolding setsum.insert[OF `finite F` `x\<notin>F`]  | 
| 
29674
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
178  | 
apply simp  | 
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
179  | 
apply (rule cong [OF refl [of "op + (h (f x))"]])  | 
| 
29674
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
180  | 
apply (rule "2.hyps"(3))  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
181  | 
apply (rule_tac y="y" in "2.prems")  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
182  | 
apply simp_all  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
183  | 
done  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
184  | 
finally have ?case .}  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
185  | 
ultimately show ?case by blast  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
186  | 
qed  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
187  | 
|
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
188  | 
lemma (in comm_monoid_add) setsum_cong:  | 
| 15402 | 189  | 
"A = B ==> (!!x. x:B ==> f x = g x) ==> setsum f A = setsum g B"  | 
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
190  | 
by (cases "finite A") (auto intro: setsum.cong)  | 
| 15402 | 191  | 
|
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
192  | 
lemma (in comm_monoid_add) strong_setsum_cong [cong]:  | 
| 
16733
 
236dfafbeb63
linear arithmetic now takes "&" in assumptions apart.
 
nipkow 
parents: 
16632 
diff
changeset
 | 
193  | 
"A = B ==> (!!x. x:B =simp=> f x = g x)  | 
| 
 
236dfafbeb63
linear arithmetic now takes "&" in assumptions apart.
 
nipkow 
parents: 
16632 
diff
changeset
 | 
194  | 
==> setsum (%x. f x) A = setsum (%x. g x) B"  | 
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
195  | 
by (rule setsum_cong) (simp_all add: simp_implies_def)  | 
| 
16632
 
ad2895beef79
Added strong_setsum_cong and strong_setprod_cong.
 
berghofe 
parents: 
16550 
diff
changeset
 | 
196  | 
|
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
197  | 
lemma (in comm_monoid_add) setsum_cong2: "\<lbrakk>\<And>x. x \<in> A \<Longrightarrow> f x = g x\<rbrakk> \<Longrightarrow> setsum f A = setsum g A"  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
198  | 
by (auto intro: setsum_cong)  | 
| 15554 | 199  | 
|
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
200  | 
lemma (in comm_monoid_add) setsum_reindex_cong:  | 
| 
28853
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
201  | 
"[|inj_on f A; B = f ` A; !!a. a:A \<Longrightarrow> g a = h (f a)|]  | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
202  | 
==> setsum h B = setsum g A"  | 
| 41550 | 203  | 
by (simp add: setsum_reindex)  | 
| 15402 | 204  | 
|
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
205  | 
lemma (in comm_monoid_add) setsum_0[simp]: "setsum (%i. 0) A = 0"  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
206  | 
by (cases "finite A") (erule finite_induct, auto)  | 
| 
29674
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
207  | 
|
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
208  | 
lemma (in comm_monoid_add) setsum_0': "ALL a:A. f a = 0 ==> setsum f A = 0"  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
209  | 
by (simp add:setsum_cong)  | 
| 15402 | 210  | 
|
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
211  | 
lemma (in comm_monoid_add) setsum_Un_Int: "finite A ==> finite B ==>  | 
| 15402 | 212  | 
setsum g (A Un B) + setsum g (A Int B) = setsum g A + setsum g B"  | 
213  | 
  -- {* The reversed orientation looks more natural, but LOOPS as a simprule! *}
 | 
|
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
214  | 
by (fact setsum.union_inter)  | 
| 15402 | 215  | 
|
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
216  | 
lemma (in comm_monoid_add) setsum_Un_disjoint: "finite A ==> finite B  | 
| 15402 | 217  | 
  ==> A Int B = {} ==> setsum g (A Un B) = setsum g A + setsum g B"
 | 
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
218  | 
by (fact setsum.union_disjoint)  | 
| 15402 | 219  | 
|
| 
29674
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
220  | 
lemma setsum_mono_zero_left:  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
221  | 
assumes fT: "finite T" and ST: "S \<subseteq> T"  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
222  | 
and z: "\<forall>i \<in> T - S. f i = 0"  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
223  | 
shows "setsum f S = setsum f T"  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
224  | 
proof-  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
225  | 
have eq: "T = S \<union> (T - S)" using ST by blast  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
226  | 
  have d: "S \<inter> (T - S) = {}" using ST by blast
 | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
227  | 
from fT ST have f: "finite S" "finite (T - S)" by (auto intro: finite_subset)  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
228  | 
show ?thesis  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
229  | 
by (simp add: setsum_Un_disjoint[OF f d, unfolded eq[symmetric]] setsum_0'[OF z])  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
230  | 
qed  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
231  | 
|
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
232  | 
lemma setsum_mono_zero_right:  | 
| 
30837
 
3d4832d9f7e4
added strong_setprod_cong[cong] (in analogy with setsum)
 
nipkow 
parents: 
30729 
diff
changeset
 | 
233  | 
"finite T \<Longrightarrow> S \<subseteq> T \<Longrightarrow> \<forall>i \<in> T - S. f i = 0 \<Longrightarrow> setsum f T = setsum f S"  | 
| 
 
3d4832d9f7e4
added strong_setprod_cong[cong] (in analogy with setsum)
 
nipkow 
parents: 
30729 
diff
changeset
 | 
234  | 
by(blast intro!: setsum_mono_zero_left[symmetric])  | 
| 
29674
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
235  | 
|
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
236  | 
lemma setsum_mono_zero_cong_left:  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
237  | 
assumes fT: "finite T" and ST: "S \<subseteq> T"  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
238  | 
and z: "\<forall>i \<in> T - S. g i = 0"  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
239  | 
and fg: "\<And>x. x \<in> S \<Longrightarrow> f x = g x"  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
240  | 
shows "setsum f S = setsum g T"  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
241  | 
proof-  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
242  | 
have eq: "T = S \<union> (T - S)" using ST by blast  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
243  | 
  have d: "S \<inter> (T - S) = {}" using ST by blast
 | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
244  | 
from fT ST have f: "finite S" "finite (T - S)" by (auto intro: finite_subset)  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
245  | 
show ?thesis  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
246  | 
using fg by (simp add: setsum_Un_disjoint[OF f d, unfolded eq[symmetric]] setsum_0'[OF z])  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
247  | 
qed  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
248  | 
|
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
249  | 
lemma setsum_mono_zero_cong_right:  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
250  | 
assumes fT: "finite T" and ST: "S \<subseteq> T"  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
251  | 
and z: "\<forall>i \<in> T - S. f i = 0"  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
252  | 
and fg: "\<And>x. x \<in> S \<Longrightarrow> f x = g x"  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
253  | 
shows "setsum f T = setsum g S"  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
254  | 
using setsum_mono_zero_cong_left[OF fT ST z] fg[symmetric] by auto  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
255  | 
|
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
256  | 
lemma setsum_delta:  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
257  | 
assumes fS: "finite S"  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
258  | 
shows "setsum (\<lambda>k. if k=a then b k else 0) S = (if a \<in> S then b a else 0)"  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
259  | 
proof-  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
260  | 
let ?f = "(\<lambda>k. if k=a then b k else 0)"  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
261  | 
  {assume a: "a \<notin> S"
 | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
262  | 
hence "\<forall> k\<in> S. ?f k = 0" by simp  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
263  | 
hence ?thesis using a by simp}  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
264  | 
moreover  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
265  | 
  {assume a: "a \<in> S"
 | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
266  | 
    let ?A = "S - {a}"
 | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
267  | 
    let ?B = "{a}"
 | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
268  | 
have eq: "S = ?A \<union> ?B" using a by blast  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
269  | 
    have dj: "?A \<inter> ?B = {}" by simp
 | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
270  | 
from fS have fAB: "finite ?A" "finite ?B" by auto  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
271  | 
have "setsum ?f S = setsum ?f ?A + setsum ?f ?B"  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
272  | 
using setsum_Un_disjoint[OF fAB dj, of ?f, unfolded eq[symmetric]]  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
273  | 
by simp  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
274  | 
then have ?thesis using a by simp}  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
275  | 
ultimately show ?thesis by blast  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
276  | 
qed  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
277  | 
lemma setsum_delta':  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
278  | 
assumes fS: "finite S" shows  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
279  | 
"setsum (\<lambda>k. if a = k then b k else 0) S =  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
280  | 
(if a\<in> S then b a else 0)"  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
281  | 
using setsum_delta[OF fS, of a b, symmetric]  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
282  | 
by (auto intro: setsum_cong)  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
283  | 
|
| 
30260
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
284  | 
lemma setsum_restrict_set:  | 
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
285  | 
assumes fA: "finite A"  | 
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
286  | 
shows "setsum f (A \<inter> B) = setsum (\<lambda>x. if x \<in> B then f x else 0) A"  | 
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
287  | 
proof-  | 
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
288  | 
from fA have fab: "finite (A \<inter> B)" by auto  | 
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
289  | 
have aba: "A \<inter> B \<subseteq> A" by blast  | 
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
290  | 
let ?g = "\<lambda>x. if x \<in> A\<inter>B then f x else 0"  | 
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
291  | 
from setsum_mono_zero_left[OF fA aba, of ?g]  | 
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
292  | 
show ?thesis by simp  | 
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
293  | 
qed  | 
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
294  | 
|
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
295  | 
lemma setsum_cases:  | 
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
296  | 
assumes fA: "finite A"  | 
| 35577 | 297  | 
shows "setsum (\<lambda>x. if P x then f x else g x) A =  | 
298  | 
         setsum f (A \<inter> {x. P x}) + setsum g (A \<inter> - {x. P x})"
 | 
|
| 42986 | 299  | 
using setsum.If_cases[OF fA] .  | 
| 
29674
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
300  | 
|
| 
15409
 
a063687d24eb
new and stronger lemmas and improved simplification for finite sets
 
paulson 
parents: 
15402 
diff
changeset
 | 
301  | 
(*But we can't get rid of finite I. If infinite, although the rhs is 0,  | 
| 
 
a063687d24eb
new and stronger lemmas and improved simplification for finite sets
 
paulson 
parents: 
15402 
diff
changeset
 | 
302  | 
the lhs need not be, since UNION I A could still be finite.*)  | 
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
303  | 
lemma (in comm_monoid_add) setsum_UN_disjoint:  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
304  | 
assumes "finite I" and "ALL i:I. finite (A i)"  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
305  | 
    and "ALL i:I. ALL j:I. i \<noteq> j --> A i Int A j = {}"
 | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
306  | 
shows "setsum f (UNION I A) = (\<Sum>i\<in>I. setsum f (A i))"  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
307  | 
proof -  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
308  | 
interpret comm_monoid_mult "op +" 0 by (fact comm_monoid_mult)  | 
| 41550 | 309  | 
from assms show ?thesis by (simp add: setsum_def fold_image_UN_disjoint)  | 
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
310  | 
qed  | 
| 15402 | 311  | 
|
| 
15409
 
a063687d24eb
new and stronger lemmas and improved simplification for finite sets
 
paulson 
parents: 
15402 
diff
changeset
 | 
312  | 
text{*No need to assume that @{term C} is finite.  If infinite, the rhs is
 | 
| 
 
a063687d24eb
new and stronger lemmas and improved simplification for finite sets
 
paulson 
parents: 
15402 
diff
changeset
 | 
313  | 
directly 0, and @{term "Union C"} is also infinite, hence the lhs is also 0.*}
 | 
| 15402 | 314  | 
lemma setsum_Union_disjoint:  | 
| 
44937
 
22c0857b8aab
removed further legacy rules from Complete_Lattices
 
hoelzl 
parents: 
44921 
diff
changeset
 | 
315  | 
  assumes "\<forall>A\<in>C. finite A" "\<forall>A\<in>C. \<forall>B\<in>C. A \<noteq> B \<longrightarrow> A Int B = {}"
 | 
| 
 
22c0857b8aab
removed further legacy rules from Complete_Lattices
 
hoelzl 
parents: 
44921 
diff
changeset
 | 
316  | 
shows "setsum f (Union C) = setsum (setsum f) C"  | 
| 
 
22c0857b8aab
removed further legacy rules from Complete_Lattices
 
hoelzl 
parents: 
44921 
diff
changeset
 | 
317  | 
proof cases  | 
| 
 
22c0857b8aab
removed further legacy rules from Complete_Lattices
 
hoelzl 
parents: 
44921 
diff
changeset
 | 
318  | 
assume "finite C"  | 
| 
 
22c0857b8aab
removed further legacy rules from Complete_Lattices
 
hoelzl 
parents: 
44921 
diff
changeset
 | 
319  | 
from setsum_UN_disjoint[OF this assms]  | 
| 
 
22c0857b8aab
removed further legacy rules from Complete_Lattices
 
hoelzl 
parents: 
44921 
diff
changeset
 | 
320  | 
show ?thesis  | 
| 
 
22c0857b8aab
removed further legacy rules from Complete_Lattices
 
hoelzl 
parents: 
44921 
diff
changeset
 | 
321  | 
by (simp add: SUP_def)  | 
| 
 
22c0857b8aab
removed further legacy rules from Complete_Lattices
 
hoelzl 
parents: 
44921 
diff
changeset
 | 
322  | 
qed (force dest: finite_UnionD simp add: setsum_def)  | 
| 15402 | 323  | 
|
| 
15409
 
a063687d24eb
new and stronger lemmas and improved simplification for finite sets
 
paulson 
parents: 
15402 
diff
changeset
 | 
324  | 
(*But we can't get rid of finite A. If infinite, although the lhs is 0,  | 
| 
 
a063687d24eb
new and stronger lemmas and improved simplification for finite sets
 
paulson 
parents: 
15402 
diff
changeset
 | 
325  | 
the rhs need not be, since SIGMA A B could still be finite.*)  | 
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
326  | 
lemma (in comm_monoid_add) setsum_Sigma:  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
327  | 
assumes "finite A" and "ALL x:A. finite (B x)"  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
328  | 
shows "(\<Sum>x\<in>A. (\<Sum>y\<in>B x. f x y)) = (\<Sum>(x,y)\<in>(SIGMA x:A. B x). f x y)"  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
329  | 
proof -  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
330  | 
interpret comm_monoid_mult "op +" 0 by (fact comm_monoid_mult)  | 
| 41550 | 331  | 
from assms show ?thesis by (simp add: setsum_def fold_image_Sigma split_def)  | 
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
332  | 
qed  | 
| 15402 | 333  | 
|
| 
15409
 
a063687d24eb
new and stronger lemmas and improved simplification for finite sets
 
paulson 
parents: 
15402 
diff
changeset
 | 
334  | 
text{*Here we can eliminate the finiteness assumptions, by cases.*}
 | 
| 
 
a063687d24eb
new and stronger lemmas and improved simplification for finite sets
 
paulson 
parents: 
15402 
diff
changeset
 | 
335  | 
lemma setsum_cartesian_product:  | 
| 17189 | 336  | 
"(\<Sum>x\<in>A. (\<Sum>y\<in>B. f x y)) = (\<Sum>(x,y) \<in> A <*> B. f x y)"  | 
| 
15409
 
a063687d24eb
new and stronger lemmas and improved simplification for finite sets
 
paulson 
parents: 
15402 
diff
changeset
 | 
337  | 
apply (cases "finite A")  | 
| 
 
a063687d24eb
new and stronger lemmas and improved simplification for finite sets
 
paulson 
parents: 
15402 
diff
changeset
 | 
338  | 
apply (cases "finite B")  | 
| 
 
a063687d24eb
new and stronger lemmas and improved simplification for finite sets
 
paulson 
parents: 
15402 
diff
changeset
 | 
339  | 
apply (simp add: setsum_Sigma)  | 
| 
 
a063687d24eb
new and stronger lemmas and improved simplification for finite sets
 
paulson 
parents: 
15402 
diff
changeset
 | 
340  | 
 apply (cases "A={}", simp)
 | 
| 15543 | 341  | 
apply (simp)  | 
| 
15409
 
a063687d24eb
new and stronger lemmas and improved simplification for finite sets
 
paulson 
parents: 
15402 
diff
changeset
 | 
342  | 
apply (auto simp add: setsum_def  | 
| 
 
a063687d24eb
new and stronger lemmas and improved simplification for finite sets
 
paulson 
parents: 
15402 
diff
changeset
 | 
343  | 
dest: finite_cartesian_productD1 finite_cartesian_productD2)  | 
| 
 
a063687d24eb
new and stronger lemmas and improved simplification for finite sets
 
paulson 
parents: 
15402 
diff
changeset
 | 
344  | 
done  | 
| 15402 | 345  | 
|
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
346  | 
lemma (in comm_monoid_add) setsum_addf: "setsum (%x. f x + g x) A = (setsum f A + setsum g A)"  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
347  | 
by (cases "finite A") (simp_all add: setsum.distrib)  | 
| 15402 | 348  | 
|
349  | 
||
350  | 
subsubsection {* Properties in more restricted classes of structures *}
 | 
|
351  | 
||
352  | 
lemma setsum_SucD: "setsum f A = Suc n ==> EX a:A. 0 < f a"  | 
|
| 
28853
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
353  | 
apply (case_tac "finite A")  | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
354  | 
prefer 2 apply (simp add: setsum_def)  | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
355  | 
apply (erule rev_mp)  | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
356  | 
apply (erule finite_induct, auto)  | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
357  | 
done  | 
| 15402 | 358  | 
|
359  | 
lemma setsum_eq_0_iff [simp]:  | 
|
360  | 
"finite F ==> (setsum f F = 0) = (ALL a:F. f a = (0::nat))"  | 
|
| 
28853
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
361  | 
by (induct set: finite) auto  | 
| 15402 | 362  | 
|
| 30859 | 363  | 
lemma setsum_eq_Suc0_iff: "finite A \<Longrightarrow>  | 
364  | 
(setsum f A = Suc 0) = (EX a:A. f a = Suc 0 & (ALL b:A. a\<noteq>b \<longrightarrow> f b = 0))"  | 
|
365  | 
apply(erule finite_induct)  | 
|
366  | 
apply (auto simp add:add_is_1)  | 
|
367  | 
done  | 
|
368  | 
||
369  | 
lemmas setsum_eq_1_iff = setsum_eq_Suc0_iff[simplified One_nat_def[symmetric]]  | 
|
370  | 
||
| 15402 | 371  | 
lemma setsum_Un_nat: "finite A ==> finite B ==>  | 
| 
28853
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
372  | 
(setsum f (A Un B) :: nat) = setsum f A + setsum f B - setsum f (A Int B)"  | 
| 15402 | 373  | 
  -- {* For the natural numbers, we have subtraction. *}
 | 
| 29667 | 374  | 
by (subst setsum_Un_Int [symmetric], auto simp add: algebra_simps)  | 
| 15402 | 375  | 
|
376  | 
lemma setsum_Un: "finite A ==> finite B ==>  | 
|
| 
28853
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
377  | 
(setsum f (A Un B) :: 'a :: ab_group_add) =  | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
378  | 
setsum f A + setsum f B - setsum f (A Int B)"  | 
| 29667 | 379  | 
by (subst setsum_Un_Int [symmetric], auto simp add: algebra_simps)  | 
| 15402 | 380  | 
|
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
381  | 
lemma (in comm_monoid_add) setsum_eq_general_reverses:  | 
| 
30260
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
382  | 
assumes fS: "finite S" and fT: "finite T"  | 
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
383  | 
and kh: "\<And>y. y \<in> T \<Longrightarrow> k y \<in> S \<and> h (k y) = y"  | 
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
384  | 
and hk: "\<And>x. x \<in> S \<Longrightarrow> h x \<in> T \<and> k (h x) = x \<and> g (h x) = f x"  | 
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
385  | 
shows "setsum f S = setsum g T"  | 
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
386  | 
proof -  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
387  | 
interpret comm_monoid_mult "op +" 0 by (fact comm_monoid_mult)  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
388  | 
show ?thesis  | 
| 
30260
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
389  | 
apply (simp add: setsum_def fS fT)  | 
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
390  | 
apply (rule fold_image_eq_general_inverses)  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
391  | 
apply (rule fS)  | 
| 
30260
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
392  | 
apply (erule kh)  | 
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
393  | 
apply (erule hk)  | 
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
394  | 
done  | 
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
395  | 
qed  | 
| 
30260
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
396  | 
|
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
397  | 
lemma (in comm_monoid_add) setsum_Un_zero:  | 
| 
30260
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
398  | 
assumes fS: "finite S" and fT: "finite T"  | 
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
399  | 
and I0: "\<forall>x \<in> S\<inter>T. f x = 0"  | 
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
400  | 
shows "setsum f (S \<union> T) = setsum f S + setsum f T"  | 
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
401  | 
proof -  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
402  | 
interpret comm_monoid_mult "op +" 0 by (fact comm_monoid_mult)  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
403  | 
show ?thesis  | 
| 
30260
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
404  | 
using fS fT  | 
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
405  | 
apply (simp add: setsum_def)  | 
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
406  | 
apply (rule fold_image_Un_one)  | 
| 
30260
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
407  | 
using I0 by auto  | 
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
408  | 
qed  | 
| 
30260
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
409  | 
|
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
410  | 
lemma setsum_UNION_zero:  | 
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
411  | 
assumes fS: "finite S" and fSS: "\<forall>T \<in> S. finite T"  | 
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
412  | 
and f0: "\<And>T1 T2 x. T1\<in>S \<Longrightarrow> T2\<in>S \<Longrightarrow> T1 \<noteq> T2 \<Longrightarrow> x \<in> T1 \<Longrightarrow> x \<in> T2 \<Longrightarrow> f x = 0"  | 
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
413  | 
shows "setsum f (\<Union>S) = setsum (\<lambda>T. setsum f T) S"  | 
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
414  | 
using fSS f0  | 
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
415  | 
proof(induct rule: finite_induct[OF fS])  | 
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
416  | 
case 1 thus ?case by simp  | 
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
417  | 
next  | 
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
418  | 
case (2 T F)  | 
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
419  | 
then have fTF: "finite T" "\<forall>T\<in>F. finite T" "finite F" and TF: "T \<notin> F"  | 
| 35216 | 420  | 
and H: "setsum f (\<Union> F) = setsum (setsum f) F" by auto  | 
421  | 
from fTF have fUF: "finite (\<Union>F)" by auto  | 
|
| 
30260
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
422  | 
from "2.prems" TF fTF  | 
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
423  | 
show ?case  | 
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
424  | 
by (auto simp add: H[symmetric] intro: setsum_Un_zero[OF fTF(1) fUF, of f])  | 
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
425  | 
qed  | 
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
426  | 
|
| 15402 | 427  | 
lemma setsum_diff1_nat: "(setsum f (A - {a}) :: nat) =
 | 
| 
28853
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
428  | 
(if a:A then setsum f A - f a else setsum f A)"  | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
429  | 
apply (case_tac "finite A")  | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
430  | 
prefer 2 apply (simp add: setsum_def)  | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
431  | 
apply (erule finite_induct)  | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
432  | 
apply (auto simp add: insert_Diff_if)  | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
433  | 
apply (drule_tac a = a in mk_disjoint_insert, auto)  | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
434  | 
done  | 
| 15402 | 435  | 
|
436  | 
lemma setsum_diff1: "finite A \<Longrightarrow>  | 
|
437  | 
  (setsum f (A - {a}) :: ('a::ab_group_add)) =
 | 
|
438  | 
(if a:A then setsum f A - f a else setsum f A)"  | 
|
| 
28853
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
439  | 
by (erule finite_induct) (auto simp add: insert_Diff_if)  | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
440  | 
|
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
441  | 
lemma setsum_diff1'[rule_format]:  | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
442  | 
  "finite A \<Longrightarrow> a \<in> A \<longrightarrow> (\<Sum> x \<in> A. f x) = f a + (\<Sum> x \<in> (A - {a}). f x)"
 | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
443  | 
apply (erule finite_induct[where F=A and P="% A. (a \<in> A \<longrightarrow> (\<Sum> x \<in> A. f x) = f a + (\<Sum> x \<in> (A - {a}). f x))"])
 | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
444  | 
apply (auto simp add: insert_Diff_if add_ac)  | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
445  | 
done  | 
| 
15552
 
8ab8e425410b
added setsum_diff1' which holds in more general cases than setsum_diff1
 
obua 
parents: 
15543 
diff
changeset
 | 
446  | 
|
| 31438 | 447  | 
lemma setsum_diff1_ring: assumes "finite A" "a \<in> A"  | 
448  | 
  shows "setsum f (A - {a}) = setsum f A - (f a::'a::ring)"
 | 
|
449  | 
unfolding setsum_diff1'[OF assms] by auto  | 
|
450  | 
||
| 15402 | 451  | 
(* By Jeremy Siek: *)  | 
452  | 
||
453  | 
lemma setsum_diff_nat:  | 
|
| 
28853
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
454  | 
assumes "finite B" and "B \<subseteq> A"  | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
455  | 
shows "(setsum f (A - B) :: nat) = (setsum f A) - (setsum f B)"  | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
456  | 
using assms  | 
| 19535 | 457  | 
proof induct  | 
| 15402 | 458  | 
  show "setsum f (A - {}) = (setsum f A) - (setsum f {})" by simp
 | 
459  | 
next  | 
|
460  | 
fix F x assume finF: "finite F" and xnotinF: "x \<notin> F"  | 
|
461  | 
and xFinA: "insert x F \<subseteq> A"  | 
|
462  | 
and IH: "F \<subseteq> A \<Longrightarrow> setsum f (A - F) = setsum f A - setsum f F"  | 
|
463  | 
from xnotinF xFinA have xinAF: "x \<in> (A - F)" by simp  | 
|
464  | 
  from xinAF have A: "setsum f ((A - F) - {x}) = setsum f (A - F) - f x"
 | 
|
465  | 
by (simp add: setsum_diff1_nat)  | 
|
466  | 
from xFinA have "F \<subseteq> A" by simp  | 
|
467  | 
with IH have "setsum f (A - F) = setsum f A - setsum f F" by simp  | 
|
468  | 
  with A have B: "setsum f ((A - F) - {x}) = setsum f A - setsum f F - f x"
 | 
|
469  | 
by simp  | 
|
470  | 
  from xnotinF have "A - insert x F = (A - F) - {x}" by auto
 | 
|
471  | 
with B have C: "setsum f (A - insert x F) = setsum f A - setsum f F - f x"  | 
|
472  | 
by simp  | 
|
473  | 
from finF xnotinF have "setsum f (insert x F) = setsum f F + f x" by simp  | 
|
474  | 
with C have "setsum f (A - insert x F) = setsum f A - setsum f (insert x F)"  | 
|
475  | 
by simp  | 
|
476  | 
thus "setsum f (A - insert x F) = setsum f A - setsum f (insert x F)" by simp  | 
|
477  | 
qed  | 
|
478  | 
||
479  | 
lemma setsum_diff:  | 
|
480  | 
assumes le: "finite A" "B \<subseteq> A"  | 
|
481  | 
  shows "setsum f (A - B) = setsum f A - ((setsum f B)::('a::ab_group_add))"
 | 
|
482  | 
proof -  | 
|
483  | 
from le have finiteB: "finite B" using finite_subset by auto  | 
|
484  | 
show ?thesis using finiteB le  | 
|
| 21575 | 485  | 
proof induct  | 
| 19535 | 486  | 
case empty  | 
487  | 
thus ?case by auto  | 
|
488  | 
next  | 
|
489  | 
case (insert x F)  | 
|
490  | 
thus ?case using le finiteB  | 
|
491  | 
by (simp add: Diff_insert[where a=x and B=F] setsum_diff1 insert_absorb)  | 
|
| 15402 | 492  | 
qed  | 
| 19535 | 493  | 
qed  | 
| 15402 | 494  | 
|
495  | 
lemma setsum_mono:  | 
|
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34223 
diff
changeset
 | 
496  | 
  assumes le: "\<And>i. i\<in>K \<Longrightarrow> f (i::'a) \<le> ((g i)::('b::{comm_monoid_add, ordered_ab_semigroup_add}))"
 | 
| 15402 | 497  | 
shows "(\<Sum>i\<in>K. f i) \<le> (\<Sum>i\<in>K. g i)"  | 
498  | 
proof (cases "finite K")  | 
|
499  | 
case True  | 
|
500  | 
thus ?thesis using le  | 
|
| 19535 | 501  | 
proof induct  | 
| 15402 | 502  | 
case empty  | 
503  | 
thus ?case by simp  | 
|
504  | 
next  | 
|
505  | 
case insert  | 
|
| 
44890
 
22f665a2e91c
new fastforce replacing fastsimp - less confusing name
 
nipkow 
parents: 
44845 
diff
changeset
 | 
506  | 
thus ?case using add_mono by fastforce  | 
| 15402 | 507  | 
qed  | 
508  | 
next  | 
|
509  | 
case False  | 
|
510  | 
thus ?thesis  | 
|
511  | 
by (simp add: setsum_def)  | 
|
512  | 
qed  | 
|
513  | 
||
| 15554 | 514  | 
lemma setsum_strict_mono:  | 
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34223 
diff
changeset
 | 
515  | 
  fixes f :: "'a \<Rightarrow> 'b::{ordered_cancel_ab_semigroup_add,comm_monoid_add}"
 | 
| 19535 | 516  | 
  assumes "finite A"  "A \<noteq> {}"
 | 
517  | 
and "!!x. x:A \<Longrightarrow> f x < g x"  | 
|
518  | 
shows "setsum f A < setsum g A"  | 
|
| 41550 | 519  | 
using assms  | 
| 15554 | 520  | 
proof (induct rule: finite_ne_induct)  | 
521  | 
case singleton thus ?case by simp  | 
|
522  | 
next  | 
|
523  | 
case insert thus ?case by (auto simp: add_strict_mono)  | 
|
524  | 
qed  | 
|
525  | 
||
| 46699 | 526  | 
lemma setsum_strict_mono_ex1:  | 
527  | 
fixes f :: "'a \<Rightarrow> 'b::{comm_monoid_add, ordered_cancel_ab_semigroup_add}"
 | 
|
528  | 
assumes "finite A" and "ALL x:A. f x \<le> g x" and "EX a:A. f a < g a"  | 
|
529  | 
shows "setsum f A < setsum g A"  | 
|
530  | 
proof-  | 
|
531  | 
from assms(3) obtain a where a: "a:A" "f a < g a" by blast  | 
|
532  | 
  have "setsum f A = setsum f ((A-{a}) \<union> {a})"
 | 
|
533  | 
by(simp add:insert_absorb[OF `a:A`])  | 
|
534  | 
  also have "\<dots> = setsum f (A-{a}) + setsum f {a}"
 | 
|
535  | 
using `finite A` by(subst setsum_Un_disjoint) auto  | 
|
536  | 
  also have "setsum f (A-{a}) \<le> setsum g (A-{a})"
 | 
|
537  | 
by(rule setsum_mono)(simp add: assms(2))  | 
|
538  | 
  also have "setsum f {a} < setsum g {a}" using a by simp
 | 
|
539  | 
  also have "setsum g (A - {a}) + setsum g {a} = setsum g((A-{a}) \<union> {a})"
 | 
|
540  | 
using `finite A` by(subst setsum_Un_disjoint[symmetric]) auto  | 
|
541  | 
also have "\<dots> = setsum g A" by(simp add:insert_absorb[OF `a:A`])  | 
|
542  | 
finally show ?thesis by (metis add_right_mono add_strict_left_mono)  | 
|
543  | 
qed  | 
|
544  | 
||
| 15535 | 545  | 
lemma setsum_negf:  | 
| 19535 | 546  | 
"setsum (%x. - (f x)::'a::ab_group_add) A = - setsum f A"  | 
| 15535 | 547  | 
proof (cases "finite A")  | 
| 22262 | 548  | 
case True thus ?thesis by (induct set: finite) auto  | 
| 15535 | 549  | 
next  | 
550  | 
case False thus ?thesis by (simp add: setsum_def)  | 
|
551  | 
qed  | 
|
| 15402 | 552  | 
|
| 15535 | 553  | 
lemma setsum_subtractf:  | 
| 19535 | 554  | 
"setsum (%x. ((f x)::'a::ab_group_add) - g x) A =  | 
555  | 
setsum f A - setsum g A"  | 
|
| 15535 | 556  | 
proof (cases "finite A")  | 
557  | 
case True thus ?thesis by (simp add: diff_minus setsum_addf setsum_negf)  | 
|
558  | 
next  | 
|
559  | 
case False thus ?thesis by (simp add: setsum_def)  | 
|
560  | 
qed  | 
|
| 15402 | 561  | 
|
| 15535 | 562  | 
lemma setsum_nonneg:  | 
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34223 
diff
changeset
 | 
563  | 
  assumes nn: "\<forall>x\<in>A. (0::'a::{ordered_ab_semigroup_add,comm_monoid_add}) \<le> f x"
 | 
| 19535 | 564  | 
shows "0 \<le> setsum f A"  | 
| 15535 | 565  | 
proof (cases "finite A")  | 
566  | 
case True thus ?thesis using nn  | 
|
| 21575 | 567  | 
proof induct  | 
| 19535 | 568  | 
case empty then show ?case by simp  | 
569  | 
next  | 
|
570  | 
case (insert x F)  | 
|
571  | 
then have "0 + 0 \<le> f x + setsum f F" by (blast intro: add_mono)  | 
|
572  | 
with insert show ?case by simp  | 
|
573  | 
qed  | 
|
| 15535 | 574  | 
next  | 
575  | 
case False thus ?thesis by (simp add: setsum_def)  | 
|
576  | 
qed  | 
|
| 15402 | 577  | 
|
| 15535 | 578  | 
lemma setsum_nonpos:  | 
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34223 
diff
changeset
 | 
579  | 
  assumes np: "\<forall>x\<in>A. f x \<le> (0::'a::{ordered_ab_semigroup_add,comm_monoid_add})"
 | 
| 19535 | 580  | 
shows "setsum f A \<le> 0"  | 
| 15535 | 581  | 
proof (cases "finite A")  | 
582  | 
case True thus ?thesis using np  | 
|
| 21575 | 583  | 
proof induct  | 
| 19535 | 584  | 
case empty then show ?case by simp  | 
585  | 
next  | 
|
586  | 
case (insert x F)  | 
|
587  | 
then have "f x + setsum f F \<le> 0 + 0" by (blast intro: add_mono)  | 
|
588  | 
with insert show ?case by simp  | 
|
589  | 
qed  | 
|
| 15535 | 590  | 
next  | 
591  | 
case False thus ?thesis by (simp add: setsum_def)  | 
|
592  | 
qed  | 
|
| 15402 | 593  | 
|
| 
36622
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36409 
diff
changeset
 | 
594  | 
lemma setsum_nonneg_leq_bound:  | 
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36409 
diff
changeset
 | 
595  | 
  fixes f :: "'a \<Rightarrow> 'b::{ordered_ab_group_add}"
 | 
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36409 
diff
changeset
 | 
596  | 
assumes "finite s" "\<And>i. i \<in> s \<Longrightarrow> f i \<ge> 0" "(\<Sum>i \<in> s. f i) = B" "i \<in> s"  | 
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36409 
diff
changeset
 | 
597  | 
shows "f i \<le> B"  | 
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36409 
diff
changeset
 | 
598  | 
proof -  | 
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36409 
diff
changeset
 | 
599  | 
  have "0 \<le> (\<Sum> i \<in> s - {i}. f i)" and "0 \<le> f i"
 | 
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36409 
diff
changeset
 | 
600  | 
using assms by (auto intro!: setsum_nonneg)  | 
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36409 
diff
changeset
 | 
601  | 
moreover  | 
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36409 
diff
changeset
 | 
602  | 
  have "(\<Sum> i \<in> s - {i}. f i) + f i = B"
 | 
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36409 
diff
changeset
 | 
603  | 
using assms by (simp add: setsum_diff1)  | 
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36409 
diff
changeset
 | 
604  | 
ultimately show ?thesis by auto  | 
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36409 
diff
changeset
 | 
605  | 
qed  | 
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36409 
diff
changeset
 | 
606  | 
|
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36409 
diff
changeset
 | 
607  | 
lemma setsum_nonneg_0:  | 
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36409 
diff
changeset
 | 
608  | 
  fixes f :: "'a \<Rightarrow> 'b::{ordered_ab_group_add}"
 | 
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36409 
diff
changeset
 | 
609  | 
assumes "finite s" and pos: "\<And> i. i \<in> s \<Longrightarrow> f i \<ge> 0"  | 
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36409 
diff
changeset
 | 
610  | 
and "(\<Sum> i \<in> s. f i) = 0" and i: "i \<in> s"  | 
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36409 
diff
changeset
 | 
611  | 
shows "f i = 0"  | 
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36409 
diff
changeset
 | 
612  | 
using setsum_nonneg_leq_bound[OF assms] pos[OF i] by auto  | 
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36409 
diff
changeset
 | 
613  | 
|
| 15539 | 614  | 
lemma setsum_mono2:  | 
| 36303 | 615  | 
fixes f :: "'a \<Rightarrow> 'b :: ordered_comm_monoid_add"  | 
| 15539 | 616  | 
assumes fin: "finite B" and sub: "A \<subseteq> B" and nn: "\<And>b. b \<in> B-A \<Longrightarrow> 0 \<le> f b"  | 
617  | 
shows "setsum f A \<le> setsum f B"  | 
|
618  | 
proof -  | 
|
619  | 
have "setsum f A \<le> setsum f A + setsum f (B-A)"  | 
|
620  | 
by(simp add: add_increasing2[OF setsum_nonneg] nn Ball_def)  | 
|
621  | 
also have "\<dots> = setsum f (A \<union> (B-A))" using fin finite_subset[OF sub fin]  | 
|
622  | 
by (simp add:setsum_Un_disjoint del:Un_Diff_cancel)  | 
|
623  | 
also have "A \<union> (B-A) = B" using sub by blast  | 
|
624  | 
finally show ?thesis .  | 
|
625  | 
qed  | 
|
| 15542 | 626  | 
|
| 
16775
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16760 
diff
changeset
 | 
627  | 
lemma setsum_mono3: "finite B ==> A <= B ==>  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16760 
diff
changeset
 | 
628  | 
ALL x: B - A.  | 
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34223 
diff
changeset
 | 
629  | 
      0 <= ((f x)::'a::{comm_monoid_add,ordered_ab_semigroup_add}) ==>
 | 
| 
16775
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16760 
diff
changeset
 | 
630  | 
setsum f A <= setsum f B"  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16760 
diff
changeset
 | 
631  | 
apply (subgoal_tac "setsum f B = setsum f A + setsum f (B - A)")  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16760 
diff
changeset
 | 
632  | 
apply (erule ssubst)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16760 
diff
changeset
 | 
633  | 
apply (subgoal_tac "setsum f A + 0 <= setsum f A + setsum f (B - A)")  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16760 
diff
changeset
 | 
634  | 
apply simp  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16760 
diff
changeset
 | 
635  | 
apply (rule add_left_mono)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16760 
diff
changeset
 | 
636  | 
apply (erule setsum_nonneg)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16760 
diff
changeset
 | 
637  | 
apply (subst setsum_Un_disjoint [THEN sym])  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16760 
diff
changeset
 | 
638  | 
apply (erule finite_subset, assumption)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16760 
diff
changeset
 | 
639  | 
apply (rule finite_subset)  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16760 
diff
changeset
 | 
640  | 
prefer 2  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16760 
diff
changeset
 | 
641  | 
apply assumption  | 
| 
32698
 
be4b248616c0
inf/sup_absorb are no default simp rules any longer
 
haftmann 
parents: 
32697 
diff
changeset
 | 
642  | 
apply (auto simp add: sup_absorb2)  | 
| 
16775
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16760 
diff
changeset
 | 
643  | 
done  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16760 
diff
changeset
 | 
644  | 
|
| 19279 | 645  | 
lemma setsum_right_distrib:  | 
| 
22934
 
64ecb3d6790a
generalize setsum lemmas from semiring_0_cancel to semiring_0
 
huffman 
parents: 
22917 
diff
changeset
 | 
646  | 
  fixes f :: "'a => ('b::semiring_0)"
 | 
| 15402 | 647  | 
shows "r * setsum f A = setsum (%n. r * f n) A"  | 
648  | 
proof (cases "finite A")  | 
|
649  | 
case True  | 
|
650  | 
thus ?thesis  | 
|
| 21575 | 651  | 
proof induct  | 
| 15402 | 652  | 
case empty thus ?case by simp  | 
653  | 
next  | 
|
654  | 
case (insert x A) thus ?case by (simp add: right_distrib)  | 
|
655  | 
qed  | 
|
656  | 
next  | 
|
657  | 
case False thus ?thesis by (simp add: setsum_def)  | 
|
658  | 
qed  | 
|
659  | 
||
| 
17149
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
660  | 
lemma setsum_left_distrib:  | 
| 
22934
 
64ecb3d6790a
generalize setsum lemmas from semiring_0_cancel to semiring_0
 
huffman 
parents: 
22917 
diff
changeset
 | 
661  | 
"setsum f A * (r::'a::semiring_0) = (\<Sum>n\<in>A. f n * r)"  | 
| 
17149
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
662  | 
proof (cases "finite A")  | 
| 
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
663  | 
case True  | 
| 
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
664  | 
then show ?thesis  | 
| 
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
665  | 
proof induct  | 
| 
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
666  | 
case empty thus ?case by simp  | 
| 
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
667  | 
next  | 
| 
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
668  | 
case (insert x A) thus ?case by (simp add: left_distrib)  | 
| 
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
669  | 
qed  | 
| 
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
670  | 
next  | 
| 
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
671  | 
case False thus ?thesis by (simp add: setsum_def)  | 
| 
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
672  | 
qed  | 
| 
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
673  | 
|
| 
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
674  | 
lemma setsum_divide_distrib:  | 
| 
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
675  | 
"setsum f A / (r::'a::field) = (\<Sum>n\<in>A. f n / r)"  | 
| 
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
676  | 
proof (cases "finite A")  | 
| 
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
677  | 
case True  | 
| 
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
678  | 
then show ?thesis  | 
| 
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
679  | 
proof induct  | 
| 
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
680  | 
case empty thus ?case by simp  | 
| 
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
681  | 
next  | 
| 
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
682  | 
case (insert x A) thus ?case by (simp add: add_divide_distrib)  | 
| 
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
683  | 
qed  | 
| 
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
684  | 
next  | 
| 
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
685  | 
case False thus ?thesis by (simp add: setsum_def)  | 
| 
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
686  | 
qed  | 
| 
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
687  | 
|
| 15535 | 688  | 
lemma setsum_abs[iff]:  | 
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34223 
diff
changeset
 | 
689  | 
  fixes f :: "'a => ('b::ordered_ab_group_add_abs)"
 | 
| 15402 | 690  | 
shows "abs (setsum f A) \<le> setsum (%i. abs(f i)) A"  | 
| 15535 | 691  | 
proof (cases "finite A")  | 
692  | 
case True  | 
|
693  | 
thus ?thesis  | 
|
| 21575 | 694  | 
proof induct  | 
| 15535 | 695  | 
case empty thus ?case by simp  | 
696  | 
next  | 
|
697  | 
case (insert x A)  | 
|
698  | 
thus ?case by (auto intro: abs_triangle_ineq order_trans)  | 
|
699  | 
qed  | 
|
| 15402 | 700  | 
next  | 
| 15535 | 701  | 
case False thus ?thesis by (simp add: setsum_def)  | 
| 15402 | 702  | 
qed  | 
703  | 
||
| 15535 | 704  | 
lemma setsum_abs_ge_zero[iff]:  | 
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34223 
diff
changeset
 | 
705  | 
  fixes f :: "'a => ('b::ordered_ab_group_add_abs)"
 | 
| 15402 | 706  | 
shows "0 \<le> setsum (%i. abs(f i)) A"  | 
| 15535 | 707  | 
proof (cases "finite A")  | 
708  | 
case True  | 
|
709  | 
thus ?thesis  | 
|
| 21575 | 710  | 
proof induct  | 
| 15535 | 711  | 
case empty thus ?case by simp  | 
712  | 
next  | 
|
| 
36977
 
71c8973a604b
declare add_nonneg_nonneg [simp]; remove now-redundant lemmas realpow_two_le_order(2)
 
huffman 
parents: 
36635 
diff
changeset
 | 
713  | 
case (insert x A) thus ?case by auto  | 
| 15535 | 714  | 
qed  | 
| 15402 | 715  | 
next  | 
| 15535 | 716  | 
case False thus ?thesis by (simp add: setsum_def)  | 
| 15402 | 717  | 
qed  | 
718  | 
||
| 15539 | 719  | 
lemma abs_setsum_abs[simp]:  | 
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34223 
diff
changeset
 | 
720  | 
  fixes f :: "'a => ('b::ordered_ab_group_add_abs)"
 | 
| 15539 | 721  | 
shows "abs (\<Sum>a\<in>A. abs(f a)) = (\<Sum>a\<in>A. abs(f a))"  | 
722  | 
proof (cases "finite A")  | 
|
723  | 
case True  | 
|
724  | 
thus ?thesis  | 
|
| 21575 | 725  | 
proof induct  | 
| 15539 | 726  | 
case empty thus ?case by simp  | 
727  | 
next  | 
|
728  | 
case (insert a A)  | 
|
729  | 
hence "\<bar>\<Sum>a\<in>insert a A. \<bar>f a\<bar>\<bar> = \<bar>\<bar>f a\<bar> + (\<Sum>a\<in>A. \<bar>f a\<bar>)\<bar>" by simp  | 
|
730  | 
also have "\<dots> = \<bar>\<bar>f a\<bar> + \<bar>\<Sum>a\<in>A. \<bar>f a\<bar>\<bar>\<bar>" using insert by simp  | 
|
| 
16775
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16760 
diff
changeset
 | 
731  | 
also have "\<dots> = \<bar>f a\<bar> + \<bar>\<Sum>a\<in>A. \<bar>f a\<bar>\<bar>"  | 
| 
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16760 
diff
changeset
 | 
732  | 
by (simp del: abs_of_nonneg)  | 
| 15539 | 733  | 
also have "\<dots> = (\<Sum>a\<in>insert a A. \<bar>f a\<bar>)" using insert by simp  | 
734  | 
finally show ?case .  | 
|
735  | 
qed  | 
|
736  | 
next  | 
|
737  | 
case False thus ?thesis by (simp add: setsum_def)  | 
|
738  | 
qed  | 
|
739  | 
||
| 31080 | 740  | 
lemma setsum_Plus:  | 
741  | 
fixes A :: "'a set" and B :: "'b set"  | 
|
742  | 
assumes fin: "finite A" "finite B"  | 
|
743  | 
shows "setsum f (A <+> B) = setsum (f \<circ> Inl) A + setsum (f \<circ> Inr) B"  | 
|
744  | 
proof -  | 
|
745  | 
have "A <+> B = Inl ` A \<union> Inr ` B" by auto  | 
|
746  | 
  moreover from fin have "finite (Inl ` A :: ('a + 'b) set)" "finite (Inr ` B :: ('a + 'b) set)"
 | 
|
| 
40786
 
0a54cfc9add3
gave more standard finite set rules simp and intro attribute
 
nipkow 
parents: 
39302 
diff
changeset
 | 
747  | 
by auto  | 
| 31080 | 748  | 
  moreover have "Inl ` A \<inter> Inr ` B = ({} :: ('a + 'b) set)" by auto
 | 
749  | 
moreover have "inj_on (Inl :: 'a \<Rightarrow> 'a + 'b) A" "inj_on (Inr :: 'b \<Rightarrow> 'a + 'b) B" by(auto intro: inj_onI)  | 
|
750  | 
ultimately show ?thesis using fin by(simp add: setsum_Un_disjoint setsum_reindex)  | 
|
751  | 
qed  | 
|
752  | 
||
753  | 
||
| 
17149
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
754  | 
text {* Commuting outer and inner summation *}
 | 
| 
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
755  | 
|
| 
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
756  | 
lemma setsum_commute:  | 
| 
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
757  | 
"(\<Sum>i\<in>A. \<Sum>j\<in>B. f i j) = (\<Sum>j\<in>B. \<Sum>i\<in>A. f i j)"  | 
| 
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
758  | 
proof (simp add: setsum_cartesian_product)  | 
| 17189 | 759  | 
have "(\<Sum>(x,y) \<in> A <*> B. f x y) =  | 
760  | 
(\<Sum>(y,x) \<in> (%(i, j). (j, i)) ` (A \<times> B). f x y)"  | 
|
| 
17149
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
761  | 
(is "?s = _")  | 
| 
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
762  | 
apply (simp add: setsum_reindex [where f = "%(i, j). (j, i)"] swap_inj_on)  | 
| 
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
763  | 
apply (simp add: split_def)  | 
| 
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
764  | 
done  | 
| 17189 | 765  | 
also have "... = (\<Sum>(y,x)\<in>B \<times> A. f x y)"  | 
| 
17149
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
766  | 
(is "_ = ?t")  | 
| 
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
767  | 
apply (simp add: swap_product)  | 
| 
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
768  | 
done  | 
| 
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
769  | 
finally show "?s = ?t" .  | 
| 
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
770  | 
qed  | 
| 
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
771  | 
|
| 19279 | 772  | 
lemma setsum_product:  | 
| 
22934
 
64ecb3d6790a
generalize setsum lemmas from semiring_0_cancel to semiring_0
 
huffman 
parents: 
22917 
diff
changeset
 | 
773  | 
  fixes f :: "'a => ('b::semiring_0)"
 | 
| 19279 | 774  | 
shows "setsum f A * setsum g B = (\<Sum>i\<in>A. \<Sum>j\<in>B. f i * g j)"  | 
775  | 
by (simp add: setsum_right_distrib setsum_left_distrib) (rule setsum_commute)  | 
|
776  | 
||
| 34223 | 777  | 
lemma setsum_mult_setsum_if_inj:  | 
778  | 
fixes f :: "'a => ('b::semiring_0)"
 | 
|
779  | 
shows "inj_on (%(a,b). f a * g b) (A \<times> B) ==>  | 
|
780  | 
  setsum f A * setsum g B = setsum id {f a * g b|a b. a:A & b:B}"
 | 
|
781  | 
by(auto simp: setsum_product setsum_cartesian_product  | 
|
782  | 
intro!: setsum_reindex_cong[symmetric])  | 
|
783  | 
||
| 
35722
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
784  | 
lemma setsum_constant [simp]: "(\<Sum>x \<in> A. y) = of_nat(card A) * y"  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
785  | 
apply (cases "finite A")  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
786  | 
apply (erule finite_induct)  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
787  | 
apply (auto simp add: algebra_simps)  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
788  | 
done  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
789  | 
|
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
790  | 
lemma setsum_bounded:  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
791  | 
  assumes le: "\<And>i. i\<in>A \<Longrightarrow> f i \<le> (K::'a::{semiring_1, ordered_ab_semigroup_add})"
 | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
792  | 
shows "setsum f A \<le> of_nat(card A) * K"  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
793  | 
proof (cases "finite A")  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
794  | 
case True  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
795  | 
thus ?thesis using le setsum_mono[where K=A and g = "%x. K"] by simp  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
796  | 
next  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
797  | 
case False thus ?thesis by (simp add: setsum_def)  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
798  | 
qed  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
799  | 
|
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
800  | 
|
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
801  | 
subsubsection {* Cardinality as special case of @{const setsum} *}
 | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
802  | 
|
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
803  | 
lemma card_eq_setsum:  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
804  | 
"card A = setsum (\<lambda>x. 1) A"  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
805  | 
by (simp only: card_def setsum_def)  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
806  | 
|
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
807  | 
lemma card_UN_disjoint:  | 
| 46629 | 808  | 
assumes "finite I" and "\<forall>i\<in>I. finite (A i)"  | 
809  | 
    and "\<forall>i\<in>I. \<forall>j\<in>I. i \<noteq> j \<longrightarrow> A i \<inter> A j = {}"
 | 
|
810  | 
shows "card (UNION I A) = (\<Sum>i\<in>I. card(A i))"  | 
|
811  | 
proof -  | 
|
812  | 
have "(\<Sum>i\<in>I. card (A i)) = (\<Sum>i\<in>I. \<Sum>x\<in>A i. 1)" by simp  | 
|
813  | 
with assms show ?thesis by (simp add: card_eq_setsum setsum_UN_disjoint del: setsum_constant)  | 
|
814  | 
qed  | 
|
| 
35722
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
815  | 
|
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
816  | 
lemma card_Union_disjoint:  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
817  | 
"finite C ==> (ALL A:C. finite A) ==>  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
818  | 
   (ALL A:C. ALL B:C. A \<noteq> B --> A Int B = {})
 | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
819  | 
==> card (Union C) = setsum card C"  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
820  | 
apply (frule card_UN_disjoint [of C id])  | 
| 
44937
 
22c0857b8aab
removed further legacy rules from Complete_Lattices
 
hoelzl 
parents: 
44921 
diff
changeset
 | 
821  | 
apply (simp_all add: SUP_def id_def)  | 
| 
35722
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
822  | 
done  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
823  | 
|
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
824  | 
text{*The image of a finite set can be expressed using @{term fold_image}.*}
 | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
825  | 
lemma image_eq_fold_image:  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
826  | 
  "finite A ==> f ` A = fold_image (op Un) (%x. {f x}) {} A"
 | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
827  | 
proof (induct rule: finite_induct)  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
828  | 
case empty then show ?case by simp  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
829  | 
next  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
830  | 
interpret ab_semigroup_mult "op Un"  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
831  | 
proof qed auto  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
832  | 
case insert  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
833  | 
then show ?case by simp  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
834  | 
qed  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
835  | 
|
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
836  | 
subsubsection {* Cardinality of products *}
 | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
837  | 
|
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
838  | 
lemma card_SigmaI [simp]:  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
839  | 
"\<lbrakk> finite A; ALL a:A. finite (B a) \<rbrakk>  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
840  | 
\<Longrightarrow> card (SIGMA x: A. B x) = (\<Sum>a\<in>A. card (B a))"  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
841  | 
by(simp add: card_eq_setsum setsum_Sigma del:setsum_constant)  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
842  | 
|
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
843  | 
(*  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
844  | 
lemma SigmaI_insert: "y \<notin> A ==>  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
845  | 
  (SIGMA x:(insert y A). B x) = (({y} <*> (B y)) \<union> (SIGMA x: A. B x))"
 | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
846  | 
by auto  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
847  | 
*)  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
848  | 
|
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
849  | 
lemma card_cartesian_product: "card (A <*> B) = card(A) * card(B)"  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
850  | 
by (cases "finite A \<and> finite B")  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
851  | 
(auto simp add: card_eq_0_iff dest: finite_cartesian_productD1 finite_cartesian_productD2)  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
852  | 
|
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
853  | 
lemma card_cartesian_product_singleton:  "card({x} <*> A) = card(A)"
 | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
854  | 
by (simp add: card_cartesian_product)  | 
| 
 
69419a09a7ff
moved cardinality to Finite_Set as far as appropriate; added locales for fold_image
 
haftmann 
parents: 
35719 
diff
changeset
 | 
855  | 
|
| 
17149
 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 
ballarin 
parents: 
17085 
diff
changeset
 | 
856  | 
|
| 15402 | 857  | 
subsection {* Generalized product over a set *}
 | 
858  | 
||
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
859  | 
definition (in comm_monoid_mult) setprod :: "('b \<Rightarrow> 'a) => 'b set => 'a" where
 | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
860  | 
"setprod f A = (if finite A then fold_image (op *) f 1 A else 1)"  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
861  | 
|
| 
35938
 
93faaa15c3d5
sublocale comm_monoid_add < setprod --> sublocale comm_monoid_mult < setprod
 
huffman 
parents: 
35831 
diff
changeset
 | 
862  | 
sublocale comm_monoid_mult < setprod!: comm_monoid_big "op *" 1 setprod proof  | 
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
863  | 
qed (fact setprod_def)  | 
| 15402 | 864  | 
|
| 19535 | 865  | 
abbreviation  | 
| 
21404
 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 
wenzelm 
parents: 
21249 
diff
changeset
 | 
866  | 
  Setprod  ("\<Prod>_" [1000] 999) where
 | 
| 19535 | 867  | 
"\<Prod>A == setprod (%x. x) A"  | 
868  | 
||
| 15402 | 869  | 
syntax  | 
| 17189 | 870  | 
  "_setprod" :: "pttrn => 'a set => 'b => 'b::comm_monoid_mult"  ("(3PROD _:_. _)" [0, 51, 10] 10)
 | 
| 15402 | 871  | 
syntax (xsymbols)  | 
| 17189 | 872  | 
  "_setprod" :: "pttrn => 'a set => 'b => 'b::comm_monoid_mult"  ("(3\<Prod>_\<in>_. _)" [0, 51, 10] 10)
 | 
| 15402 | 873  | 
syntax (HTML output)  | 
| 17189 | 874  | 
  "_setprod" :: "pttrn => 'a set => 'b => 'b::comm_monoid_mult"  ("(3\<Prod>_\<in>_. _)" [0, 51, 10] 10)
 | 
| 16550 | 875  | 
|
876  | 
translations -- {* Beware of argument permutation! *}
 | 
|
| 
28853
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
877  | 
"PROD i:A. b" == "CONST setprod (%i. b) A"  | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
878  | 
"\<Prod>i\<in>A. b" == "CONST setprod (%i. b) A"  | 
| 16550 | 879  | 
|
880  | 
text{* Instead of @{term"\<Prod>x\<in>{x. P}. e"} we introduce the shorter
 | 
|
881  | 
 @{text"\<Prod>x|P. e"}. *}
 | 
|
882  | 
||
883  | 
syntax  | 
|
| 17189 | 884  | 
  "_qsetprod" :: "pttrn \<Rightarrow> bool \<Rightarrow> 'a \<Rightarrow> 'a" ("(3PROD _ |/ _./ _)" [0,0,10] 10)
 | 
| 16550 | 885  | 
syntax (xsymbols)  | 
| 17189 | 886  | 
  "_qsetprod" :: "pttrn \<Rightarrow> bool \<Rightarrow> 'a \<Rightarrow> 'a" ("(3\<Prod>_ | (_)./ _)" [0,0,10] 10)
 | 
| 16550 | 887  | 
syntax (HTML output)  | 
| 17189 | 888  | 
  "_qsetprod" :: "pttrn \<Rightarrow> bool \<Rightarrow> 'a \<Rightarrow> 'a" ("(3\<Prod>_ | (_)./ _)" [0,0,10] 10)
 | 
| 16550 | 889  | 
|
| 15402 | 890  | 
translations  | 
| 
28853
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
891  | 
  "PROD x|P. t" => "CONST setprod (%x. t) {x. P}"
 | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
892  | 
  "\<Prod>x|P. t" => "CONST setprod (%x. t) {x. P}"
 | 
| 16550 | 893  | 
|
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
894  | 
lemma setprod_empty: "setprod f {} = 1"
 | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
895  | 
by (fact setprod.empty)  | 
| 15402 | 896  | 
|
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
897  | 
lemma setprod_insert: "[| finite A; a \<notin> A |] ==>  | 
| 15402 | 898  | 
setprod f (insert a A) = f a * setprod f A"  | 
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
899  | 
by (fact setprod.insert)  | 
| 15402 | 900  | 
|
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
901  | 
lemma setprod_infinite: "~ finite A ==> setprod f A = 1"  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
902  | 
by (fact setprod.infinite)  | 
| 
15409
 
a063687d24eb
new and stronger lemmas and improved simplification for finite sets
 
paulson 
parents: 
15402 
diff
changeset
 | 
903  | 
|
| 15402 | 904  | 
lemma setprod_reindex:  | 
| 
28853
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
905  | 
"inj_on f B ==> setprod h (f ` B) = setprod (h \<circ> f) B"  | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
906  | 
by(auto simp: setprod_def fold_image_reindex dest!:finite_imageD)  | 
| 15402 | 907  | 
|
908  | 
lemma setprod_reindex_id: "inj_on f B ==> setprod f B = setprod id (f ` B)"  | 
|
909  | 
by (auto simp add: setprod_reindex)  | 
|
910  | 
||
911  | 
lemma setprod_cong:  | 
|
912  | 
"A = B ==> (!!x. x:B ==> f x = g x) ==> setprod f A = setprod g B"  | 
|
| 
44890
 
22f665a2e91c
new fastforce replacing fastsimp - less confusing name
 
nipkow 
parents: 
44845 
diff
changeset
 | 
913  | 
by(fastforce simp: setprod_def intro: fold_image_cong)  | 
| 15402 | 914  | 
|
| 
30837
 
3d4832d9f7e4
added strong_setprod_cong[cong] (in analogy with setsum)
 
nipkow 
parents: 
30729 
diff
changeset
 | 
915  | 
lemma strong_setprod_cong[cong]:  | 
| 
16632
 
ad2895beef79
Added strong_setsum_cong and strong_setprod_cong.
 
berghofe 
parents: 
16550 
diff
changeset
 | 
916  | 
"A = B ==> (!!x. x:B =simp=> f x = g x) ==> setprod f A = setprod g B"  | 
| 
44890
 
22f665a2e91c
new fastforce replacing fastsimp - less confusing name
 
nipkow 
parents: 
44845 
diff
changeset
 | 
917  | 
by(fastforce simp: simp_implies_def setprod_def intro: fold_image_cong)  | 
| 
16632
 
ad2895beef79
Added strong_setsum_cong and strong_setprod_cong.
 
berghofe 
parents: 
16550 
diff
changeset
 | 
918  | 
|
| 15402 | 919  | 
lemma setprod_reindex_cong: "inj_on f A ==>  | 
920  | 
B = f ` A ==> g = h \<circ> f ==> setprod h B = setprod g A"  | 
|
| 
28853
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
921  | 
by (frule setprod_reindex, simp)  | 
| 15402 | 922  | 
|
| 
29674
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
923  | 
lemma strong_setprod_reindex_cong: assumes i: "inj_on f A"  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
924  | 
and B: "B = f ` A" and eq: "\<And>x. x \<in> A \<Longrightarrow> g x = (h \<circ> f) x"  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
925  | 
shows "setprod h B = setprod g A"  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
926  | 
proof-  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
927  | 
have "setprod h B = setprod (h o f) A"  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
928  | 
by (simp add: B setprod_reindex[OF i, of h])  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
929  | 
then show ?thesis apply simp  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
930  | 
apply (rule setprod_cong)  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
931  | 
apply simp  | 
| 
30837
 
3d4832d9f7e4
added strong_setprod_cong[cong] (in analogy with setsum)
 
nipkow 
parents: 
30729 
diff
changeset
 | 
932  | 
by (simp add: eq)  | 
| 
29674
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
933  | 
qed  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
934  | 
|
| 
30260
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
935  | 
lemma setprod_Un_one:  | 
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
936  | 
assumes fS: "finite S" and fT: "finite T"  | 
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
937  | 
and I0: "\<forall>x \<in> S\<inter>T. f x = 1"  | 
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
938  | 
shows "setprod f (S \<union> T) = setprod f S * setprod f T"  | 
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
939  | 
using fS fT  | 
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
940  | 
apply (simp add: setprod_def)  | 
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
941  | 
apply (rule fold_image_Un_one)  | 
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
942  | 
using I0 by auto  | 
| 
 
be39acd3ac85
Added general theorems for fold_image, setsum and set_prod
 
chaieb 
parents: 
29966 
diff
changeset
 | 
943  | 
|
| 15402 | 944  | 
|
945  | 
lemma setprod_1: "setprod (%i. 1) A = 1"  | 
|
| 
28853
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
946  | 
apply (case_tac "finite A")  | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
947  | 
apply (erule finite_induct, auto simp add: mult_ac)  | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
948  | 
done  | 
| 15402 | 949  | 
|
950  | 
lemma setprod_1': "ALL a:F. f a = 1 ==> setprod f F = 1"  | 
|
| 
28853
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
951  | 
apply (subgoal_tac "setprod f F = setprod (%x. 1) F")  | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
952  | 
apply (erule ssubst, rule setprod_1)  | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
953  | 
apply (rule setprod_cong, auto)  | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
954  | 
done  | 
| 15402 | 955  | 
|
956  | 
lemma setprod_Un_Int: "finite A ==> finite B  | 
|
957  | 
==> setprod g (A Un B) * setprod g (A Int B) = setprod g A * setprod g B"  | 
|
| 
28853
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
958  | 
by(simp add: setprod_def fold_image_Un_Int[symmetric])  | 
| 15402 | 959  | 
|
960  | 
lemma setprod_Un_disjoint: "finite A ==> finite B  | 
|
961  | 
  ==> A Int B = {} ==> setprod g (A Un B) = setprod g A * setprod g B"
 | 
|
962  | 
by (subst setprod_Un_Int [symmetric], auto)  | 
|
963  | 
||
| 
30837
 
3d4832d9f7e4
added strong_setprod_cong[cong] (in analogy with setsum)
 
nipkow 
parents: 
30729 
diff
changeset
 | 
964  | 
lemma setprod_mono_one_left:  | 
| 
 
3d4832d9f7e4
added strong_setprod_cong[cong] (in analogy with setsum)
 
nipkow 
parents: 
30729 
diff
changeset
 | 
965  | 
assumes fT: "finite T" and ST: "S \<subseteq> T"  | 
| 
 
3d4832d9f7e4
added strong_setprod_cong[cong] (in analogy with setsum)
 
nipkow 
parents: 
30729 
diff
changeset
 | 
966  | 
and z: "\<forall>i \<in> T - S. f i = 1"  | 
| 
 
3d4832d9f7e4
added strong_setprod_cong[cong] (in analogy with setsum)
 
nipkow 
parents: 
30729 
diff
changeset
 | 
967  | 
shows "setprod f S = setprod f T"  | 
| 
 
3d4832d9f7e4
added strong_setprod_cong[cong] (in analogy with setsum)
 
nipkow 
parents: 
30729 
diff
changeset
 | 
968  | 
proof-  | 
| 
 
3d4832d9f7e4
added strong_setprod_cong[cong] (in analogy with setsum)
 
nipkow 
parents: 
30729 
diff
changeset
 | 
969  | 
have eq: "T = S \<union> (T - S)" using ST by blast  | 
| 
 
3d4832d9f7e4
added strong_setprod_cong[cong] (in analogy with setsum)
 
nipkow 
parents: 
30729 
diff
changeset
 | 
970  | 
  have d: "S \<inter> (T - S) = {}" using ST by blast
 | 
| 
 
3d4832d9f7e4
added strong_setprod_cong[cong] (in analogy with setsum)
 
nipkow 
parents: 
30729 
diff
changeset
 | 
971  | 
from fT ST have f: "finite S" "finite (T - S)" by (auto intro: finite_subset)  | 
| 
 
3d4832d9f7e4
added strong_setprod_cong[cong] (in analogy with setsum)
 
nipkow 
parents: 
30729 
diff
changeset
 | 
972  | 
show ?thesis  | 
| 
 
3d4832d9f7e4
added strong_setprod_cong[cong] (in analogy with setsum)
 
nipkow 
parents: 
30729 
diff
changeset
 | 
973  | 
by (simp add: setprod_Un_disjoint[OF f d, unfolded eq[symmetric]] setprod_1'[OF z])  | 
| 
 
3d4832d9f7e4
added strong_setprod_cong[cong] (in analogy with setsum)
 
nipkow 
parents: 
30729 
diff
changeset
 | 
974  | 
qed  | 
| 
 
3d4832d9f7e4
added strong_setprod_cong[cong] (in analogy with setsum)
 
nipkow 
parents: 
30729 
diff
changeset
 | 
975  | 
|
| 
 
3d4832d9f7e4
added strong_setprod_cong[cong] (in analogy with setsum)
 
nipkow 
parents: 
30729 
diff
changeset
 | 
976  | 
lemmas setprod_mono_one_right = setprod_mono_one_left [THEN sym]  | 
| 
 
3d4832d9f7e4
added strong_setprod_cong[cong] (in analogy with setsum)
 
nipkow 
parents: 
30729 
diff
changeset
 | 
977  | 
|
| 
29674
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
978  | 
lemma setprod_delta:  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
979  | 
assumes fS: "finite S"  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
980  | 
shows "setprod (\<lambda>k. if k=a then b k else 1) S = (if a \<in> S then b a else 1)"  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
981  | 
proof-  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
982  | 
let ?f = "(\<lambda>k. if k=a then b k else 1)"  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
983  | 
  {assume a: "a \<notin> S"
 | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
984  | 
hence "\<forall> k\<in> S. ?f k = 1" by simp  | 
| 41550 | 985  | 
hence ?thesis using a by (simp add: setprod_1) }  | 
| 
29674
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
986  | 
moreover  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
987  | 
  {assume a: "a \<in> S"
 | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
988  | 
    let ?A = "S - {a}"
 | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
989  | 
    let ?B = "{a}"
 | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
990  | 
have eq: "S = ?A \<union> ?B" using a by blast  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
991  | 
    have dj: "?A \<inter> ?B = {}" by simp
 | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
992  | 
from fS have fAB: "finite ?A" "finite ?B" by auto  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
993  | 
have fA1: "setprod ?f ?A = 1" apply (rule setprod_1') by auto  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
994  | 
have "setprod ?f ?A * setprod ?f ?B = setprod ?f S"  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
995  | 
using setprod_Un_disjoint[OF fAB dj, of ?f, unfolded eq[symmetric]]  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
996  | 
by simp  | 
| 41550 | 997  | 
then have ?thesis using a by (simp add: fA1 cong: setprod_cong cong del: if_weak_cong)}  | 
| 
29674
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
998  | 
ultimately show ?thesis by blast  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
999  | 
qed  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
1000  | 
|
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
1001  | 
lemma setprod_delta':  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
1002  | 
assumes fS: "finite S" shows  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
1003  | 
"setprod (\<lambda>k. if a = k then b k else 1) S =  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
1004  | 
(if a\<in> S then b a else 1)"  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
1005  | 
using setprod_delta[OF fS, of a b, symmetric]  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
1006  | 
by (auto intro: setprod_cong)  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
1007  | 
|
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
1008  | 
|
| 15402 | 1009  | 
lemma setprod_UN_disjoint:  | 
1010  | 
"finite I ==> (ALL i:I. finite (A i)) ==>  | 
|
1011  | 
        (ALL i:I. ALL j:I. i \<noteq> j --> A i Int A j = {}) ==>
 | 
|
1012  | 
setprod f (UNION I A) = setprod (%i. setprod f (A i)) I"  | 
|
| 41550 | 1013  | 
by (simp add: setprod_def fold_image_UN_disjoint)  | 
| 15402 | 1014  | 
|
1015  | 
lemma setprod_Union_disjoint:  | 
|
| 
44937
 
22c0857b8aab
removed further legacy rules from Complete_Lattices
 
hoelzl 
parents: 
44921 
diff
changeset
 | 
1016  | 
  assumes "\<forall>A\<in>C. finite A" "\<forall>A\<in>C. \<forall>B\<in>C. A \<noteq> B \<longrightarrow> A Int B = {}" 
 | 
| 
 
22c0857b8aab
removed further legacy rules from Complete_Lattices
 
hoelzl 
parents: 
44921 
diff
changeset
 | 
1017  | 
shows "setprod f (Union C) = setprod (setprod f) C"  | 
| 
 
22c0857b8aab
removed further legacy rules from Complete_Lattices
 
hoelzl 
parents: 
44921 
diff
changeset
 | 
1018  | 
proof cases  | 
| 
 
22c0857b8aab
removed further legacy rules from Complete_Lattices
 
hoelzl 
parents: 
44921 
diff
changeset
 | 
1019  | 
assume "finite C"  | 
| 
 
22c0857b8aab
removed further legacy rules from Complete_Lattices
 
hoelzl 
parents: 
44921 
diff
changeset
 | 
1020  | 
from setprod_UN_disjoint[OF this assms]  | 
| 
 
22c0857b8aab
removed further legacy rules from Complete_Lattices
 
hoelzl 
parents: 
44921 
diff
changeset
 | 
1021  | 
show ?thesis  | 
| 
 
22c0857b8aab
removed further legacy rules from Complete_Lattices
 
hoelzl 
parents: 
44921 
diff
changeset
 | 
1022  | 
by (simp add: SUP_def)  | 
| 
 
22c0857b8aab
removed further legacy rules from Complete_Lattices
 
hoelzl 
parents: 
44921 
diff
changeset
 | 
1023  | 
qed (force dest: finite_UnionD simp add: setprod_def)  | 
| 15402 | 1024  | 
|
1025  | 
lemma setprod_Sigma: "finite A ==> ALL x:A. finite (B x) ==>  | 
|
| 16550 | 1026  | 
(\<Prod>x\<in>A. (\<Prod>y\<in> B x. f x y)) =  | 
| 17189 | 1027  | 
(\<Prod>(x,y)\<in>(SIGMA x:A. B x). f x y)"  | 
| 41550 | 1028  | 
by(simp add:setprod_def fold_image_Sigma split_def)  | 
| 15402 | 1029  | 
|
| 
15409
 
a063687d24eb
new and stronger lemmas and improved simplification for finite sets
 
paulson 
parents: 
15402 
diff
changeset
 | 
1030  | 
text{*Here we can eliminate the finiteness assumptions, by cases.*}
 | 
| 
 
a063687d24eb
new and stronger lemmas and improved simplification for finite sets
 
paulson 
parents: 
15402 
diff
changeset
 | 
1031  | 
lemma setprod_cartesian_product:  | 
| 17189 | 1032  | 
"(\<Prod>x\<in>A. (\<Prod>y\<in> B. f x y)) = (\<Prod>(x,y)\<in>(A <*> B). f x y)"  | 
| 
15409
 
a063687d24eb
new and stronger lemmas and improved simplification for finite sets
 
paulson 
parents: 
15402 
diff
changeset
 | 
1033  | 
apply (cases "finite A")  | 
| 
 
a063687d24eb
new and stronger lemmas and improved simplification for finite sets
 
paulson 
parents: 
15402 
diff
changeset
 | 
1034  | 
apply (cases "finite B")  | 
| 
 
a063687d24eb
new and stronger lemmas and improved simplification for finite sets
 
paulson 
parents: 
15402 
diff
changeset
 | 
1035  | 
apply (simp add: setprod_Sigma)  | 
| 
 
a063687d24eb
new and stronger lemmas and improved simplification for finite sets
 
paulson 
parents: 
15402 
diff
changeset
 | 
1036  | 
 apply (cases "A={}", simp)
 | 
| 
 
a063687d24eb
new and stronger lemmas and improved simplification for finite sets
 
paulson 
parents: 
15402 
diff
changeset
 | 
1037  | 
apply (simp add: setprod_1)  | 
| 
 
a063687d24eb
new and stronger lemmas and improved simplification for finite sets
 
paulson 
parents: 
15402 
diff
changeset
 | 
1038  | 
apply (auto simp add: setprod_def  | 
| 
 
a063687d24eb
new and stronger lemmas and improved simplification for finite sets
 
paulson 
parents: 
15402 
diff
changeset
 | 
1039  | 
dest: finite_cartesian_productD1 finite_cartesian_productD2)  | 
| 
 
a063687d24eb
new and stronger lemmas and improved simplification for finite sets
 
paulson 
parents: 
15402 
diff
changeset
 | 
1040  | 
done  | 
| 15402 | 1041  | 
|
1042  | 
lemma setprod_timesf:  | 
|
| 
15409
 
a063687d24eb
new and stronger lemmas and improved simplification for finite sets
 
paulson 
parents: 
15402 
diff
changeset
 | 
1043  | 
"setprod (%x. f x * g x) A = (setprod f A * setprod g A)"  | 
| 
28853
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
1044  | 
by(simp add:setprod_def fold_image_distrib)  | 
| 15402 | 1045  | 
|
1046  | 
||
1047  | 
subsubsection {* Properties in more restricted classes of structures *}
 | 
|
1048  | 
||
1049  | 
lemma setprod_eq_1_iff [simp]:  | 
|
| 
28853
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
1050  | 
"finite F ==> (setprod f F = 1) = (ALL a:F. f a = (1::nat))"  | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
1051  | 
by (induct set: finite) auto  | 
| 15402 | 1052  | 
|
1053  | 
lemma setprod_zero:  | 
|
| 23277 | 1054  | 
"finite A ==> EX x: A. f x = (0::'a::comm_semiring_1) ==> setprod f A = 0"  | 
| 
28853
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
1055  | 
apply (induct set: finite, force, clarsimp)  | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
1056  | 
apply (erule disjE, auto)  | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
1057  | 
done  | 
| 15402 | 1058  | 
|
1059  | 
lemma setprod_nonneg [rule_format]:  | 
|
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34223 
diff
changeset
 | 
1060  | 
"(ALL x: A. (0::'a::linordered_semidom) \<le> f x) --> 0 \<le> setprod f A"  | 
| 
30841
 
0813afc97522
generalized setprod_nonneg and setprod_pos to ordered_semidom, simplified proofs
 
huffman 
parents: 
30729 
diff
changeset
 | 
1061  | 
by (cases "finite A", induct set: finite, simp_all add: mult_nonneg_nonneg)  | 
| 
 
0813afc97522
generalized setprod_nonneg and setprod_pos to ordered_semidom, simplified proofs
 
huffman 
parents: 
30729 
diff
changeset
 | 
1062  | 
|
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34223 
diff
changeset
 | 
1063  | 
lemma setprod_pos [rule_format]: "(ALL x: A. (0::'a::linordered_semidom) < f x)  | 
| 
28853
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
1064  | 
--> 0 < setprod f A"  | 
| 
30841
 
0813afc97522
generalized setprod_nonneg and setprod_pos to ordered_semidom, simplified proofs
 
huffman 
parents: 
30729 
diff
changeset
 | 
1065  | 
by (cases "finite A", induct set: finite, simp_all add: mult_pos_pos)  | 
| 15402 | 1066  | 
|
| 30843 | 1067  | 
lemma setprod_zero_iff[simp]: "finite A ==>  | 
1068  | 
  (setprod f A = (0::'a::{comm_semiring_1,no_zero_divisors})) =
 | 
|
1069  | 
(EX x: A. f x = 0)"  | 
|
1070  | 
by (erule finite_induct, auto simp:no_zero_divisors)  | 
|
1071  | 
||
1072  | 
lemma setprod_pos_nat:  | 
|
1073  | 
"finite S ==> (ALL x : S. f x > (0::nat)) ==> setprod f S > 0"  | 
|
1074  | 
using setprod_zero_iff by(simp del:neq0_conv add:neq0_conv[symmetric])  | 
|
| 15402 | 1075  | 
|
| 30863 | 1076  | 
lemma setprod_pos_nat_iff[simp]:  | 
1077  | 
"finite S ==> (setprod f S > 0) = (ALL x : S. f x > (0::nat))"  | 
|
1078  | 
using setprod_zero_iff by(simp del:neq0_conv add:neq0_conv[symmetric])  | 
|
1079  | 
||
| 15402 | 1080  | 
lemma setprod_Un: "finite A ==> finite B ==> (ALL x: A Int B. f x \<noteq> 0) ==>  | 
| 
28853
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
1081  | 
  (setprod f (A Un B) :: 'a ::{field})
 | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
1082  | 
= setprod f A * setprod f B / setprod f (A Int B)"  | 
| 30843 | 1083  | 
by (subst setprod_Un_Int [symmetric], auto)  | 
| 15402 | 1084  | 
|
1085  | 
lemma setprod_diff1: "finite A ==> f a \<noteq> 0 ==>  | 
|
| 
28853
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
1086  | 
  (setprod f (A - {a}) :: 'a :: {field}) =
 | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
1087  | 
(if a:A then setprod f A / f a else setprod f A)"  | 
| 36303 | 1088  | 
by (erule finite_induct) (auto simp add: insert_Diff_if)  | 
| 15402 | 1089  | 
|
| 
31906
 
b41d61c768e2
Removed unnecessary conditions concerning nonzero divisors
 
paulson 
parents: 
31465 
diff
changeset
 | 
1090  | 
lemma setprod_inversef:  | 
| 36409 | 1091  | 
fixes f :: "'b \<Rightarrow> 'a::field_inverse_zero"  | 
| 
31906
 
b41d61c768e2
Removed unnecessary conditions concerning nonzero divisors
 
paulson 
parents: 
31465 
diff
changeset
 | 
1092  | 
shows "finite A ==> setprod (inverse \<circ> f) A = inverse (setprod f A)"  | 
| 
28853
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
1093  | 
by (erule finite_induct) auto  | 
| 15402 | 1094  | 
|
1095  | 
lemma setprod_dividef:  | 
|
| 36409 | 1096  | 
fixes f :: "'b \<Rightarrow> 'a::field_inverse_zero"  | 
| 
31916
 
f3227bb306a4
recovered subscripts, which were lost in b41d61c768e2 (due to Emacs accident?);
 
wenzelm 
parents: 
31907 
diff
changeset
 | 
1097  | 
shows "finite A  | 
| 
28853
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
1098  | 
==> setprod (%x. f x / g x) A = setprod f A / setprod g A"  | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
1099  | 
apply (subgoal_tac  | 
| 15402 | 1100  | 
"setprod (%x. f x / g x) A = setprod (%x. f x * (inverse \<circ> g) x) A")  | 
| 
28853
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
1101  | 
apply (erule ssubst)  | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
1102  | 
apply (subst divide_inverse)  | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
1103  | 
apply (subst setprod_timesf)  | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
1104  | 
apply (subst setprod_inversef, assumption+, rule refl)  | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
1105  | 
apply (rule setprod_cong, rule refl)  | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
1106  | 
apply (subst divide_inverse, auto)  | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
1107  | 
done  | 
| 
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
1108  | 
|
| 29925 | 1109  | 
lemma setprod_dvd_setprod [rule_format]:  | 
1110  | 
"(ALL x : A. f x dvd g x) \<longrightarrow> setprod f A dvd setprod g A"  | 
|
1111  | 
apply (cases "finite A")  | 
|
1112  | 
apply (induct set: finite)  | 
|
1113  | 
apply (auto simp add: dvd_def)  | 
|
1114  | 
apply (rule_tac x = "k * ka" in exI)  | 
|
1115  | 
apply (simp add: algebra_simps)  | 
|
1116  | 
done  | 
|
1117  | 
||
1118  | 
lemma setprod_dvd_setprod_subset:  | 
|
1119  | 
"finite B \<Longrightarrow> A <= B \<Longrightarrow> setprod f A dvd setprod f B"  | 
|
1120  | 
apply (subgoal_tac "setprod f B = setprod f A * setprod f (B - A)")  | 
|
1121  | 
apply (unfold dvd_def, blast)  | 
|
1122  | 
apply (subst setprod_Un_disjoint [symmetric])  | 
|
1123  | 
apply (auto elim: finite_subset intro: setprod_cong)  | 
|
1124  | 
done  | 
|
1125  | 
||
1126  | 
lemma setprod_dvd_setprod_subset2:  | 
|
1127  | 
"finite B \<Longrightarrow> A <= B \<Longrightarrow> ALL x : A. (f x::'a::comm_semiring_1) dvd g x \<Longrightarrow>  | 
|
1128  | 
setprod f A dvd setprod g B"  | 
|
1129  | 
apply (rule dvd_trans)  | 
|
1130  | 
apply (rule setprod_dvd_setprod, erule (1) bspec)  | 
|
1131  | 
apply (erule (1) setprod_dvd_setprod_subset)  | 
|
1132  | 
done  | 
|
1133  | 
||
1134  | 
lemma dvd_setprod: "finite A \<Longrightarrow> i:A \<Longrightarrow>  | 
|
1135  | 
(f i ::'a::comm_semiring_1) dvd setprod f A"  | 
|
1136  | 
by (induct set: finite) (auto intro: dvd_mult)  | 
|
1137  | 
||
1138  | 
lemma dvd_setsum [rule_format]: "(ALL i : A. d dvd f i) \<longrightarrow>  | 
|
1139  | 
(d::'a::comm_semiring_1) dvd (SUM x : A. f x)"  | 
|
1140  | 
apply (cases "finite A")  | 
|
1141  | 
apply (induct set: finite)  | 
|
1142  | 
apply auto  | 
|
1143  | 
done  | 
|
1144  | 
||
| 
35171
 
28f824c7addc
Moved setprod_mono, abs_setprod and setsum_le_included to the Main image. Is used in Multivariate_Analysis.
 
hoelzl 
parents: 
35115 
diff
changeset
 | 
1145  | 
lemma setprod_mono:  | 
| 
 
28f824c7addc
Moved setprod_mono, abs_setprod and setsum_le_included to the Main image. Is used in Multivariate_Analysis.
 
hoelzl 
parents: 
35115 
diff
changeset
 | 
1146  | 
fixes f :: "'a \<Rightarrow> 'b\<Colon>linordered_semidom"  | 
| 
 
28f824c7addc
Moved setprod_mono, abs_setprod and setsum_le_included to the Main image. Is used in Multivariate_Analysis.
 
hoelzl 
parents: 
35115 
diff
changeset
 | 
1147  | 
assumes "\<forall>i\<in>A. 0 \<le> f i \<and> f i \<le> g i"  | 
| 
 
28f824c7addc
Moved setprod_mono, abs_setprod and setsum_le_included to the Main image. Is used in Multivariate_Analysis.
 
hoelzl 
parents: 
35115 
diff
changeset
 | 
1148  | 
shows "setprod f A \<le> setprod g A"  | 
| 
 
28f824c7addc
Moved setprod_mono, abs_setprod and setsum_le_included to the Main image. Is used in Multivariate_Analysis.
 
hoelzl 
parents: 
35115 
diff
changeset
 | 
1149  | 
proof (cases "finite A")  | 
| 
 
28f824c7addc
Moved setprod_mono, abs_setprod and setsum_le_included to the Main image. Is used in Multivariate_Analysis.
 
hoelzl 
parents: 
35115 
diff
changeset
 | 
1150  | 
case True  | 
| 
 
28f824c7addc
Moved setprod_mono, abs_setprod and setsum_le_included to the Main image. Is used in Multivariate_Analysis.
 
hoelzl 
parents: 
35115 
diff
changeset
 | 
1151  | 
hence ?thesis "setprod f A \<ge> 0" using subset_refl[of A]  | 
| 
 
28f824c7addc
Moved setprod_mono, abs_setprod and setsum_le_included to the Main image. Is used in Multivariate_Analysis.
 
hoelzl 
parents: 
35115 
diff
changeset
 | 
1152  | 
proof (induct A rule: finite_subset_induct)  | 
| 
 
28f824c7addc
Moved setprod_mono, abs_setprod and setsum_le_included to the Main image. Is used in Multivariate_Analysis.
 
hoelzl 
parents: 
35115 
diff
changeset
 | 
1153  | 
case (insert a F)  | 
| 
 
28f824c7addc
Moved setprod_mono, abs_setprod and setsum_le_included to the Main image. Is used in Multivariate_Analysis.
 
hoelzl 
parents: 
35115 
diff
changeset
 | 
1154  | 
thus "setprod f (insert a F) \<le> setprod g (insert a F)" "0 \<le> setprod f (insert a F)"  | 
| 
 
28f824c7addc
Moved setprod_mono, abs_setprod and setsum_le_included to the Main image. Is used in Multivariate_Analysis.
 
hoelzl 
parents: 
35115 
diff
changeset
 | 
1155  | 
unfolding setprod_insert[OF insert(1,3)]  | 
| 
 
28f824c7addc
Moved setprod_mono, abs_setprod and setsum_le_included to the Main image. Is used in Multivariate_Analysis.
 
hoelzl 
parents: 
35115 
diff
changeset
 | 
1156  | 
using assms[rule_format,OF insert(2)] insert  | 
| 
 
28f824c7addc
Moved setprod_mono, abs_setprod and setsum_le_included to the Main image. Is used in Multivariate_Analysis.
 
hoelzl 
parents: 
35115 
diff
changeset
 | 
1157  | 
by (auto intro: mult_mono mult_nonneg_nonneg)  | 
| 
 
28f824c7addc
Moved setprod_mono, abs_setprod and setsum_le_included to the Main image. Is used in Multivariate_Analysis.
 
hoelzl 
parents: 
35115 
diff
changeset
 | 
1158  | 
qed auto  | 
| 
 
28f824c7addc
Moved setprod_mono, abs_setprod and setsum_le_included to the Main image. Is used in Multivariate_Analysis.
 
hoelzl 
parents: 
35115 
diff
changeset
 | 
1159  | 
thus ?thesis by simp  | 
| 
 
28f824c7addc
Moved setprod_mono, abs_setprod and setsum_le_included to the Main image. Is used in Multivariate_Analysis.
 
hoelzl 
parents: 
35115 
diff
changeset
 | 
1160  | 
qed auto  | 
| 
 
28f824c7addc
Moved setprod_mono, abs_setprod and setsum_le_included to the Main image. Is used in Multivariate_Analysis.
 
hoelzl 
parents: 
35115 
diff
changeset
 | 
1161  | 
|
| 
 
28f824c7addc
Moved setprod_mono, abs_setprod and setsum_le_included to the Main image. Is used in Multivariate_Analysis.
 
hoelzl 
parents: 
35115 
diff
changeset
 | 
1162  | 
lemma abs_setprod:  | 
| 
 
28f824c7addc
Moved setprod_mono, abs_setprod and setsum_le_included to the Main image. Is used in Multivariate_Analysis.
 
hoelzl 
parents: 
35115 
diff
changeset
 | 
1163  | 
  fixes f :: "'a \<Rightarrow> 'b\<Colon>{linordered_field,abs}"
 | 
| 
 
28f824c7addc
Moved setprod_mono, abs_setprod and setsum_le_included to the Main image. Is used in Multivariate_Analysis.
 
hoelzl 
parents: 
35115 
diff
changeset
 | 
1164  | 
shows "abs (setprod f A) = setprod (\<lambda>x. abs (f x)) A"  | 
| 
 
28f824c7addc
Moved setprod_mono, abs_setprod and setsum_le_included to the Main image. Is used in Multivariate_Analysis.
 
hoelzl 
parents: 
35115 
diff
changeset
 | 
1165  | 
proof (cases "finite A")  | 
| 
 
28f824c7addc
Moved setprod_mono, abs_setprod and setsum_le_included to the Main image. Is used in Multivariate_Analysis.
 
hoelzl 
parents: 
35115 
diff
changeset
 | 
1166  | 
case True thus ?thesis  | 
| 35216 | 1167  | 
by induct (auto simp add: field_simps abs_mult)  | 
| 
35171
 
28f824c7addc
Moved setprod_mono, abs_setprod and setsum_le_included to the Main image. Is used in Multivariate_Analysis.
 
hoelzl 
parents: 
35115 
diff
changeset
 | 
1168  | 
qed auto  | 
| 
 
28f824c7addc
Moved setprod_mono, abs_setprod and setsum_le_included to the Main image. Is used in Multivariate_Analysis.
 
hoelzl 
parents: 
35115 
diff
changeset
 | 
1169  | 
|
| 31017 | 1170  | 
lemma setprod_constant: "finite A ==> (\<Prod>x\<in> A. (y::'a::{comm_monoid_mult})) = y^(card A)"
 | 
| 
28853
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
1171  | 
apply (erule finite_induct)  | 
| 35216 | 1172  | 
apply auto  | 
| 
28853
 
69eb69659bf3
Added new fold operator and renamed the old oe to fold_image.
 
nipkow 
parents: 
28823 
diff
changeset
 | 
1173  | 
done  | 
| 15402 | 1174  | 
|
| 
29674
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
1175  | 
lemma setprod_gen_delta:  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
1176  | 
assumes fS: "finite S"  | 
| 31017 | 1177  | 
  shows "setprod (\<lambda>k. if k=a then b k else c) S = (if a \<in> S then (b a ::'a::{comm_monoid_mult}) * c^ (card S - 1) else c^ card S)"
 | 
| 
29674
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
1178  | 
proof-  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
1179  | 
let ?f = "(\<lambda>k. if k=a then b k else c)"  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
1180  | 
  {assume a: "a \<notin> S"
 | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
1181  | 
hence "\<forall> k\<in> S. ?f k = c" by simp  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
1182  | 
hence ?thesis using a setprod_constant[OF fS, of c] by (simp add: setprod_1 cong add: setprod_cong) }  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
1183  | 
moreover  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
1184  | 
  {assume a: "a \<in> S"
 | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
1185  | 
    let ?A = "S - {a}"
 | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
1186  | 
    let ?B = "{a}"
 | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
1187  | 
have eq: "S = ?A \<union> ?B" using a by blast  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
1188  | 
    have dj: "?A \<inter> ?B = {}" by simp
 | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
1189  | 
from fS have fAB: "finite ?A" "finite ?B" by auto  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
1190  | 
have fA0:"setprod ?f ?A = setprod (\<lambda>i. c) ?A"  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
1191  | 
apply (rule setprod_cong) by auto  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
1192  | 
have cA: "card ?A = card S - 1" using fS a by auto  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
1193  | 
have fA1: "setprod ?f ?A = c ^ card ?A" unfolding fA0 apply (rule setprod_constant) using fS by auto  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
1194  | 
have "setprod ?f ?A * setprod ?f ?B = setprod ?f S"  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
1195  | 
using setprod_Un_disjoint[OF fAB dj, of ?f, unfolded eq[symmetric]]  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
1196  | 
by simp  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
1197  | 
then have ?thesis using a cA  | 
| 36349 | 1198  | 
by (simp add: fA1 field_simps cong add: setprod_cong cong del: if_weak_cong)}  | 
| 
29674
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
1199  | 
ultimately show ?thesis by blast  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
1200  | 
qed  | 
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
1201  | 
|
| 
 
3857d7eba390
Added theorems setsum_reindex_nonzero, setsum_mono_zero_left, setsum_mono_zero_right, setsum_mono_zero_cong_left, setsum_mono_zero_cong_right, setsum_delta, strong_setprod_reindex_cong, setprod_delta
 
chaieb 
parents: 
29609 
diff
changeset
 | 
1202  | 
|
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1203  | 
subsection {* Versions of @{const inf} and @{const sup} on non-empty sets *}
 | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1204  | 
|
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1205  | 
no_notation times (infixl "*" 70)  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1206  | 
no_notation Groups.one ("1")
 | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1207  | 
|
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1208  | 
locale semilattice_big = semilattice +  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1209  | 
fixes F :: "'a set \<Rightarrow> 'a"  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1210  | 
assumes F_eq: "finite A \<Longrightarrow> F A = fold1 (op *) A"  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1211  | 
|
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1212  | 
sublocale semilattice_big < folding_one_idem proof  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1213  | 
qed (simp_all add: F_eq)  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1214  | 
|
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1215  | 
notation times (infixl "*" 70)  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1216  | 
notation Groups.one ("1")
 | 
| 22917 | 1217  | 
|
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1218  | 
context lattice  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1219  | 
begin  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1220  | 
|
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1221  | 
definition Inf_fin :: "'a set \<Rightarrow> 'a" ("\<Sqinter>\<^bsub>fin\<^esub>_" [900] 900) where
 | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1222  | 
"Inf_fin = fold1 inf"  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1223  | 
|
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1224  | 
definition Sup_fin :: "'a set \<Rightarrow> 'a" ("\<Squnion>\<^bsub>fin\<^esub>_" [900] 900) where
 | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1225  | 
"Sup_fin = fold1 sup"  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1226  | 
|
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1227  | 
end  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1228  | 
|
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1229  | 
sublocale lattice < Inf_fin!: semilattice_big inf Inf_fin proof  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1230  | 
qed (simp add: Inf_fin_def)  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1231  | 
|
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1232  | 
sublocale lattice < Sup_fin!: semilattice_big sup Sup_fin proof  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1233  | 
qed (simp add: Sup_fin_def)  | 
| 22917 | 1234  | 
|
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34223 
diff
changeset
 | 
1235  | 
context semilattice_inf  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1236  | 
begin  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1237  | 
|
| 
36635
 
080b755377c0
locale predicates of classes carry a mandatory "class" prefix
 
haftmann 
parents: 
36622 
diff
changeset
 | 
1238  | 
lemma ab_semigroup_idem_mult_inf:  | 
| 
 
080b755377c0
locale predicates of classes carry a mandatory "class" prefix
 
haftmann 
parents: 
36622 
diff
changeset
 | 
1239  | 
"class.ab_semigroup_idem_mult inf"  | 
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1240  | 
proof qed (rule inf_assoc inf_commute inf_idem)+  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1241  | 
|
| 46033 | 1242  | 
lemma fold_inf_insert[simp]: "finite A \<Longrightarrow> Finite_Set.fold inf b (insert a A) = inf a (Finite_Set.fold inf b A)"  | 
| 
42871
 
1c0b99f950d9
names of fold_set locales resemble name of characteristic property more closely
 
haftmann 
parents: 
42284 
diff
changeset
 | 
1243  | 
by(rule comp_fun_idem.fold_insert_idem[OF ab_semigroup_idem_mult.comp_fun_idem[OF ab_semigroup_idem_mult_inf]])  | 
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1244  | 
|
| 46033 | 1245  | 
lemma inf_le_fold_inf: "finite A \<Longrightarrow> ALL a:A. b \<le> a \<Longrightarrow> inf b c \<le> Finite_Set.fold inf c A"  | 
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1246  | 
by (induct pred: finite) (auto intro: le_infI1)  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1247  | 
|
| 46033 | 1248  | 
lemma fold_inf_le_inf: "finite A \<Longrightarrow> a \<in> A \<Longrightarrow> Finite_Set.fold inf b A \<le> inf a b"  | 
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1249  | 
proof(induct arbitrary: a pred:finite)  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1250  | 
case empty thus ?case by simp  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1251  | 
next  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1252  | 
case (insert x A)  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1253  | 
show ?case  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1254  | 
proof cases  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1255  | 
    assume "A = {}" thus ?thesis using insert by simp
 | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1256  | 
next  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1257  | 
    assume "A \<noteq> {}" thus ?thesis using insert by (auto intro: le_infI2)
 | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1258  | 
qed  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1259  | 
qed  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1260  | 
|
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1261  | 
lemma below_fold1_iff:  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1262  | 
  assumes "finite A" "A \<noteq> {}"
 | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1263  | 
shows "x \<le> fold1 inf A \<longleftrightarrow> (\<forall>a\<in>A. x \<le> a)"  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1264  | 
proof -  | 
| 
29509
 
1ff0f3f08a7b
migrated class package to new locale implementation
 
haftmann 
parents: 
29223 
diff
changeset
 | 
1265  | 
interpret ab_semigroup_idem_mult inf  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1266  | 
by (rule ab_semigroup_idem_mult_inf)  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1267  | 
show ?thesis using assms by (induct rule: finite_ne_induct) simp_all  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1268  | 
qed  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1269  | 
|
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1270  | 
lemma fold1_belowI:  | 
| 
26757
 
e775accff967
thms Max_ge, Min_le: dropped superfluous premise
 
haftmann 
parents: 
26748 
diff
changeset
 | 
1271  | 
assumes "finite A"  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1272  | 
and "a \<in> A"  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1273  | 
shows "fold1 inf A \<le> a"  | 
| 
26757
 
e775accff967
thms Max_ge, Min_le: dropped superfluous premise
 
haftmann 
parents: 
26748 
diff
changeset
 | 
1274  | 
proof -  | 
| 
 
e775accff967
thms Max_ge, Min_le: dropped superfluous premise
 
haftmann 
parents: 
26748 
diff
changeset
 | 
1275  | 
  from assms have "A \<noteq> {}" by auto
 | 
| 
 
e775accff967
thms Max_ge, Min_le: dropped superfluous premise
 
haftmann 
parents: 
26748 
diff
changeset
 | 
1276  | 
  from `finite A` `A \<noteq> {}` `a \<in> A` show ?thesis
 | 
| 
 
e775accff967
thms Max_ge, Min_le: dropped superfluous premise
 
haftmann 
parents: 
26748 
diff
changeset
 | 
1277  | 
proof (induct rule: finite_ne_induct)  | 
| 
 
e775accff967
thms Max_ge, Min_le: dropped superfluous premise
 
haftmann 
parents: 
26748 
diff
changeset
 | 
1278  | 
case singleton thus ?case by simp  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1279  | 
next  | 
| 
29509
 
1ff0f3f08a7b
migrated class package to new locale implementation
 
haftmann 
parents: 
29223 
diff
changeset
 | 
1280  | 
interpret ab_semigroup_idem_mult inf  | 
| 
26757
 
e775accff967
thms Max_ge, Min_le: dropped superfluous premise
 
haftmann 
parents: 
26748 
diff
changeset
 | 
1281  | 
by (rule ab_semigroup_idem_mult_inf)  | 
| 
 
e775accff967
thms Max_ge, Min_le: dropped superfluous premise
 
haftmann 
parents: 
26748 
diff
changeset
 | 
1282  | 
case (insert x F)  | 
| 
 
e775accff967
thms Max_ge, Min_le: dropped superfluous premise
 
haftmann 
parents: 
26748 
diff
changeset
 | 
1283  | 
from insert(5) have "a = x \<or> a \<in> F" by simp  | 
| 
 
e775accff967
thms Max_ge, Min_le: dropped superfluous premise
 
haftmann 
parents: 
26748 
diff
changeset
 | 
1284  | 
thus ?case  | 
| 
 
e775accff967
thms Max_ge, Min_le: dropped superfluous premise
 
haftmann 
parents: 
26748 
diff
changeset
 | 
1285  | 
proof  | 
| 
 
e775accff967
thms Max_ge, Min_le: dropped superfluous premise
 
haftmann 
parents: 
26748 
diff
changeset
 | 
1286  | 
assume "a = x" thus ?thesis using insert  | 
| 29667 | 1287  | 
by (simp add: mult_ac)  | 
| 
26757
 
e775accff967
thms Max_ge, Min_le: dropped superfluous premise
 
haftmann 
parents: 
26748 
diff
changeset
 | 
1288  | 
next  | 
| 
 
e775accff967
thms Max_ge, Min_le: dropped superfluous premise
 
haftmann 
parents: 
26748 
diff
changeset
 | 
1289  | 
assume "a \<in> F"  | 
| 
 
e775accff967
thms Max_ge, Min_le: dropped superfluous premise
 
haftmann 
parents: 
26748 
diff
changeset
 | 
1290  | 
hence bel: "fold1 inf F \<le> a" by (rule insert)  | 
| 
 
e775accff967
thms Max_ge, Min_le: dropped superfluous premise
 
haftmann 
parents: 
26748 
diff
changeset
 | 
1291  | 
have "inf (fold1 inf (insert x F)) a = inf x (inf (fold1 inf F) a)"  | 
| 29667 | 1292  | 
using insert by (simp add: mult_ac)  | 
| 
26757
 
e775accff967
thms Max_ge, Min_le: dropped superfluous premise
 
haftmann 
parents: 
26748 
diff
changeset
 | 
1293  | 
also have "inf (fold1 inf F) a = fold1 inf F"  | 
| 
 
e775accff967
thms Max_ge, Min_le: dropped superfluous premise
 
haftmann 
parents: 
26748 
diff
changeset
 | 
1294  | 
using bel by (auto intro: antisym)  | 
| 
 
e775accff967
thms Max_ge, Min_le: dropped superfluous premise
 
haftmann 
parents: 
26748 
diff
changeset
 | 
1295  | 
also have "inf x \<dots> = fold1 inf (insert x F)"  | 
| 29667 | 1296  | 
using insert by (simp add: mult_ac)  | 
| 
26757
 
e775accff967
thms Max_ge, Min_le: dropped superfluous premise
 
haftmann 
parents: 
26748 
diff
changeset
 | 
1297  | 
finally have aux: "inf (fold1 inf (insert x F)) a = fold1 inf (insert x F)" .  | 
| 
 
e775accff967
thms Max_ge, Min_le: dropped superfluous premise
 
haftmann 
parents: 
26748 
diff
changeset
 | 
1298  | 
moreover have "inf (fold1 inf (insert x F)) a \<le> a" by simp  | 
| 
 
e775accff967
thms Max_ge, Min_le: dropped superfluous premise
 
haftmann 
parents: 
26748 
diff
changeset
 | 
1299  | 
ultimately show ?thesis by simp  | 
| 
 
e775accff967
thms Max_ge, Min_le: dropped superfluous premise
 
haftmann 
parents: 
26748 
diff
changeset
 | 
1300  | 
qed  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1301  | 
qed  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1302  | 
qed  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1303  | 
|
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1304  | 
end  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1305  | 
|
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1306  | 
context semilattice_sup  | 
| 22917 | 1307  | 
begin  | 
1308  | 
||
| 
36635
 
080b755377c0
locale predicates of classes carry a mandatory "class" prefix
 
haftmann 
parents: 
36622 
diff
changeset
 | 
1309  | 
lemma ab_semigroup_idem_mult_sup: "class.ab_semigroup_idem_mult sup"  | 
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1310  | 
by (rule semilattice_inf.ab_semigroup_idem_mult_inf)(rule dual_semilattice)  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1311  | 
|
| 46033 | 1312  | 
lemma fold_sup_insert[simp]: "finite A \<Longrightarrow> Finite_Set.fold sup b (insert a A) = sup a (Finite_Set.fold sup b A)"  | 
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1313  | 
by(rule semilattice_inf.fold_inf_insert)(rule dual_semilattice)  | 
| 22917 | 1314  | 
|
| 46033 | 1315  | 
lemma fold_sup_le_sup: "finite A \<Longrightarrow> ALL a:A. a \<le> b \<Longrightarrow> Finite_Set.fold sup c A \<le> sup b c"  | 
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1316  | 
by(rule semilattice_inf.inf_le_fold_inf)(rule dual_semilattice)  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1317  | 
|
| 46033 | 1318  | 
lemma sup_le_fold_sup: "finite A \<Longrightarrow> a \<in> A \<Longrightarrow> sup a b \<le> Finite_Set.fold sup b A"  | 
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1319  | 
by(rule semilattice_inf.fold_inf_le_inf)(rule dual_semilattice)  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1320  | 
|
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1321  | 
end  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1322  | 
|
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1323  | 
context lattice  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1324  | 
begin  | 
| 25062 | 1325  | 
|
| 
31916
 
f3227bb306a4
recovered subscripts, which were lost in b41d61c768e2 (due to Emacs accident?);
 
wenzelm 
parents: 
31907 
diff
changeset
 | 
1326  | 
lemma Inf_le_Sup [simp]: "\<lbrakk> finite A; A \<noteq> {} \<rbrakk> \<Longrightarrow> \<Sqinter>\<^bsub>fin\<^esub>A \<le> \<Squnion>\<^bsub>fin\<^esub>A"
 | 
| 24342 | 1327  | 
apply(unfold Sup_fin_def Inf_fin_def)  | 
| 15500 | 1328  | 
apply(subgoal_tac "EX a. a:A")  | 
1329  | 
prefer 2 apply blast  | 
|
1330  | 
apply(erule exE)  | 
|
| 22388 | 1331  | 
apply(rule order_trans)  | 
| 
26757
 
e775accff967
thms Max_ge, Min_le: dropped superfluous premise
 
haftmann 
parents: 
26748 
diff
changeset
 | 
1332  | 
apply(erule (1) fold1_belowI)  | 
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34223 
diff
changeset
 | 
1333  | 
apply(erule (1) semilattice_inf.fold1_belowI [OF dual_semilattice])  | 
| 15500 | 1334  | 
done  | 
1335  | 
||
| 24342 | 1336  | 
lemma sup_Inf_absorb [simp]:  | 
| 
31916
 
f3227bb306a4
recovered subscripts, which were lost in b41d61c768e2 (due to Emacs accident?);
 
wenzelm 
parents: 
31907 
diff
changeset
 | 
1337  | 
"finite A \<Longrightarrow> a \<in> A \<Longrightarrow> sup a (\<Sqinter>\<^bsub>fin\<^esub>A) = a"  | 
| 
15512
 
ed1fa4617f52
Extracted generic lattice stuff to new Lattice_Locales.thy
 
nipkow 
parents: 
15510 
diff
changeset
 | 
1338  | 
apply(subst sup_commute)  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1339  | 
apply(simp add: Inf_fin_def sup_absorb2 fold1_belowI)  | 
| 15504 | 1340  | 
done  | 
1341  | 
||
| 24342 | 1342  | 
lemma inf_Sup_absorb [simp]:  | 
| 
31916
 
f3227bb306a4
recovered subscripts, which were lost in b41d61c768e2 (due to Emacs accident?);
 
wenzelm 
parents: 
31907 
diff
changeset
 | 
1343  | 
"finite A \<Longrightarrow> a \<in> A \<Longrightarrow> inf a (\<Squnion>\<^bsub>fin\<^esub>A) = a"  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1344  | 
by (simp add: Sup_fin_def inf_absorb1  | 
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34223 
diff
changeset
 | 
1345  | 
semilattice_inf.fold1_belowI [OF dual_semilattice])  | 
| 24342 | 1346  | 
|
1347  | 
end  | 
|
1348  | 
||
1349  | 
context distrib_lattice  | 
|
1350  | 
begin  | 
|
1351  | 
||
1352  | 
lemma sup_Inf1_distrib:  | 
|
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1353  | 
assumes "finite A"  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1354  | 
    and "A \<noteq> {}"
 | 
| 
31916
 
f3227bb306a4
recovered subscripts, which were lost in b41d61c768e2 (due to Emacs accident?);
 
wenzelm 
parents: 
31907 
diff
changeset
 | 
1355  | 
  shows "sup x (\<Sqinter>\<^bsub>fin\<^esub>A) = \<Sqinter>\<^bsub>fin\<^esub>{sup x a|a. a \<in> A}"
 | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1356  | 
proof -  | 
| 
29509
 
1ff0f3f08a7b
migrated class package to new locale implementation
 
haftmann 
parents: 
29223 
diff
changeset
 | 
1357  | 
interpret ab_semigroup_idem_mult inf  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1358  | 
by (rule ab_semigroup_idem_mult_inf)  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1359  | 
from assms show ?thesis  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1360  | 
by (simp add: Inf_fin_def image_def  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1361  | 
hom_fold1_commute [where h="sup x", OF sup_inf_distrib1])  | 
| 26792 | 1362  | 
(rule arg_cong [where f="fold1 inf"], blast)  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1363  | 
qed  | 
| 18423 | 1364  | 
|
| 24342 | 1365  | 
lemma sup_Inf2_distrib:  | 
1366  | 
  assumes A: "finite A" "A \<noteq> {}" and B: "finite B" "B \<noteq> {}"
 | 
|
| 
31916
 
f3227bb306a4
recovered subscripts, which were lost in b41d61c768e2 (due to Emacs accident?);
 
wenzelm 
parents: 
31907 
diff
changeset
 | 
1367  | 
  shows "sup (\<Sqinter>\<^bsub>fin\<^esub>A) (\<Sqinter>\<^bsub>fin\<^esub>B) = \<Sqinter>\<^bsub>fin\<^esub>{sup a b|a b. a \<in> A \<and> b \<in> B}"
 | 
| 24342 | 1368  | 
using A proof (induct rule: finite_ne_induct)  | 
| 15500 | 1369  | 
case singleton thus ?case  | 
| 41550 | 1370  | 
by (simp add: sup_Inf1_distrib [OF B])  | 
| 15500 | 1371  | 
next  | 
| 
29509
 
1ff0f3f08a7b
migrated class package to new locale implementation
 
haftmann 
parents: 
29223 
diff
changeset
 | 
1372  | 
interpret ab_semigroup_idem_mult inf  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1373  | 
by (rule ab_semigroup_idem_mult_inf)  | 
| 15500 | 1374  | 
case (insert x A)  | 
| 25062 | 1375  | 
  have finB: "finite {sup x b |b. b \<in> B}"
 | 
1376  | 
by(rule finite_surj[where f = "sup x", OF B(1)], auto)  | 
|
1377  | 
  have finAB: "finite {sup a b |a b. a \<in> A \<and> b \<in> B}"
 | 
|
| 15500 | 1378  | 
proof -  | 
| 25062 | 1379  | 
    have "{sup a b |a b. a \<in> A \<and> b \<in> B} = (UN a:A. UN b:B. {sup a b})"
 | 
| 15500 | 1380  | 
by blast  | 
| 15517 | 1381  | 
thus ?thesis by(simp add: insert(1) B(1))  | 
| 15500 | 1382  | 
qed  | 
| 25062 | 1383  | 
  have ne: "{sup a b |a b. a \<in> A \<and> b \<in> B} \<noteq> {}" using insert B by blast
 | 
| 
31916
 
f3227bb306a4
recovered subscripts, which were lost in b41d61c768e2 (due to Emacs accident?);
 
wenzelm 
parents: 
31907 
diff
changeset
 | 
1384  | 
have "sup (\<Sqinter>\<^bsub>fin\<^esub>(insert x A)) (\<Sqinter>\<^bsub>fin\<^esub>B) = sup (inf x (\<Sqinter>\<^bsub>fin\<^esub>A)) (\<Sqinter>\<^bsub>fin\<^esub>B)"  | 
| 41550 | 1385  | 
using insert by simp  | 
| 
31916
 
f3227bb306a4
recovered subscripts, which were lost in b41d61c768e2 (due to Emacs accident?);
 
wenzelm 
parents: 
31907 
diff
changeset
 | 
1386  | 
also have "\<dots> = inf (sup x (\<Sqinter>\<^bsub>fin\<^esub>B)) (sup (\<Sqinter>\<^bsub>fin\<^esub>A) (\<Sqinter>\<^bsub>fin\<^esub>B))" by(rule sup_inf_distrib2)  | 
| 
 
f3227bb306a4
recovered subscripts, which were lost in b41d61c768e2 (due to Emacs accident?);
 
wenzelm 
parents: 
31907 
diff
changeset
 | 
1387  | 
  also have "\<dots> = inf (\<Sqinter>\<^bsub>fin\<^esub>{sup x b|b. b \<in> B}) (\<Sqinter>\<^bsub>fin\<^esub>{sup a b|a b. a \<in> A \<and> b \<in> B})"
 | 
| 15500 | 1388  | 
using insert by(simp add:sup_Inf1_distrib[OF B])  | 
| 
31916
 
f3227bb306a4
recovered subscripts, which were lost in b41d61c768e2 (due to Emacs accident?);
 
wenzelm 
parents: 
31907 
diff
changeset
 | 
1389  | 
  also have "\<dots> = \<Sqinter>\<^bsub>fin\<^esub>({sup x b |b. b \<in> B} \<union> {sup a b |a b. a \<in> A \<and> b \<in> B})"
 | 
| 
 
f3227bb306a4
recovered subscripts, which were lost in b41d61c768e2 (due to Emacs accident?);
 
wenzelm 
parents: 
31907 
diff
changeset
 | 
1390  | 
(is "_ = \<Sqinter>\<^bsub>fin\<^esub>?M")  | 
| 15500 | 1391  | 
using B insert  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1392  | 
by (simp add: Inf_fin_def fold1_Un2 [OF finB _ finAB ne])  | 
| 25062 | 1393  | 
  also have "?M = {sup a b |a b. a \<in> insert x A \<and> b \<in> B}"
 | 
| 15500 | 1394  | 
by blast  | 
1395  | 
finally show ?case .  | 
|
1396  | 
qed  | 
|
1397  | 
||
| 24342 | 1398  | 
lemma inf_Sup1_distrib:  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1399  | 
  assumes "finite A" and "A \<noteq> {}"
 | 
| 
31916
 
f3227bb306a4
recovered subscripts, which were lost in b41d61c768e2 (due to Emacs accident?);
 
wenzelm 
parents: 
31907 
diff
changeset
 | 
1400  | 
  shows "inf x (\<Squnion>\<^bsub>fin\<^esub>A) = \<Squnion>\<^bsub>fin\<^esub>{inf x a|a. a \<in> A}"
 | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1401  | 
proof -  | 
| 
29509
 
1ff0f3f08a7b
migrated class package to new locale implementation
 
haftmann 
parents: 
29223 
diff
changeset
 | 
1402  | 
interpret ab_semigroup_idem_mult sup  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1403  | 
by (rule ab_semigroup_idem_mult_sup)  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1404  | 
from assms show ?thesis  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1405  | 
by (simp add: Sup_fin_def image_def hom_fold1_commute [where h="inf x", OF inf_sup_distrib1])  | 
| 26792 | 1406  | 
(rule arg_cong [where f="fold1 sup"], blast)  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1407  | 
qed  | 
| 18423 | 1408  | 
|
| 24342 | 1409  | 
lemma inf_Sup2_distrib:  | 
1410  | 
  assumes A: "finite A" "A \<noteq> {}" and B: "finite B" "B \<noteq> {}"
 | 
|
| 
31916
 
f3227bb306a4
recovered subscripts, which were lost in b41d61c768e2 (due to Emacs accident?);
 
wenzelm 
parents: 
31907 
diff
changeset
 | 
1411  | 
  shows "inf (\<Squnion>\<^bsub>fin\<^esub>A) (\<Squnion>\<^bsub>fin\<^esub>B) = \<Squnion>\<^bsub>fin\<^esub>{inf a b|a b. a \<in> A \<and> b \<in> B}"
 | 
| 24342 | 1412  | 
using A proof (induct rule: finite_ne_induct)  | 
| 18423 | 1413  | 
case singleton thus ?case  | 
| 44921 | 1414  | 
by(simp add: inf_Sup1_distrib [OF B])  | 
| 18423 | 1415  | 
next  | 
1416  | 
case (insert x A)  | 
|
| 25062 | 1417  | 
  have finB: "finite {inf x b |b. b \<in> B}"
 | 
1418  | 
by(rule finite_surj[where f = "%b. inf x b", OF B(1)], auto)  | 
|
1419  | 
  have finAB: "finite {inf a b |a b. a \<in> A \<and> b \<in> B}"
 | 
|
| 18423 | 1420  | 
proof -  | 
| 25062 | 1421  | 
    have "{inf a b |a b. a \<in> A \<and> b \<in> B} = (UN a:A. UN b:B. {inf a b})"
 | 
| 18423 | 1422  | 
by blast  | 
1423  | 
thus ?thesis by(simp add: insert(1) B(1))  | 
|
1424  | 
qed  | 
|
| 25062 | 1425  | 
  have ne: "{inf a b |a b. a \<in> A \<and> b \<in> B} \<noteq> {}" using insert B by blast
 | 
| 
29509
 
1ff0f3f08a7b
migrated class package to new locale implementation
 
haftmann 
parents: 
29223 
diff
changeset
 | 
1426  | 
interpret ab_semigroup_idem_mult sup  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1427  | 
by (rule ab_semigroup_idem_mult_sup)  | 
| 
31916
 
f3227bb306a4
recovered subscripts, which were lost in b41d61c768e2 (due to Emacs accident?);
 
wenzelm 
parents: 
31907 
diff
changeset
 | 
1428  | 
have "inf (\<Squnion>\<^bsub>fin\<^esub>(insert x A)) (\<Squnion>\<^bsub>fin\<^esub>B) = inf (sup x (\<Squnion>\<^bsub>fin\<^esub>A)) (\<Squnion>\<^bsub>fin\<^esub>B)"  | 
| 41550 | 1429  | 
using insert by simp  | 
| 
31916
 
f3227bb306a4
recovered subscripts, which were lost in b41d61c768e2 (due to Emacs accident?);
 
wenzelm 
parents: 
31907 
diff
changeset
 | 
1430  | 
also have "\<dots> = sup (inf x (\<Squnion>\<^bsub>fin\<^esub>B)) (inf (\<Squnion>\<^bsub>fin\<^esub>A) (\<Squnion>\<^bsub>fin\<^esub>B))" by(rule inf_sup_distrib2)  | 
| 
 
f3227bb306a4
recovered subscripts, which were lost in b41d61c768e2 (due to Emacs accident?);
 
wenzelm 
parents: 
31907 
diff
changeset
 | 
1431  | 
  also have "\<dots> = sup (\<Squnion>\<^bsub>fin\<^esub>{inf x b|b. b \<in> B}) (\<Squnion>\<^bsub>fin\<^esub>{inf a b|a b. a \<in> A \<and> b \<in> B})"
 | 
| 18423 | 1432  | 
using insert by(simp add:inf_Sup1_distrib[OF B])  | 
| 
31916
 
f3227bb306a4
recovered subscripts, which were lost in b41d61c768e2 (due to Emacs accident?);
 
wenzelm 
parents: 
31907 
diff
changeset
 | 
1433  | 
  also have "\<dots> = \<Squnion>\<^bsub>fin\<^esub>({inf x b |b. b \<in> B} \<union> {inf a b |a b. a \<in> A \<and> b \<in> B})"
 | 
| 
 
f3227bb306a4
recovered subscripts, which were lost in b41d61c768e2 (due to Emacs accident?);
 
wenzelm 
parents: 
31907 
diff
changeset
 | 
1434  | 
(is "_ = \<Squnion>\<^bsub>fin\<^esub>?M")  | 
| 18423 | 1435  | 
using B insert  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1436  | 
by (simp add: Sup_fin_def fold1_Un2 [OF finB _ finAB ne])  | 
| 25062 | 1437  | 
  also have "?M = {inf a b |a b. a \<in> insert x A \<and> b \<in> B}"
 | 
| 18423 | 1438  | 
by blast  | 
1439  | 
finally show ?case .  | 
|
1440  | 
qed  | 
|
1441  | 
||
| 24342 | 1442  | 
end  | 
1443  | 
||
| 
35719
 
99b6152aedf5
split off theory Big_Operators from theory Finite_Set
 
haftmann 
parents: 
35577 
diff
changeset
 | 
1444  | 
context complete_lattice  | 
| 
 
99b6152aedf5
split off theory Big_Operators from theory Finite_Set
 
haftmann 
parents: 
35577 
diff
changeset
 | 
1445  | 
begin  | 
| 
 
99b6152aedf5
split off theory Big_Operators from theory Finite_Set
 
haftmann 
parents: 
35577 
diff
changeset
 | 
1446  | 
|
| 
 
99b6152aedf5
split off theory Big_Operators from theory Finite_Set
 
haftmann 
parents: 
35577 
diff
changeset
 | 
1447  | 
lemma Inf_fin_Inf:  | 
| 
 
99b6152aedf5
split off theory Big_Operators from theory Finite_Set
 
haftmann 
parents: 
35577 
diff
changeset
 | 
1448  | 
  assumes "finite A" and "A \<noteq> {}"
 | 
| 
 
99b6152aedf5
split off theory Big_Operators from theory Finite_Set
 
haftmann 
parents: 
35577 
diff
changeset
 | 
1449  | 
shows "\<Sqinter>\<^bsub>fin\<^esub>A = Inf A"  | 
| 
 
99b6152aedf5
split off theory Big_Operators from theory Finite_Set
 
haftmann 
parents: 
35577 
diff
changeset
 | 
1450  | 
proof -  | 
| 
 
99b6152aedf5
split off theory Big_Operators from theory Finite_Set
 
haftmann 
parents: 
35577 
diff
changeset
 | 
1451  | 
interpret ab_semigroup_idem_mult inf  | 
| 
 
99b6152aedf5
split off theory Big_Operators from theory Finite_Set
 
haftmann 
parents: 
35577 
diff
changeset
 | 
1452  | 
by (rule ab_semigroup_idem_mult_inf)  | 
| 44918 | 1453  | 
  from `A \<noteq> {}` obtain b B where "A = {b} \<union> B" by auto
 | 
| 
35719
 
99b6152aedf5
split off theory Big_Operators from theory Finite_Set
 
haftmann 
parents: 
35577 
diff
changeset
 | 
1454  | 
moreover with `finite A` have "finite B" by simp  | 
| 44918 | 1455  | 
ultimately show ?thesis  | 
1456  | 
by (simp add: Inf_fin_def fold1_eq_fold_idem inf_Inf_fold_inf [symmetric])  | 
|
| 
35719
 
99b6152aedf5
split off theory Big_Operators from theory Finite_Set
 
haftmann 
parents: 
35577 
diff
changeset
 | 
1457  | 
qed  | 
| 
 
99b6152aedf5
split off theory Big_Operators from theory Finite_Set
 
haftmann 
parents: 
35577 
diff
changeset
 | 
1458  | 
|
| 
 
99b6152aedf5
split off theory Big_Operators from theory Finite_Set
 
haftmann 
parents: 
35577 
diff
changeset
 | 
1459  | 
lemma Sup_fin_Sup:  | 
| 
 
99b6152aedf5
split off theory Big_Operators from theory Finite_Set
 
haftmann 
parents: 
35577 
diff
changeset
 | 
1460  | 
  assumes "finite A" and "A \<noteq> {}"
 | 
| 
 
99b6152aedf5
split off theory Big_Operators from theory Finite_Set
 
haftmann 
parents: 
35577 
diff
changeset
 | 
1461  | 
shows "\<Squnion>\<^bsub>fin\<^esub>A = Sup A"  | 
| 
 
99b6152aedf5
split off theory Big_Operators from theory Finite_Set
 
haftmann 
parents: 
35577 
diff
changeset
 | 
1462  | 
proof -  | 
| 
 
99b6152aedf5
split off theory Big_Operators from theory Finite_Set
 
haftmann 
parents: 
35577 
diff
changeset
 | 
1463  | 
interpret ab_semigroup_idem_mult sup  | 
| 
 
99b6152aedf5
split off theory Big_Operators from theory Finite_Set
 
haftmann 
parents: 
35577 
diff
changeset
 | 
1464  | 
by (rule ab_semigroup_idem_mult_sup)  | 
| 44918 | 1465  | 
  from `A \<noteq> {}` obtain b B where "A = {b} \<union> B" by auto
 | 
| 
35719
 
99b6152aedf5
split off theory Big_Operators from theory Finite_Set
 
haftmann 
parents: 
35577 
diff
changeset
 | 
1466  | 
moreover with `finite A` have "finite B" by simp  | 
| 
 
99b6152aedf5
split off theory Big_Operators from theory Finite_Set
 
haftmann 
parents: 
35577 
diff
changeset
 | 
1467  | 
ultimately show ?thesis  | 
| 
 
99b6152aedf5
split off theory Big_Operators from theory Finite_Set
 
haftmann 
parents: 
35577 
diff
changeset
 | 
1468  | 
by (simp add: Sup_fin_def fold1_eq_fold_idem sup_Sup_fold_sup [symmetric])  | 
| 
 
99b6152aedf5
split off theory Big_Operators from theory Finite_Set
 
haftmann 
parents: 
35577 
diff
changeset
 | 
1469  | 
qed  | 
| 
 
99b6152aedf5
split off theory Big_Operators from theory Finite_Set
 
haftmann 
parents: 
35577 
diff
changeset
 | 
1470  | 
|
| 
 
99b6152aedf5
split off theory Big_Operators from theory Finite_Set
 
haftmann 
parents: 
35577 
diff
changeset
 | 
1471  | 
end  | 
| 
 
99b6152aedf5
split off theory Big_Operators from theory Finite_Set
 
haftmann 
parents: 
35577 
diff
changeset
 | 
1472  | 
|
| 22917 | 1473  | 
|
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1474  | 
subsection {* Versions of @{const min} and @{const max} on non-empty sets *}
 | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1475  | 
|
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1476  | 
definition (in linorder) Min :: "'a set \<Rightarrow> 'a" where  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1477  | 
"Min = fold1 min"  | 
| 22917 | 1478  | 
|
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1479  | 
definition (in linorder) Max :: "'a set \<Rightarrow> 'a" where  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1480  | 
"Max = fold1 max"  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1481  | 
|
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1482  | 
sublocale linorder < Min!: semilattice_big min Min proof  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1483  | 
qed (simp add: Min_def)  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1484  | 
|
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1485  | 
sublocale linorder < Max!: semilattice_big max Max proof  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1486  | 
qed (simp add: Max_def)  | 
| 22917 | 1487  | 
|
| 24342 | 1488  | 
context linorder  | 
| 22917 | 1489  | 
begin  | 
1490  | 
||
| 
35816
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1491  | 
lemmas Min_singleton = Min.singleton  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1492  | 
lemmas Max_singleton = Max.singleton  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1493  | 
|
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1494  | 
lemma Min_insert:  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1495  | 
  assumes "finite A" and "A \<noteq> {}"
 | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1496  | 
shows "Min (insert x A) = min x (Min A)"  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1497  | 
using assms by simp  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1498  | 
|
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1499  | 
lemma Max_insert:  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1500  | 
  assumes "finite A" and "A \<noteq> {}"
 | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1501  | 
shows "Max (insert x A) = max x (Max A)"  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1502  | 
using assms by simp  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1503  | 
|
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1504  | 
lemma Min_Un:  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1505  | 
  assumes "finite A" and "A \<noteq> {}" and "finite B" and "B \<noteq> {}"
 | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1506  | 
shows "Min (A \<union> B) = min (Min A) (Min B)"  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1507  | 
using assms by (rule Min.union_idem)  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1508  | 
|
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1509  | 
lemma Max_Un:  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1510  | 
  assumes "finite A" and "A \<noteq> {}" and "finite B" and "B \<noteq> {}"
 | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1511  | 
shows "Max (A \<union> B) = max (Max A) (Max B)"  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1512  | 
using assms by (rule Max.union_idem)  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1513  | 
|
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1514  | 
lemma hom_Min_commute:  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1515  | 
assumes "\<And>x y. h (min x y) = min (h x) (h y)"  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1516  | 
    and "finite N" and "N \<noteq> {}"
 | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1517  | 
shows "h (Min N) = Min (h ` N)"  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1518  | 
using assms by (rule Min.hom_commute)  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1519  | 
|
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1520  | 
lemma hom_Max_commute:  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1521  | 
assumes "\<And>x y. h (max x y) = max (h x) (h y)"  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1522  | 
    and "finite N" and "N \<noteq> {}"
 | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1523  | 
shows "h (Max N) = Max (h ` N)"  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1524  | 
using assms by (rule Max.hom_commute)  | 
| 
 
2449e026483d
generic locale for big operators in monoids; dropped odd interpretation of comm_monoid_mult into comm_monoid_add
 
haftmann 
parents: 
35722 
diff
changeset
 | 
1525  | 
|
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1526  | 
lemma ab_semigroup_idem_mult_min:  | 
| 
36635
 
080b755377c0
locale predicates of classes carry a mandatory "class" prefix
 
haftmann 
parents: 
36622 
diff
changeset
 | 
1527  | 
"class.ab_semigroup_idem_mult min"  | 
| 28823 | 1528  | 
proof qed (auto simp add: min_def)  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1529  | 
|
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1530  | 
lemma ab_semigroup_idem_mult_max:  | 
| 
36635
 
080b755377c0
locale predicates of classes carry a mandatory "class" prefix
 
haftmann 
parents: 
36622 
diff
changeset
 | 
1531  | 
"class.ab_semigroup_idem_mult max"  | 
| 28823 | 1532  | 
proof qed (auto simp add: max_def)  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1533  | 
|
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1534  | 
lemma max_lattice:  | 
| 44845 | 1535  | 
"class.semilattice_inf max (op \<ge>) (op >)"  | 
| 
32203
 
992ac8942691
adapted to localized interpretation of min/max-lattice
 
haftmann 
parents: 
32075 
diff
changeset
 | 
1536  | 
by (fact min_max.dual_semilattice)  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1537  | 
|
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1538  | 
lemma dual_max:  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1539  | 
"ord.max (op \<ge>) = min"  | 
| 46904 | 1540  | 
by (auto simp add: ord.max_def min_def fun_eq_iff)  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1541  | 
|
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1542  | 
lemma dual_min:  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1543  | 
"ord.min (op \<ge>) = max"  | 
| 46904 | 1544  | 
by (auto simp add: ord.min_def max_def fun_eq_iff)  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1545  | 
|
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1546  | 
lemma strict_below_fold1_iff:  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1547  | 
  assumes "finite A" and "A \<noteq> {}"
 | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1548  | 
shows "x < fold1 min A \<longleftrightarrow> (\<forall>a\<in>A. x < a)"  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1549  | 
proof -  | 
| 
29509
 
1ff0f3f08a7b
migrated class package to new locale implementation
 
haftmann 
parents: 
29223 
diff
changeset
 | 
1550  | 
interpret ab_semigroup_idem_mult min  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1551  | 
by (rule ab_semigroup_idem_mult_min)  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1552  | 
from assms show ?thesis  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1553  | 
by (induct rule: finite_ne_induct)  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1554  | 
(simp_all add: fold1_insert)  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1555  | 
qed  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1556  | 
|
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1557  | 
lemma fold1_below_iff:  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1558  | 
  assumes "finite A" and "A \<noteq> {}"
 | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1559  | 
shows "fold1 min A \<le> x \<longleftrightarrow> (\<exists>a\<in>A. a \<le> x)"  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1560  | 
proof -  | 
| 
29509
 
1ff0f3f08a7b
migrated class package to new locale implementation
 
haftmann 
parents: 
29223 
diff
changeset
 | 
1561  | 
interpret ab_semigroup_idem_mult min  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1562  | 
by (rule ab_semigroup_idem_mult_min)  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1563  | 
from assms show ?thesis  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1564  | 
by (induct rule: finite_ne_induct)  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1565  | 
(simp_all add: fold1_insert min_le_iff_disj)  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1566  | 
qed  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1567  | 
|
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1568  | 
lemma fold1_strict_below_iff:  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1569  | 
  assumes "finite A" and "A \<noteq> {}"
 | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1570  | 
shows "fold1 min A < x \<longleftrightarrow> (\<exists>a\<in>A. a < x)"  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1571  | 
proof -  | 
| 
29509
 
1ff0f3f08a7b
migrated class package to new locale implementation
 
haftmann 
parents: 
29223 
diff
changeset
 | 
1572  | 
interpret ab_semigroup_idem_mult min  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1573  | 
by (rule ab_semigroup_idem_mult_min)  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1574  | 
from assms show ?thesis  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1575  | 
by (induct rule: finite_ne_induct)  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1576  | 
(simp_all add: fold1_insert min_less_iff_disj)  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1577  | 
qed  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1578  | 
|
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1579  | 
lemma fold1_antimono:  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1580  | 
  assumes "A \<noteq> {}" and "A \<subseteq> B" and "finite B"
 | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1581  | 
shows "fold1 min B \<le> fold1 min A"  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1582  | 
proof cases  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1583  | 
assume "A = B" thus ?thesis by simp  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1584  | 
next  | 
| 
29509
 
1ff0f3f08a7b
migrated class package to new locale implementation
 
haftmann 
parents: 
29223 
diff
changeset
 | 
1585  | 
interpret ab_semigroup_idem_mult min  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1586  | 
by (rule ab_semigroup_idem_mult_min)  | 
| 41550 | 1587  | 
assume neq: "A \<noteq> B"  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1588  | 
have B: "B = A \<union> (B-A)" using `A \<subseteq> B` by blast  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1589  | 
have "fold1 min B = fold1 min (A \<union> (B-A))" by(subst B)(rule refl)  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1590  | 
also have "\<dots> = min (fold1 min A) (fold1 min (B-A))"  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1591  | 
proof -  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1592  | 
have "finite A" by(rule finite_subset[OF `A \<subseteq> B` `finite B`])  | 
| 41550 | 1593  | 
moreover have "finite(B-A)" by(rule finite_Diff[OF `finite B`])  | 
1594  | 
    moreover have "(B-A) \<noteq> {}" using assms neq by blast
 | 
|
1595  | 
    moreover have "A Int (B-A) = {}" using assms by blast
 | 
|
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1596  | 
    ultimately show ?thesis using `A \<noteq> {}` by (rule_tac fold1_Un)
 | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1597  | 
qed  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1598  | 
also have "\<dots> \<le> fold1 min A" by (simp add: min_le_iff_disj)  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1599  | 
finally show ?thesis .  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1600  | 
qed  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1601  | 
|
| 24427 | 1602  | 
lemma Min_in [simp]:  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1603  | 
  assumes "finite A" and "A \<noteq> {}"
 | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1604  | 
shows "Min A \<in> A"  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1605  | 
proof -  | 
| 
29509
 
1ff0f3f08a7b
migrated class package to new locale implementation
 
haftmann 
parents: 
29223 
diff
changeset
 | 
1606  | 
interpret ab_semigroup_idem_mult min  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1607  | 
by (rule ab_semigroup_idem_mult_min)  | 
| 
44890
 
22f665a2e91c
new fastforce replacing fastsimp - less confusing name
 
nipkow 
parents: 
44845 
diff
changeset
 | 
1608  | 
from assms fold1_in show ?thesis by (fastforce simp: Min_def min_def)  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1609  | 
qed  | 
| 15392 | 1610  | 
|
| 24427 | 1611  | 
lemma Max_in [simp]:  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1612  | 
  assumes "finite A" and "A \<noteq> {}"
 | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1613  | 
shows "Max A \<in> A"  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1614  | 
proof -  | 
| 
29509
 
1ff0f3f08a7b
migrated class package to new locale implementation
 
haftmann 
parents: 
29223 
diff
changeset
 | 
1615  | 
interpret ab_semigroup_idem_mult max  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1616  | 
by (rule ab_semigroup_idem_mult_max)  | 
| 
44890
 
22f665a2e91c
new fastforce replacing fastsimp - less confusing name
 
nipkow 
parents: 
44845 
diff
changeset
 | 
1617  | 
from assms fold1_in [of A] show ?thesis by (fastforce simp: Max_def max_def)  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1618  | 
qed  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1619  | 
|
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1620  | 
lemma Min_le [simp]:  | 
| 
26757
 
e775accff967
thms Max_ge, Min_le: dropped superfluous premise
 
haftmann 
parents: 
26748 
diff
changeset
 | 
1621  | 
assumes "finite A" and "x \<in> A"  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1622  | 
shows "Min A \<le> x"  | 
| 
32203
 
992ac8942691
adapted to localized interpretation of min/max-lattice
 
haftmann 
parents: 
32075 
diff
changeset
 | 
1623  | 
using assms by (simp add: Min_def min_max.fold1_belowI)  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1624  | 
|
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1625  | 
lemma Max_ge [simp]:  | 
| 
26757
 
e775accff967
thms Max_ge, Min_le: dropped superfluous premise
 
haftmann 
parents: 
26748 
diff
changeset
 | 
1626  | 
assumes "finite A" and "x \<in> A"  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1627  | 
shows "x \<le> Max A"  | 
| 44921 | 1628  | 
by (simp add: Max_def semilattice_inf.fold1_belowI [OF max_lattice] assms)  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1629  | 
|
| 
35828
 
46cfc4b8112e
now use "Named_Thms" for "noatp", and renamed "noatp" to "no_atp"
 
blanchet 
parents: 
35722 
diff
changeset
 | 
1630  | 
lemma Min_ge_iff [simp, no_atp]:  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1631  | 
  assumes "finite A" and "A \<noteq> {}"
 | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1632  | 
shows "x \<le> Min A \<longleftrightarrow> (\<forall>a\<in>A. x \<le> a)"  | 
| 
32203
 
992ac8942691
adapted to localized interpretation of min/max-lattice
 
haftmann 
parents: 
32075 
diff
changeset
 | 
1633  | 
using assms by (simp add: Min_def min_max.below_fold1_iff)  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1634  | 
|
| 
35828
 
46cfc4b8112e
now use "Named_Thms" for "noatp", and renamed "noatp" to "no_atp"
 
blanchet 
parents: 
35722 
diff
changeset
 | 
1635  | 
lemma Max_le_iff [simp, no_atp]:  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1636  | 
  assumes "finite A" and "A \<noteq> {}"
 | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1637  | 
shows "Max A \<le> x \<longleftrightarrow> (\<forall>a\<in>A. a \<le> x)"  | 
| 44921 | 1638  | 
by (simp add: Max_def semilattice_inf.below_fold1_iff [OF max_lattice] assms)  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1639  | 
|
| 
35828
 
46cfc4b8112e
now use "Named_Thms" for "noatp", and renamed "noatp" to "no_atp"
 
blanchet 
parents: 
35722 
diff
changeset
 | 
1640  | 
lemma Min_gr_iff [simp, no_atp]:  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1641  | 
  assumes "finite A" and "A \<noteq> {}"
 | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1642  | 
shows "x < Min A \<longleftrightarrow> (\<forall>a\<in>A. x < a)"  | 
| 
32203
 
992ac8942691
adapted to localized interpretation of min/max-lattice
 
haftmann 
parents: 
32075 
diff
changeset
 | 
1643  | 
using assms by (simp add: Min_def strict_below_fold1_iff)  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1644  | 
|
| 
35828
 
46cfc4b8112e
now use "Named_Thms" for "noatp", and renamed "noatp" to "no_atp"
 
blanchet 
parents: 
35722 
diff
changeset
 | 
1645  | 
lemma Max_less_iff [simp, no_atp]:  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1646  | 
  assumes "finite A" and "A \<noteq> {}"
 | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1647  | 
shows "Max A < x \<longleftrightarrow> (\<forall>a\<in>A. a < x)"  | 
| 44921 | 1648  | 
by (simp add: Max_def linorder.dual_max [OF dual_linorder]  | 
1649  | 
linorder.strict_below_fold1_iff [OF dual_linorder] assms)  | 
|
| 18493 | 1650  | 
|
| 
35828
 
46cfc4b8112e
now use "Named_Thms" for "noatp", and renamed "noatp" to "no_atp"
 
blanchet 
parents: 
35722 
diff
changeset
 | 
1651  | 
lemma Min_le_iff [no_atp]:  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1652  | 
  assumes "finite A" and "A \<noteq> {}"
 | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1653  | 
shows "Min A \<le> x \<longleftrightarrow> (\<exists>a\<in>A. a \<le> x)"  | 
| 
32203
 
992ac8942691
adapted to localized interpretation of min/max-lattice
 
haftmann 
parents: 
32075 
diff
changeset
 | 
1654  | 
using assms by (simp add: Min_def fold1_below_iff)  | 
| 
15497
 
53bca254719a
Added semi-lattice locales and reorganized fold1 lemmas
 
nipkow 
parents: 
15487 
diff
changeset
 | 
1655  | 
|
| 
35828
 
46cfc4b8112e
now use "Named_Thms" for "noatp", and renamed "noatp" to "no_atp"
 
blanchet 
parents: 
35722 
diff
changeset
 | 
1656  | 
lemma Max_ge_iff [no_atp]:  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1657  | 
  assumes "finite A" and "A \<noteq> {}"
 | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1658  | 
shows "x \<le> Max A \<longleftrightarrow> (\<exists>a\<in>A. x \<le> a)"  | 
| 44921 | 1659  | 
by (simp add: Max_def linorder.dual_max [OF dual_linorder]  | 
1660  | 
linorder.fold1_below_iff [OF dual_linorder] assms)  | 
|
| 22917 | 1661  | 
|
| 
35828
 
46cfc4b8112e
now use "Named_Thms" for "noatp", and renamed "noatp" to "no_atp"
 
blanchet 
parents: 
35722 
diff
changeset
 | 
1662  | 
lemma Min_less_iff [no_atp]:  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1663  | 
  assumes "finite A" and "A \<noteq> {}"
 | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1664  | 
shows "Min A < x \<longleftrightarrow> (\<exists>a\<in>A. a < x)"  | 
| 
32203
 
992ac8942691
adapted to localized interpretation of min/max-lattice
 
haftmann 
parents: 
32075 
diff
changeset
 | 
1665  | 
using assms by (simp add: Min_def fold1_strict_below_iff)  | 
| 22917 | 1666  | 
|
| 
35828
 
46cfc4b8112e
now use "Named_Thms" for "noatp", and renamed "noatp" to "no_atp"
 
blanchet 
parents: 
35722 
diff
changeset
 | 
1667  | 
lemma Max_gr_iff [no_atp]:  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1668  | 
  assumes "finite A" and "A \<noteq> {}"
 | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1669  | 
shows "x < Max A \<longleftrightarrow> (\<exists>a\<in>A. x < a)"  | 
| 44921 | 1670  | 
by (simp add: Max_def linorder.dual_max [OF dual_linorder]  | 
1671  | 
linorder.fold1_strict_below_iff [OF dual_linorder] assms)  | 
|
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1672  | 
|
| 30325 | 1673  | 
lemma Min_eqI:  | 
1674  | 
assumes "finite A"  | 
|
1675  | 
assumes "\<And>y. y \<in> A \<Longrightarrow> y \<ge> x"  | 
|
1676  | 
and "x \<in> A"  | 
|
1677  | 
shows "Min A = x"  | 
|
1678  | 
proof (rule antisym)  | 
|
1679  | 
  from `x \<in> A` have "A \<noteq> {}" by auto
 | 
|
1680  | 
with assms show "Min A \<ge> x" by simp  | 
|
1681  | 
next  | 
|
1682  | 
from assms show "x \<ge> Min A" by simp  | 
|
1683  | 
qed  | 
|
1684  | 
||
1685  | 
lemma Max_eqI:  | 
|
1686  | 
assumes "finite A"  | 
|
1687  | 
assumes "\<And>y. y \<in> A \<Longrightarrow> y \<le> x"  | 
|
1688  | 
and "x \<in> A"  | 
|
1689  | 
shows "Max A = x"  | 
|
1690  | 
proof (rule antisym)  | 
|
1691  | 
  from `x \<in> A` have "A \<noteq> {}" by auto
 | 
|
1692  | 
with assms show "Max A \<le> x" by simp  | 
|
1693  | 
next  | 
|
1694  | 
from assms show "x \<le> Max A" by simp  | 
|
1695  | 
qed  | 
|
1696  | 
||
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1697  | 
lemma Min_antimono:  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1698  | 
  assumes "M \<subseteq> N" and "M \<noteq> {}" and "finite N"
 | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1699  | 
shows "Min N \<le> Min M"  | 
| 
32203
 
992ac8942691
adapted to localized interpretation of min/max-lattice
 
haftmann 
parents: 
32075 
diff
changeset
 | 
1700  | 
using assms by (simp add: Min_def fold1_antimono)  | 
| 
26041
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1701  | 
|
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1702  | 
lemma Max_mono:  | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1703  | 
  assumes "M \<subseteq> N" and "M \<noteq> {}" and "finite N"
 | 
| 
 
c2e15e65165f
locales ACf, ACIf, ACIfSL and ACIfSLlin have been abandoned in favour of the existing algebraic classes ab_semigroup_mult, ab_semigroup_idem_mult, lower_semilattice (resp. uper_semilattice) and linorder
 
haftmann 
parents: 
25571 
diff
changeset
 | 
1704  | 
shows "Max M \<le> Max N"  | 
| 44921 | 1705  | 
by (simp add: Max_def linorder.dual_max [OF dual_linorder]  | 
1706  | 
linorder.fold1_antimono [OF dual_linorder] assms)  | 
|
| 22917 | 1707  | 
|
| 32006 | 1708  | 
lemma finite_linorder_max_induct[consumes 1, case_names empty insert]:  | 
| 
36079
 
fa0e354e6a39
simplified induction case in finite_psubset_induct; tuned the proof that uses this induction principle
 
Christian Urban <urbanc@in.tum.de> 
parents: 
35938 
diff
changeset
 | 
1709  | 
assumes fin: "finite A"  | 
| 
 
fa0e354e6a39
simplified induction case in finite_psubset_induct; tuned the proof that uses this induction principle
 
Christian Urban <urbanc@in.tum.de> 
parents: 
35938 
diff
changeset
 | 
1710  | 
 and   empty: "P {}" 
 | 
| 
 
fa0e354e6a39
simplified induction case in finite_psubset_induct; tuned the proof that uses this induction principle
 
Christian Urban <urbanc@in.tum.de> 
parents: 
35938 
diff
changeset
 | 
1711  | 
and insert: "(!!b A. finite A \<Longrightarrow> ALL a:A. a < b \<Longrightarrow> P A \<Longrightarrow> P(insert b A))"  | 
| 
 
fa0e354e6a39
simplified induction case in finite_psubset_induct; tuned the proof that uses this induction principle
 
Christian Urban <urbanc@in.tum.de> 
parents: 
35938 
diff
changeset
 | 
1712  | 
shows "P A"  | 
| 
 
fa0e354e6a39
simplified induction case in finite_psubset_induct; tuned the proof that uses this induction principle
 
Christian Urban <urbanc@in.tum.de> 
parents: 
35938 
diff
changeset
 | 
1713  | 
using fin empty insert  | 
| 32006 | 1714  | 
proof (induct rule: finite_psubset_induct)  | 
| 
36079
 
fa0e354e6a39
simplified induction case in finite_psubset_induct; tuned the proof that uses this induction principle
 
Christian Urban <urbanc@in.tum.de> 
parents: 
35938 
diff
changeset
 | 
1715  | 
case (psubset A)  | 
| 
 
fa0e354e6a39
simplified induction case in finite_psubset_induct; tuned the proof that uses this induction principle
 
Christian Urban <urbanc@in.tum.de> 
parents: 
35938 
diff
changeset
 | 
1716  | 
  have IH: "\<And>B. \<lbrakk>B < A; P {}; (\<And>A b. \<lbrakk>finite A; \<forall>a\<in>A. a<b; P A\<rbrakk> \<Longrightarrow> P (insert b A))\<rbrakk> \<Longrightarrow> P B" by fact 
 | 
| 
 
fa0e354e6a39
simplified induction case in finite_psubset_induct; tuned the proof that uses this induction principle
 
Christian Urban <urbanc@in.tum.de> 
parents: 
35938 
diff
changeset
 | 
1717  | 
have fin: "finite A" by fact  | 
| 
 
fa0e354e6a39
simplified induction case in finite_psubset_induct; tuned the proof that uses this induction principle
 
Christian Urban <urbanc@in.tum.de> 
parents: 
35938 
diff
changeset
 | 
1718  | 
  have empty: "P {}" by fact
 | 
| 
 
fa0e354e6a39
simplified induction case in finite_psubset_induct; tuned the proof that uses this induction principle
 
Christian Urban <urbanc@in.tum.de> 
parents: 
35938 
diff
changeset
 | 
1719  | 
have step: "\<And>b A. \<lbrakk>finite A; \<forall>a\<in>A. a < b; P A\<rbrakk> \<Longrightarrow> P (insert b A)" by fact  | 
| 
26748
 
4d51ddd6aa5c
Merged theories about wellfoundedness into one: Wellfounded.thy
 
krauss 
parents: 
26465 
diff
changeset
 | 
1720  | 
show "P A"  | 
| 
26757
 
e775accff967
thms Max_ge, Min_le: dropped superfluous premise
 
haftmann 
parents: 
26748 
diff
changeset
 | 
1721  | 
  proof (cases "A = {}")
 | 
| 
36079
 
fa0e354e6a39
simplified induction case in finite_psubset_induct; tuned the proof that uses this induction principle
 
Christian Urban <urbanc@in.tum.de> 
parents: 
35938 
diff
changeset
 | 
1722  | 
    assume "A = {}" 
 | 
| 
 
fa0e354e6a39
simplified induction case in finite_psubset_induct; tuned the proof that uses this induction principle
 
Christian Urban <urbanc@in.tum.de> 
parents: 
35938 
diff
changeset
 | 
1723  | 
    then show "P A" using `P {}` by simp
 | 
| 
26748
 
4d51ddd6aa5c
Merged theories about wellfoundedness into one: Wellfounded.thy
 
krauss 
parents: 
26465 
diff
changeset
 | 
1724  | 
next  | 
| 
36079
 
fa0e354e6a39
simplified induction case in finite_psubset_induct; tuned the proof that uses this induction principle
 
Christian Urban <urbanc@in.tum.de> 
parents: 
35938 
diff
changeset
 | 
1725  | 
    let ?B = "A - {Max A}" 
 | 
| 
 
fa0e354e6a39
simplified induction case in finite_psubset_induct; tuned the proof that uses this induction principle
 
Christian Urban <urbanc@in.tum.de> 
parents: 
35938 
diff
changeset
 | 
1726  | 
let ?A = "insert (Max A) ?B"  | 
| 
 
fa0e354e6a39
simplified induction case in finite_psubset_induct; tuned the proof that uses this induction principle
 
Christian Urban <urbanc@in.tum.de> 
parents: 
35938 
diff
changeset
 | 
1727  | 
have "finite ?B" using `finite A` by simp  | 
| 
26748
 
4d51ddd6aa5c
Merged theories about wellfoundedness into one: Wellfounded.thy
 
krauss 
parents: 
26465 
diff
changeset
 | 
1728  | 
    assume "A \<noteq> {}"
 | 
| 
 
4d51ddd6aa5c
Merged theories about wellfoundedness into one: Wellfounded.thy
 
krauss 
parents: 
26465 
diff
changeset
 | 
1729  | 
with `finite A` have "Max A : A" by auto  | 
| 
36079
 
fa0e354e6a39
simplified induction case in finite_psubset_induct; tuned the proof that uses this induction principle
 
Christian Urban <urbanc@in.tum.de> 
parents: 
35938 
diff
changeset
 | 
1730  | 
then have A: "?A = A" using insert_Diff_single insert_absorb by auto  | 
| 
 
fa0e354e6a39
simplified induction case in finite_psubset_induct; tuned the proof that uses this induction principle
 
Christian Urban <urbanc@in.tum.de> 
parents: 
35938 
diff
changeset
 | 
1731  | 
    then have "P ?B" using `P {}` step IH[of ?B] by blast
 | 
| 
 
fa0e354e6a39
simplified induction case in finite_psubset_induct; tuned the proof that uses this induction principle
 
Christian Urban <urbanc@in.tum.de> 
parents: 
35938 
diff
changeset
 | 
1732  | 
moreover  | 
| 
44890
 
22f665a2e91c
new fastforce replacing fastsimp - less confusing name
 
nipkow 
parents: 
44845 
diff
changeset
 | 
1733  | 
have "\<forall>a\<in>?B. a < Max A" using Max_ge [OF `finite A`] by fastforce  | 
| 
 
22f665a2e91c
new fastforce replacing fastsimp - less confusing name
 
nipkow 
parents: 
44845 
diff
changeset
 | 
1734  | 
ultimately show "P A" using A insert_Diff_single step[OF `finite ?B`] by fastforce  | 
| 
26748
 
4d51ddd6aa5c
Merged theories about wellfoundedness into one: Wellfounded.thy
 
krauss 
parents: 
26465 
diff
changeset
 | 
1735  | 
qed  | 
| 
 
4d51ddd6aa5c
Merged theories about wellfoundedness into one: Wellfounded.thy
 
krauss 
parents: 
26465 
diff
changeset
 | 
1736  | 
qed  | 
| 
 
4d51ddd6aa5c
Merged theories about wellfoundedness into one: Wellfounded.thy
 
krauss 
parents: 
26465 
diff
changeset
 | 
1737  | 
|
| 32006 | 1738  | 
lemma finite_linorder_min_induct[consumes 1, case_names empty insert]:  | 
| 33434 | 1739  | 
 "\<lbrakk>finite A; P {}; \<And>b A. \<lbrakk>finite A; \<forall>a\<in>A. b < a; P A\<rbrakk> \<Longrightarrow> P (insert b A)\<rbrakk> \<Longrightarrow> P A"
 | 
| 32006 | 1740  | 
by(rule linorder.finite_linorder_max_induct[OF dual_linorder])  | 
1741  | 
||
| 22917 | 1742  | 
end  | 
1743  | 
||
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34223 
diff
changeset
 | 
1744  | 
context linordered_ab_semigroup_add  | 
| 22917 | 1745  | 
begin  | 
1746  | 
||
1747  | 
lemma add_Min_commute:  | 
|
1748  | 
fixes k  | 
|
| 25062 | 1749  | 
  assumes "finite N" and "N \<noteq> {}"
 | 
1750  | 
  shows "k + Min N = Min {k + m | m. m \<in> N}"
 | 
|
1751  | 
proof -  | 
|
1752  | 
have "\<And>x y. k + min x y = min (k + x) (k + y)"  | 
|
1753  | 
by (simp add: min_def not_le)  | 
|
1754  | 
(blast intro: antisym less_imp_le add_left_mono)  | 
|
1755  | 
with assms show ?thesis  | 
|
1756  | 
using hom_Min_commute [of "plus k" N]  | 
|
1757  | 
by simp (blast intro: arg_cong [where f = Min])  | 
|
1758  | 
qed  | 
|
| 22917 | 1759  | 
|
1760  | 
lemma add_Max_commute:  | 
|
1761  | 
fixes k  | 
|
| 25062 | 1762  | 
  assumes "finite N" and "N \<noteq> {}"
 | 
1763  | 
  shows "k + Max N = Max {k + m | m. m \<in> N}"
 | 
|
1764  | 
proof -  | 
|
1765  | 
have "\<And>x y. k + max x y = max (k + x) (k + y)"  | 
|
1766  | 
by (simp add: max_def not_le)  | 
|
1767  | 
(blast intro: antisym less_imp_le add_left_mono)  | 
|
1768  | 
with assms show ?thesis  | 
|
1769  | 
using hom_Max_commute [of "plus k" N]  | 
|
1770  | 
by simp (blast intro: arg_cong [where f = Max])  | 
|
1771  | 
qed  | 
|
| 22917 | 1772  | 
|
1773  | 
end  | 
|
1774  | 
||
| 35034 | 1775  | 
context linordered_ab_group_add  | 
1776  | 
begin  | 
|
1777  | 
||
1778  | 
lemma minus_Max_eq_Min [simp]:  | 
|
1779  | 
  "finite S \<Longrightarrow> S \<noteq> {} \<Longrightarrow> - (Max S) = Min (uminus ` S)"
 | 
|
1780  | 
by (induct S rule: finite_ne_induct) (simp_all add: minus_max_eq_min)  | 
|
1781  | 
||
1782  | 
lemma minus_Min_eq_Max [simp]:  | 
|
1783  | 
  "finite S \<Longrightarrow> S \<noteq> {} \<Longrightarrow> - (Min S) = Max (uminus ` S)"
 | 
|
1784  | 
by (induct S rule: finite_ne_induct) (simp_all add: minus_min_eq_max)  | 
|
1785  | 
||
1786  | 
end  | 
|
1787  | 
||
| 
25571
 
c9e39eafc7a0
instantiation target rather than legacy instance
 
haftmann 
parents: 
25502 
diff
changeset
 | 
1788  | 
end  |