3805 also have "(\<Union>i\<le>n. {xs. set xs \<subseteq> A \<and> length xs = i}) = {xs. set xs \<subseteq> A \<and> length xs \<le> n}" |
3805 also have "(\<Union>i\<le>n. {xs. set xs \<subseteq> A \<and> length xs = i}) = {xs. set xs \<subseteq> A \<and> length xs \<le> n}" |
3806 by auto |
3806 by auto |
3807 finally show ?thesis by simp |
3807 finally show ?thesis by simp |
3808 qed |
3808 qed |
3809 |
3809 |
|
3810 lemma card_lists_distinct_length_eq: |
|
3811 assumes "k < card A" |
|
3812 shows "card {xs. length xs = k \<and> distinct xs \<and> set xs \<subseteq> A} = \<Prod>{card A - k + 1 .. card A}" |
|
3813 using assms |
|
3814 proof (induct k) |
|
3815 case 0 |
|
3816 then have "{xs. length xs = 0 \<and> distinct xs \<and> set xs \<subseteq> A} = {[]}" by auto |
|
3817 then show ?case by simp |
|
3818 next |
|
3819 case (Suc k) |
|
3820 let "?k_list" = "\<lambda>k xs. length xs = k \<and> distinct xs \<and> set xs \<subseteq> A" |
|
3821 have inj_Cons: "\<And>A. inj_on (\<lambda>(xs, n). n # xs) A" by (rule inj_onI) auto |
|
3822 |
|
3823 from Suc have "k < card A" by simp |
|
3824 moreover have "finite A" using assms by (simp add: card_ge_0_finite) |
|
3825 moreover have "finite {xs. ?k_list k xs}" |
|
3826 using finite_lists_length_eq[OF `finite A`, of k] |
|
3827 by - (rule finite_subset, auto) |
|
3828 moreover have "\<And>i j. i \<noteq> j \<longrightarrow> {i} \<times> (A - set i) \<inter> {j} \<times> (A - set j) = {}" |
|
3829 by auto |
|
3830 moreover have "\<And>i. i \<in>Collect (?k_list k) \<Longrightarrow> card (A - set i) = card A - k" |
|
3831 by (simp add: card_Diff_subset distinct_card) |
|
3832 moreover have "{xs. ?k_list (Suc k) xs} = |
|
3833 (\<lambda>(xs, n). n#xs) ` \<Union>(\<lambda>xs. {xs} \<times> (A - set xs)) ` {xs. ?k_list k xs}" |
|
3834 by (auto simp: length_Suc_conv) |
|
3835 moreover |
|
3836 have "Suc (card A - Suc k) = card A - k" using Suc.prems by simp |
|
3837 then have "(card A - k) * \<Prod>{Suc (card A - k)..card A} = \<Prod>{Suc (card A - Suc k)..card A}" |
|
3838 by (subst setprod_insert[symmetric]) (simp add: atLeastAtMost_insertL)+ |
|
3839 ultimately show ?case |
|
3840 by (simp add: card_image inj_Cons card_UN_disjoint Suc.hyps algebra_simps) |
|
3841 qed |
|
3842 |
3810 lemma infinite_UNIV_listI: "~ finite(UNIV::'a list set)" |
3843 lemma infinite_UNIV_listI: "~ finite(UNIV::'a list set)" |
3811 apply(rule notI) |
3844 apply(rule notI) |
3812 apply(drule finite_maxlen) |
3845 apply(drule finite_maxlen) |
3813 apply (metis UNIV_I length_replicate less_not_refl) |
3846 apply (metis UNIV_I length_replicate less_not_refl) |
3814 done |
3847 done |