1 (* ========================================================================= *)
2 (* Inclusion-exclusion principle, the usual and generalized forms. *)
3 (* ========================================================================= *)
5 (* ------------------------------------------------------------------------- *)
6 (* Simple set theory lemmas. *)
7 (* ------------------------------------------------------------------------- *)
9 let SUBSET_INSERT_EXISTS = prove
10 (`!s x:A t. s SUBSET (x INSERT t) <=>
11 s SUBSET t \/ ?u. u SUBSET t /\ s = x INSERT u`,
12 REPEAT GEN_TAC THEN EQ_TAC THENL [ALL_TAC; SET_TAC[]] THEN
13 MATCH_MP_TAC(TAUT `(a /\ ~b ==> c) ==> a ==> b \/ c`) THEN
14 DISCH_TAC THEN EXISTS_TAC `s DELETE (x:A)` THEN ASM SET_TAC[]);;
16 let FINITE_SUBSETS_RESTRICT = prove
17 (`!s:A->bool p. FINITE s ==> FINITE {t | t SUBSET s /\ p t}`,
18 REPEAT STRIP_TAC THEN MATCH_MP_TAC FINITE_SUBSET THEN
19 EXISTS_TAC `{t:A->bool | t SUBSET s}` THEN
20 ASM_SIMP_TAC[FINITE_POWERSET] THEN SET_TAC[]);;
22 (* ------------------------------------------------------------------------- *)
23 (* Versions for additive real functions, where the additivity applies only *)
24 (* to some specific subsets (e.g. cardinality of finite sets, measurable *)
25 (* sets with bounded measure). *)
26 (* ------------------------------------------------------------------------- *)
28 let INCLUSION_EXCLUSION_REAL_RESTRICTED_INDEXED = prove
29 (`!P (f:(A->bool)->real) (A:I->bool) (x:I->(A->bool)).
30 (!s t. P s /\ P t /\ DISJOINT s t
31 ==> f(s UNION t) = f(s) + f(t)) /\
33 (!s t. P s /\ P t ==> P(s INTER t) /\ P(s UNION t) /\ P(s DIFF t)) /\
34 FINITE A /\ (!a. a IN A ==> P(x a))
35 ==> f(UNIONS(IMAGE x A)) =
36 sum {B | B SUBSET A /\ ~(B = {})}
37 (\B. (-- &1) pow (CARD B + 1) * f(INTERS(IMAGE x B)))`,
39 (`{t | t SUBSET (a INSERT s) /\ P t} =
40 {t | t SUBSET s /\ P t} UNION
41 {a INSERT t |t| t SUBSET s /\ P(a INSERT t)}`,
42 REWRITE_TAC[SUBSET_INSERT_EXISTS] THEN
43 GEN_REWRITE_TAC I [EXTENSION] THEN
44 REWRITE_TAC[IN_ELIM_THM; IN_UNION] THEN MESON_TAC[]) in
45 REWRITE_TAC[IMP_CONJ; RIGHT_FORALL_IMP_THM] THEN
46 REPEAT GEN_TAC THEN REWRITE_TAC[IMP_IMP; GSYM CONJ_ASSOC] THEN
47 GEN_REWRITE_TAC (LAND_CONV o ONCE_DEPTH_CONV) [RIGHT_IMP_FORALL_THM] THEN
48 REWRITE_TAC[IMP_IMP] THEN STRIP_TAC THEN
49 MATCH_MP_TAC(MESON[HAS_SIZE]
50 `(!n s. s HAS_SIZE n ==> P s) ==> (!s. FINITE s ==> P s)`) THEN
51 MATCH_MP_TAC num_WF THEN MATCH_MP_TAC num_INDUCTION THEN
52 REWRITE_TAC[HAS_SIZE_CLAUSES; LEFT_IMP_EXISTS_THM] THEN CONJ_TAC THENL
53 [DISCH_THEN(K ALL_TAC) THEN GEN_TAC THEN DISCH_THEN SUBST1_TAC THEN
54 REWRITE_TAC[UNIONS_0; IMAGE_CLAUSES; SUBSET_EMPTY; TAUT `~(p /\ ~p)`] THEN
55 ASM_REWRITE_TAC[EMPTY_GSPEC; SUM_CLAUSES] THEN REPEAT STRIP_TAC THEN
56 REPEAT(FIRST_X_ASSUM(MP_TAC o SPECL [`{}:A->bool`; `{}:A->bool`])) THEN
57 ASM_SIMP_TAC[UNION_EMPTY; DISJOINT_EMPTY] THEN REAL_ARITH_TAC;
59 X_GEN_TAC `n:num` THEN DISCH_THEN(K ALL_TAC) THEN DISCH_TAC THEN
60 MAP_EVERY X_GEN_TAC [`A0:I->bool`; `a:I`; `A:I->bool`] THEN
61 REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
62 DISCH_THEN SUBST1_TAC THEN X_GEN_TAC `x:I->A->bool` THEN
63 REWRITE_TAC[FORALL_IN_INSERT] THEN STRIP_TAC THEN
64 REWRITE_TAC[IMAGE_CLAUSES; UNIONS_INSERT] THEN MATCH_MP_TAC EQ_TRANS THEN
65 EXISTS_TAC `(f(x a) + f(UNIONS (IMAGE (x:I->(A->bool)) A))) -
66 f(x a INTER UNIONS (IMAGE x A)):real` THEN
69 `P(x a) /\ P(UNIONS(IMAGE (x:I->(A->bool)) A))`
71 [ASM_REWRITE_TAC[] THEN
72 UNDISCH_TAC `!b. b IN A ==> P((x:I->(A->bool)) b)` THEN
73 SUBGOAL_THEN `FINITE(A:I->bool)` MP_TAC THENL
74 [ASM_MESON_TAC[HAS_SIZE]; ALL_TAC] THEN
75 SPEC_TAC(`A:I->bool`,`u:I->bool`) THEN
76 MATCH_MP_TAC FINITE_INDUCT_STRONG THEN
77 ASM_SIMP_TAC[IMAGE_CLAUSES; UNIONS_0; UNIONS_INSERT; FORALL_IN_INSERT];
78 SPEC_TAC(`UNIONS(IMAGE (x:I->(A->bool)) A)`,`t:A->bool`) THEN
79 SPEC_TAC(`(x:I->(A->bool)) a`,`s:A->bool`) THEN
81 UNDISCH_TAC `!s t:A->bool. P s /\ P t /\ DISJOINT s t
82 ==> f(s UNION t):real = f(s) + f(t)` THEN
84 MP_TAC(ISPECL [`s INTER t:A->bool`; `t DIFF s:A->bool`] th) THEN
85 MP_TAC(ISPECL [`s:A->bool`; `t DIFF s:A->bool`] th)) THEN
86 ASM_SIMP_TAC[SET_RULE `s UNION (t DIFF s) = s UNION t`;
87 SET_RULE `(s INTER t) UNION (t DIFF s) = t`] THEN
88 REPEAT(ANTS_TAC THENL [SET_TAC[]; DISCH_TAC]) THEN ASM_REAL_ARITH_TAC];
90 REWRITE_TAC[INTER_UNIONS; SIMPLE_IMAGE; GSYM IMAGE_o; o_DEF] THEN
91 FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN REWRITE_TAC[LT] THEN
92 DISCH_THEN(MP_TAC o SPEC `A:I->bool`) THEN ASM_REWRITE_TAC[] THEN
94 MP_TAC(ISPEC `\s. (x:I->(A->bool)) a INTER x s` th) THEN
95 MP_TAC(ISPEC `x:I->(A->bool)` th)) THEN
96 ASM_SIMP_TAC[] THEN REPEAT(DISCH_THEN SUBST1_TAC) THEN
97 FIRST_ASSUM(ASSUME_TAC o GEN_REWRITE_RULE I [HAS_SIZE]) THEN
98 REWRITE_TAC[lemma] THEN
99 W(MP_TAC o PART_MATCH (lhand o rand) SUM_UNION o rand o snd) THEN
101 [ONCE_REWRITE_TAC[SIMPLE_IMAGE_GEN] THEN
102 ASM_SIMP_TAC[FINITE_SUBSETS_RESTRICT; FINITE_IMAGE] THEN
103 REWRITE_TAC[GSYM SIMPLE_IMAGE_GEN] THEN
104 REWRITE_TAC[IN_DISJOINT; EXISTS_IN_GSPEC] THEN
105 ONCE_REWRITE_TAC[CONJ_SYM] THEN
106 REWRITE_TAC[EXISTS_IN_GSPEC] THEN ASM SET_TAC[];
107 DISCH_THEN SUBST1_TAC] THEN
108 REWRITE_TAC[NOT_INSERT_EMPTY; REAL_ARITH
109 `(fa + s) - fas:real = s + s' <=> fa - fas = s'`] THEN
110 MATCH_MP_TAC EQ_TRANS THEN
111 EXISTS_TAC `f((x:I->(A->bool)) a) +
112 sum {B | B SUBSET A /\ ~(B = {})}
113 (\B. --(&1) pow (CARD B) *
114 f(INTERS(IMAGE x (a INSERT B))))` THEN
116 [REWRITE_TAC[REAL_ARITH `x - a:real = x + b <=> b = --a`] THEN
117 REWRITE_TAC[GSYM SUM_NEG] THEN MATCH_MP_TAC SUM_EQ THEN
118 REWRITE_TAC[IMAGE_CLAUSES; INTERS_INSERT; o_DEF; FORALL_IN_GSPEC] THEN
119 REWRITE_TAC[] THEN REPEAT STRIP_TAC THEN
120 REWRITE_TAC[REAL_POW_ADD; REAL_POW_1; REAL_MUL_RNEG; REAL_MUL_LNEG] THEN
121 REWRITE_TAC[REAL_NEG_NEG; REAL_MUL_RID] THEN AP_TERM_TAC THEN
122 AP_TERM_TAC THEN REWRITE_TAC[INTERS_IMAGE] THEN ASM SET_TAC[];
123 REWRITE_TAC[SET_RULE `{s | P s /\ ~(s = e)} = {s | P s} DELETE e`] THEN
124 ASM_SIMP_TAC[SUM_DELETE_CASES; GSYM DELETE; FINITE_POWERSET] THEN
125 REWRITE_TAC[IN_ELIM_THM; EMPTY_SUBSET; IMAGE_CLAUSES] THEN
126 GEN_REWRITE_TAC (RAND_CONV o ONCE_DEPTH_CONV) [SIMPLE_IMAGE_GEN] THEN
127 W(MP_TAC o PART_MATCH (lhand o rand) SUM_IMAGE o rand o snd) THEN
128 ANTS_TAC THENL [ASM SET_TAC[]; DISCH_THEN SUBST1_TAC] THEN
129 REWRITE_TAC[o_DEF; INTERS_1; CARD_CLAUSES; real_pow; REAL_MUL_LID] THEN
130 REWRITE_TAC[REAL_SUB_ADD2] THEN MATCH_MP_TAC SUM_EQ THEN
131 REWRITE_TAC[FORALL_IN_GSPEC; REAL_POW_ADD; REAL_POW_1] THEN
132 X_GEN_TAC `B:I->bool` THEN DISCH_TAC THEN
133 SUBGOAL_THEN `FINITE(B:I->bool)` ASSUME_TAC THENL
134 [ASM_MESON_TAC[FINITE_SUBSET]; ALL_TAC] THEN
135 ASM_SIMP_TAC[CARD_CLAUSES; REAL_POW_ADD; real_pow] THEN
136 COND_CASES_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
137 REWRITE_TAC[IMAGE_CLAUSES; real_pow] THEN REAL_ARITH_TAC]);;
139 let INCLUSION_EXCLUSION_REAL_RESTRICTED = prove
140 (`!P (f:(A->bool)->real) (A:(A->bool)->bool).
141 (!s t. P s /\ P t /\ DISJOINT s t
142 ==> f(s UNION t) = f(s) + f(t)) /\
144 (!s t. P s /\ P t ==> P(s INTER t) /\ P(s UNION t) /\ P(s DIFF t)) /\
145 FINITE A /\ (!a. a IN A ==> P(a))
147 sum {B | B SUBSET A /\ ~(B = {})}
148 (\B. (-- &1) pow (CARD B + 1) * f(INTERS B))`,
149 REPEAT STRIP_TAC THEN
150 MP_TAC(ISPECL [`P:(A->bool)->bool`; `f:(A->bool)->real`;
151 `A:(A->bool)->bool`; `\x:A->bool. x`]
152 INCLUSION_EXCLUSION_REAL_RESTRICTED_INDEXED) THEN
153 ASM_REWRITE_TAC[IMAGE_ID]);;
155 (* ------------------------------------------------------------------------- *)
156 (* Versions for unrestrictedly additive functions. *)
157 (* ------------------------------------------------------------------------- *)
159 let INCLUSION_EXCLUSION_REAL_INDEXED = prove
160 (`!(f:(A->bool)->real) (A:I->bool) (x:I->(A->bool)).
161 (!s t. DISJOINT s t ==> f(s UNION t) = f(s) + f(t)) /\ FINITE A
162 ==> f(UNIONS(IMAGE x A)) =
163 sum {B | B SUBSET A /\ ~(B = {})}
164 (\B. (-- &1) pow (CARD B + 1) * f(INTERS(IMAGE x B)))`,
166 `\x:A->bool. T` INCLUSION_EXCLUSION_REAL_RESTRICTED_INDEXED) THEN
169 let INCLUSION_EXCLUSION_REAL = prove
170 (`!(f:(A->bool)->real) (A:(A->bool)->bool).
171 (!s t. DISJOINT s t ==> f(s UNION t) = f(s) + f(t)) /\ FINITE A
173 sum {B | B SUBSET A /\ ~(B = {})}
174 (\B. (-- &1) pow (CARD B + 1) * f(INTERS B))`,
175 REPEAT STRIP_TAC THEN
176 MP_TAC(ISPECL [`f:(A->bool)->real`; `A:(A->bool)->bool`; `\x:A->bool. x`]
177 INCLUSION_EXCLUSION_REAL_INDEXED) THEN
178 ASM_REWRITE_TAC[IMAGE_ID]);;
180 (* ------------------------------------------------------------------------- *)
181 (* Special case of cardinality, the most common case. *)
182 (* ------------------------------------------------------------------------- *)
184 let INCLUSION_EXCLUSION = prove
185 (`!s:(A->bool)->bool.
186 FINITE s /\ (!k. k IN s ==> FINITE k)
187 ==> &(CARD(UNIONS s)) =
188 sum {t | t SUBSET s /\ ~(t = {})}
189 (\t. (-- &1) pow (CARD t + 1) * &(CARD(INTERS t)))`,
190 REPEAT STRIP_TAC THEN MP_TAC(ISPECL
191 [`\s:A->bool. FINITE s`; `\s:A->bool. &(CARD s)`;
192 `s:(A->bool)->bool`] INCLUSION_EXCLUSION_REAL_RESTRICTED) THEN
193 ASM_SIMP_TAC[FINITE_INTER; FINITE_UNION; FINITE_DIFF; FINITE_EMPTY] THEN
194 DISCH_THEN MATCH_MP_TAC THEN
195 SIMP_TAC[CARD_UNION; DISJOINT; REAL_OF_NUM_ADD]);;
197 (* ------------------------------------------------------------------------- *)
198 (* A more conventional form. *)
199 (* ------------------------------------------------------------------------- *)
201 let INCLUSION_EXCLUSION_USUAL = prove
202 (`!s:(A->bool)->bool.
203 FINITE s /\ (!k. k IN s ==> FINITE k)
204 ==> &(CARD(UNIONS s)) =
205 sum (1..CARD s) (\n. (-- &1) pow (n + 1) *
206 sum {t | t SUBSET s /\ t HAS_SIZE n}
207 (\t. &(CARD(INTERS t))))`,
208 REPEAT STRIP_TAC THEN ASM_SIMP_TAC[INCLUSION_EXCLUSION] THEN
209 W(MP_TAC o PART_MATCH (lhs o rand) (ISPEC `CARD` SUM_IMAGE_GEN) o
211 ASM_SIMP_TAC[FINITE_SUBSETS_RESTRICT] THEN DISCH_THEN SUBST1_TAC THEN
212 MATCH_MP_TAC(MESON[] `s = t /\ sum t f = sum t g ==> sum s f = sum t g`) THEN
214 [GEN_REWRITE_TAC I [EXTENSION] THEN
215 REWRITE_TAC[IN_IMAGE; IN_NUMSEG; IN_ELIM_THM] THEN
216 REWRITE_TAC[ARITH_RULE `1 <= a <=> ~(a = 0)`] THEN
217 ASM_MESON_TAC[CHOOSE_SUBSET; CARD_SUBSET; FINITE_SUBSET; CARD_EQ_0;
220 MATCH_MP_TAC SUM_EQ THEN X_GEN_TAC `n:num` THEN REWRITE_TAC[IN_NUMSEG] THEN
221 STRIP_TAC THEN REWRITE_TAC[SUM_LMUL] THEN AP_TERM_TAC THEN
222 AP_THM_TAC THEN AP_TERM_TAC THEN REWRITE_TAC[IN_ELIM_THM; HAS_SIZE] THEN
223 GEN_REWRITE_TAC I [EXTENSION] THEN REWRITE_TAC[IN_ELIM_THM] THEN
224 ASM_MESON_TAC[CARD_EQ_0; ARITH_RULE `~(1 <= 0)`; FINITE_SUBSET]);;
226 (* ------------------------------------------------------------------------- *)
227 (* A combinatorial lemma about subsets of a finite set. *)
228 (* ------------------------------------------------------------------------- *)
230 let FINITE_SUBSETS_RESTRICT = prove
231 (`!s:A->bool p. FINITE s ==> FINITE {t | t SUBSET s /\ p t}`,
232 REPEAT STRIP_TAC THEN MATCH_MP_TAC FINITE_SUBSET THEN
233 EXISTS_TAC `{t:A->bool | t SUBSET s}` THEN
234 ASM_SIMP_TAC[FINITE_POWERSET] THEN SET_TAC[]);;
236 let CARD_ADJUST_LEMMA = prove
239 (!x y. x IN s /\ y IN s /\ f x = f y ==> x = y) /\
240 x = y + CARD (IMAGE f s)
242 MESON_TAC[CARD_IMAGE_INJ]);;
244 let CARD_SUBSETS_STEP = prove
245 (`!x:A s. FINITE s /\ ~(x IN s) /\ u SUBSET s
246 ==> CARD {t | t SUBSET (x INSERT s) /\ u SUBSET t /\ ODD(CARD t)} =
247 CARD {t | t SUBSET s /\ u SUBSET t /\ ODD(CARD t)} +
248 CARD {t | t SUBSET s /\ u SUBSET t /\ EVEN(CARD t)} /\
249 CARD {t | t SUBSET (x INSERT s) /\ u SUBSET t /\ EVEN(CARD t)} =
250 CARD {t | t SUBSET s /\ u SUBSET t /\ EVEN(CARD t)} +
251 CARD {t | t SUBSET s /\ u SUBSET t /\ ODD(CARD t)}`,
252 REPEAT STRIP_TAC THEN
253 MATCH_MP_TAC(INST_TYPE[`:A`,`:B`] CARD_ADJUST_LEMMA) THEN
254 EXISTS_TAC `\u. (x:A) INSERT u` THEN
255 ASM_SIMP_TAC[FINITE_SUBSETS_RESTRICT] THEN
256 (CONJ_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
257 CONV_TAC SYM_CONV THEN MATCH_MP_TAC CARD_UNION_EQ THEN
258 ASM_SIMP_TAC[FINITE_SUBSETS_RESTRICT; FINITE_INSERT] THEN CONJ_TAC THENL
259 [REWRITE_TAC[EXTENSION; NOT_IN_EMPTY; IN_INTER] THEN
260 REWRITE_TAC[TAUT `~(a /\ b) <=> b ==> ~a`; FORALL_IN_IMAGE] THEN
263 GEN_REWRITE_TAC I [EXTENSION] THEN X_GEN_TAC `t:A->bool` THEN
264 REWRITE_TAC[IN_ELIM_THM; IN_UNION; SUBSET_INSERT_EXISTS] THEN
265 REWRITE_TAC[IN_IMAGE; IN_ELIM_THM] THEN
266 REWRITE_TAC[RIGHT_OR_DISTRIB; LEFT_AND_EXISTS_THM] THEN AP_TERM_TAC THEN
267 AP_TERM_TAC THEN GEN_REWRITE_TAC I [FUN_EQ_THM] THEN
268 X_GEN_TAC `v:A->bool` THEN
269 ASM_CASES_TAC `t = (x:A) INSERT v` THEN ASM_REWRITE_TAC[] THEN
270 ASM_CASES_TAC `(v:A->bool) SUBSET s` THEN ASM_REWRITE_TAC[] THEN
271 BINOP_TAC THENL [ASM SET_TAC[]; ALL_TAC] THEN
272 ASM_MESON_TAC[CARD_CLAUSES; EVEN; NOT_ODD; FINITE_SUBSET; SUBSET] THEN
273 ASM_MESON_TAC[CARD_CLAUSES; EVEN; NOT_ODD; FINITE_SUBSET; SUBSET]));;
275 let CARD_SUBSUPERSETS_EVEN_ODD = prove
277 FINITE u /\ s PSUBSET u
278 ==> CARD {t | s SUBSET t /\ t SUBSET u /\ EVEN(CARD t)} =
279 CARD {t | s SUBSET t /\ t SUBSET u /\ ODD(CARD t)}`,
280 ONCE_REWRITE_TAC[TAUT `a /\ b /\ c <=> b /\ a /\ c`] THEN
281 REPEAT GEN_TAC THEN WF_INDUCT_TAC `CARD(u:A->bool)` THEN
282 REWRITE_TAC[PSUBSET_MEMBER] THEN
283 REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
284 DISCH_THEN(X_CHOOSE_THEN `x:A` STRIP_ASSUME_TAC) THEN
285 FIRST_X_ASSUM(SUBST_ALL_TAC o MATCH_MP (SET_RULE
286 `x IN s ==> s = x INSERT (s DELETE x)`)) THEN
287 MP_TAC(SET_RULE `~((x:A) IN (u DELETE x))`) THEN
288 ABBREV_TAC `v:A->bool = u DELETE x` THEN STRIP_TAC THEN
289 SUBGOAL_THEN `FINITE v /\ (s:A->bool) SUBSET v` STRIP_ASSUME_TAC THENL
290 [ASM SET_TAC[FINITE_INSERT]; ALL_TAC] THEN
291 ASM_SIMP_TAC[CARD_SUBSETS_STEP] THEN ASM_CASES_TAC `s:A->bool = v` THENL
292 [REWRITE_TAC[CONJ_ASSOC; SUBSET_ANTISYM_EQ] THEN MATCH_ACCEPT_TAC ADD_SYM;
293 ASM_SIMP_TAC[CARD_CLAUSES; LT; PSUBSET]]);;
295 let SUM_ALTERNATING_CANCELS = prove
298 CARD {x | x IN s /\ EVEN(f x)} = CARD {x | x IN s /\ ODD(f x)}
299 ==> sum s (\x. (-- &1) pow (f x)) = &0`,
300 REPEAT STRIP_TAC THEN MATCH_MP_TAC EQ_TRANS THEN
301 EXISTS_TAC `sum {x | x IN s /\ EVEN(f x)} (\x. (-- &1) pow (f x)) +
302 sum {x:A | x IN s /\ ODD(f x)} (\x. (-- &1) pow (f x))` THEN
304 [CONV_TAC SYM_CONV THEN MATCH_MP_TAC SUM_UNION_EQ THEN
305 ASM_SIMP_TAC[EXTENSION; IN_ELIM_THM; IN_INTER; IN_UNION; NOT_IN_EMPTY] THEN
306 REWRITE_TAC[GSYM NOT_EVEN] THEN MESON_TAC[];
308 ASM_SIMP_TAC[REAL_POW_NEG; REAL_POW_ONE; GSYM NOT_EVEN; SUM_CONST;
309 FINITE_RESTRICT; REAL_ARITH `x * &1 + x * -- &1 = &0`]);;
311 (* ------------------------------------------------------------------------- *)
312 (* Hence a general "Moebius inversion" inclusion-exclusion principle. *)
313 (* This "symmetric" form is from Ira Gessel: "Symmetric Inclusion-Exclusion" *)
314 (* ------------------------------------------------------------------------- *)
316 let INCLUSION_EXCLUSION_SYMMETRIC = prove
317 (`!f g:(A->bool)->real.
319 ==> g(s) = sum {t | t SUBSET s} (\t. (-- &1) pow (CARD t) * f(t)))
321 ==> f(s) = sum {t | t SUBSET s} (\t. (-- &1) pow (CARD t) * g(t))`,
322 REPEAT STRIP_TAC THEN CONV_TAC SYM_CONV THEN MATCH_MP_TAC EQ_TRANS THEN
323 EXISTS_TAC `sum {t:A->bool | t SUBSET s}
324 (\t. (-- &1) pow (CARD t) *
325 sum {u | u IN {u | u SUBSET s} /\ u SUBSET t}
326 (\u. (-- &1) pow (CARD u) * f(u)))` THEN
328 [MATCH_MP_TAC SUM_EQ THEN ASM_SIMP_TAC[IN_ELIM_THM; SET_RULE
329 `s SUBSET t ==> (u SUBSET t /\ u SUBSET s <=> u SUBSET s)`] THEN
330 ASM_MESON_TAC[FINITE_SUBSET];
332 REWRITE_TAC[GSYM SUM_LMUL] THEN
333 W(MP_TAC o PART_MATCH (lhand o rand) SUM_SUM_RESTRICT o lhs o snd) THEN
334 ASM_SIMP_TAC[FINITE_POWERSET] THEN DISCH_THEN SUBST1_TAC THEN
335 REWRITE_TAC[SUM_RMUL; IN_ELIM_THM] THEN MATCH_MP_TAC EQ_TRANS THEN EXISTS_TAC
336 `sum {u | u SUBSET s} (\u:A->bool. if u = s then f(s) else &0)` THEN
337 CONJ_TAC THENL [ALL_TAC; SIMP_TAC[SUM_DELTA; IN_ELIM_THM; SUBSET_REFL]] THEN
338 MATCH_MP_TAC SUM_EQ THEN X_GEN_TAC `u:A->bool` THEN
339 REWRITE_TAC[IN_ELIM_THM] THEN STRIP_TAC THEN
340 COND_CASES_TAC THEN ASM_REWRITE_TAC[] THENL
341 [REWRITE_TAC[SUBSET_ANTISYM_EQ; SET_RULE `{x | x = a} = {a}`] THEN
342 REWRITE_TAC[SUM_SING; REAL_MUL_ASSOC; GSYM REAL_POW_ADD] THEN
343 REWRITE_TAC[REAL_POW_NEG; EVEN_ADD; REAL_POW_ONE; REAL_MUL_LID];
345 REWRITE_TAC[REAL_ENTIRE] THEN REPEAT DISJ1_TAC THEN
346 MATCH_MP_TAC SUM_ALTERNATING_CANCELS THEN
347 ASM_SIMP_TAC[FINITE_SUBSETS_RESTRICT; IN_ELIM_THM] THEN
348 ONCE_REWRITE_TAC[TAUT `(a /\ b) /\ c <=> b /\ a /\ c`] THEN
349 MATCH_MP_TAC CARD_SUBSUPERSETS_EVEN_ODD THEN ASM SET_TAC[]);;
351 (* ------------------------------------------------------------------------- *)
352 (* The more typical non-symmetric version. *)
353 (* ------------------------------------------------------------------------- *)
355 let INCLUSION_EXCLUSION_MOBIUS = prove
356 (`!f g:(A->bool)->real.
357 (!s. FINITE s ==> g(s) = sum {t | t SUBSET s} f)
359 ==> f(s) = sum {t | t SUBSET s}
360 (\t. (-- &1) pow (CARD s - CARD t) * g(t))`,
361 REPEAT STRIP_TAC THEN
362 MP_TAC(ISPECL [`\t. -- &1 pow CARD(t:A->bool) * f t`; `g:(A->bool)->real`]
363 INCLUSION_EXCLUSION_SYMMETRIC) THEN
364 REWRITE_TAC[REAL_MUL_ASSOC; GSYM REAL_POW_ADD] THEN ANTS_TAC THENL
365 [ASM_SIMP_TAC[EVEN_ADD; REAL_POW_ONE; REAL_POW_NEG; REAL_MUL_LID; ETA_AX];
367 DISCH_THEN(MP_TAC o SPEC `s:A->bool`) THEN ASM_REWRITE_TAC[] THEN
368 DISCH_THEN(MP_TAC o AP_TERM `(*) ((-- &1) pow (CARD(s:A->bool)))`) THEN
369 REWRITE_TAC[REAL_MUL_ASSOC; GSYM REAL_POW_ADD; GSYM MULT_2] THEN
370 REWRITE_TAC[GSYM REAL_POW_POW] THEN CONV_TAC REAL_RAT_REDUCE_CONV THEN
371 REWRITE_TAC[REAL_POW_ONE; REAL_MUL_LID] THEN DISCH_THEN SUBST1_TAC THEN
372 REWRITE_TAC[GSYM SUM_LMUL] THEN MATCH_MP_TAC SUM_EQ THEN
373 X_GEN_TAC `u:A->bool` THEN REWRITE_TAC[IN_ELIM_THM; REAL_MUL_ASSOC] THEN
374 ASM_SIMP_TAC[REAL_POW_SUB; REAL_ARITH `~(-- &1 = &0)`; CARD_SUBSET] THEN
375 REWRITE_TAC[REAL_POW_NEG; REAL_POW_ONE] THEN
376 REPEAT(COND_CASES_TAC THEN ASM_REWRITE_TAC[]) THEN REAL_ARITH_TAC);;
378 (* ------------------------------------------------------------------------- *)
379 (* A related principle for real functions. *)
380 (* ------------------------------------------------------------------------- *)
382 (*** Not clear how useful this is
384 needs "Library/products.ml";;
386 let INCLUSION_EXCLUSION_REAL_FUNCTION = prove
389 ==> product s (\x. &1 - f x) =
390 sum {t | t SUBSET s} (\t. (-- &1) pow (CARD t) * product t f)`,
392 (`{t | ?u. u SUBSET s /\ t = x INSERT u} =
393 IMAGE (\s. x INSERT s) {t | t SUBSET s}`,
394 GEN_REWRITE_TAC I [EXTENSION] THEN REWRITE_TAC[IN_ELIM_THM; IN_IMAGE] THEN
396 GEN_TAC THEN MATCH_MP_TAC FINITE_INDUCT_STRONG THEN
397 SIMP_TAC[PRODUCT_CLAUSES; SUBSET_EMPTY; SUM_SING; CARD_CLAUSES; real_pow;
398 SET_RULE `{x | x = a} = {a}`; REAL_MUL_RID] THEN
399 REWRITE_TAC[SUBSET_INSERT_EXISTS] THEN
400 MAP_EVERY X_GEN_TAC [`x:A`; `s:A->bool`] THEN STRIP_TAC THEN
401 REWRITE_TAC[SET_RULE `{t | p t \/ q t} = {t | p t} UNION {t | q t}`] THEN
402 W(MP_TAC o PART_MATCH (lhand o rand) SUM_UNION o rand o snd) THEN
404 [ASM_SIMP_TAC[FINITE_POWERSET; lemma; FINITE_IMAGE] THEN
405 REWRITE_TAC[GSYM lemma] THEN ASM SET_TAC[];
407 DISCH_THEN SUBST1_TAC THEN
408 REWRITE_TAC[GSYM SUM_LMUL; REAL_SUB_RDISTRIB; REAL_MUL_LID; real_sub] THEN
409 AP_TERM_TAC THEN REWRITE_TAC[lemma] THEN
410 W(MP_TAC o PART_MATCH (lhand o rand) SUM_IMAGE o rand o snd) THEN
411 ANTS_TAC THENL [ASM SET_TAC[]; DISCH_THEN SUBST1_TAC] THEN
412 REWRITE_TAC[GSYM SUM_NEG] THEN MATCH_MP_TAC SUM_EQ THEN
413 SIMP_TAC[o_THM; IN_ELIM_THM] THEN X_GEN_TAC `t:A->bool` THEN STRIP_TAC THEN
414 SUBGOAL_THEN `FINITE(t:A->bool) /\ ~(x IN t)` STRIP_ASSUME_TAC THENL
415 [ASM_MESON_TAC[SUBSET; FINITE_SUBSET]; ALL_TAC] THEN
416 ASM_SIMP_TAC[PRODUCT_CLAUSES; CARD_CLAUSES; real_pow] THEN REAL_ARITH_TAC);;