src/HOL/List.thy
changeset 45932 6f08f8fe9752
parent 45891 d73605c829cc
child 45968 e8fa5090fa04
equal deleted inserted replaced
45931:99cf6e470816 45932:6f08f8fe9752
  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