equal
deleted
inserted
replaced
329 |
329 |
330 lemma rep_multiset_induct_aux: |
330 lemma rep_multiset_induct_aux: |
331 "P (\<lambda>a. 0) ==> (!!f b. f \<in> multiset ==> P f ==> P (f (b := f b + 1'))) |
331 "P (\<lambda>a. 0) ==> (!!f b. f \<in> multiset ==> P f ==> P (f (b := f b + 1'))) |
332 ==> \<forall>f. f \<in> multiset --> setsum f {x. 0 < f x} = n --> P f" |
332 ==> \<forall>f. f \<in> multiset --> setsum f {x. 0 < f x} = n --> P f" |
333 proof - |
333 proof - |
334 case antecedent |
334 case rule_context |
335 note prems = this [unfolded multiset_def] |
335 note premises = this [unfolded multiset_def] |
336 show ?thesis |
336 show ?thesis |
337 apply (unfold multiset_def) |
337 apply (unfold multiset_def) |
338 apply (induct_tac n) |
338 apply (induct_tac n) |
339 apply simp |
339 apply simp |
340 apply clarify |
340 apply clarify |
341 apply (subgoal_tac "f = (\<lambda>a.0)") |
341 apply (subgoal_tac "f = (\<lambda>a.0)") |
342 apply simp |
342 apply simp |
343 apply (rule prems) |
343 apply (rule premises) |
344 apply (rule ext) |
344 apply (rule ext) |
345 apply force |
345 apply force |
346 apply clarify |
346 apply clarify |
347 apply (frule setsum_SucD) |
347 apply (frule setsum_SucD) |
348 apply clarify |
348 apply clarify |
356 apply blast |
356 apply blast |
357 apply (subgoal_tac "f = (f (a := f a - 1'))(a := (f (a := f a - 1')) a + 1')") |
357 apply (subgoal_tac "f = (f (a := f a - 1'))(a := (f (a := f a - 1')) a + 1')") |
358 prefer 2 |
358 prefer 2 |
359 apply (rule ext) |
359 apply (rule ext) |
360 apply (simp (no_asm_simp)) |
360 apply (simp (no_asm_simp)) |
361 apply (erule ssubst, rule prems) |
361 apply (erule ssubst, rule premises) |
362 apply blast |
362 apply blast |
363 apply (erule allE, erule impE, erule_tac [2] mp) |
363 apply (erule allE, erule impE, erule_tac [2] mp) |
364 apply blast |
364 apply blast |
365 apply (simp (no_asm_simp) add: setsum_decr del: fun_upd_apply) |
365 apply (simp (no_asm_simp) add: setsum_decr del: fun_upd_apply) |
366 apply (subgoal_tac "{x. x \<noteq> a --> 0 < f x} = {x. 0 < f x}") |
366 apply (subgoal_tac "{x. x \<noteq> a --> 0 < f x} = {x. 0 < f x}") |