src/HOL/ex/Birthday_Paradox.thy
author bulwahn
Tue, 07 Jun 2011 11:10:57 +0200
changeset 43238 04c886a1d1a5
parent 40632 src/HOL/ex/Birthday_Paradoxon.thy@dc55e6752046
child 50123 69b35a75caf3
permissions -rw-r--r--
renaming the formalisation of the birthday problem to a proper English name
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
43238
04c886a1d1a5 renaming the formalisation of the birthday problem to a proper English name
bulwahn
parents: 40632
diff changeset
     1
(*  Title: HOL/ex/Birthday_Paradox.thy
40632
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
     2
    Author: Lukas Bulwahn, TU Muenchen, 2007
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
     3
*)
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
     4
43238
04c886a1d1a5 renaming the formalisation of the birthday problem to a proper English name
bulwahn
parents: 40632
diff changeset
     5
header {* A Formulation of the Birthday Paradox *}
40632
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
     6
43238
04c886a1d1a5 renaming the formalisation of the birthday problem to a proper English name
bulwahn
parents: 40632
diff changeset
     7
theory Birthday_Paradox
40632
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
     8
imports Main "~~/src/HOL/Fact" "~~/src/HOL/Library/FuncSet"
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
     9
begin
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    10
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    11
section {* Cardinality *}
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    12
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    13
lemma card_product_dependent:
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    14
  assumes "finite S"
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    15
  assumes "\<forall>x \<in> S. finite (T x)" 
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    16
  shows "card {(x, y). x \<in> S \<and> y \<in> T x} = (\<Sum>x \<in> S. card (T x))"
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    17
proof -
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    18
  note `finite S`
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    19
  moreover
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    20
  have "{(x, y). x \<in> S \<and> y \<in> T x} = (UN x : S. Pair x ` T x)" by auto
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    21
  moreover
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    22
  from `\<forall>x \<in> S. finite (T x)` have "ALL x:S. finite (Pair x ` T x)" by auto
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    23
  moreover
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    24
  have " ALL i:S. ALL j:S. i ~= j --> Pair i ` T i Int Pair j ` T j = {}" by auto
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    25
  moreover  
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    26
  ultimately have "card {(x, y). x \<in> S \<and> y \<in> T x} = (SUM i:S. card (Pair i ` T i))"
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    27
    by (auto, subst card_UN_disjoint) auto
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    28
  also have "... = (SUM x:S. card (T x))"
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    29
    by (subst card_image) (auto intro: inj_onI)
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    30
  finally show ?thesis by auto
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    31
qed
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    32
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    33
lemma card_extensional_funcset_inj_on:
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    34
  assumes "finite S" "finite T" "card S \<le> card T"
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    35
  shows "card {f \<in> extensional_funcset S T. inj_on f S} = fact (card T) div (fact (card T - card S))"
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    36
using assms
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    37
proof (induct S arbitrary: T rule: finite_induct)
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    38
  case empty
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    39
  from this show ?case by (simp add: Collect_conv_if extensional_funcset_empty_domain)
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    40
next
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    41
  case (insert x S)
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    42
  { fix x
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    43
    from `finite T` have "finite (T - {x})" by auto
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    44
    from `finite S` this have "finite (extensional_funcset S (T - {x}))"
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    45
      by (rule finite_extensional_funcset)
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    46
    moreover
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    47
    have "{f : extensional_funcset S (T - {x}). inj_on f S} \<subseteq> (extensional_funcset S (T - {x}))" by auto    
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    48
    ultimately have "finite {f : extensional_funcset S (T - {x}). inj_on f S}"
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    49
      by (auto intro: finite_subset)
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    50
  } note finite_delete = this
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    51
  from insert have hyps: "\<forall>y \<in> T. card ({g. g \<in> extensional_funcset S (T - {y}) \<and> inj_on g S}) = fact (card T - 1) div fact ((card T - 1) - card S)"(is "\<forall> _ \<in> T. _ = ?k") by auto
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    52
  from extensional_funcset_extend_domain_inj_on_eq[OF `x \<notin> S`]
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    53
  have "card {f. f : extensional_funcset (insert x S) T & inj_on f (insert x S)} =
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    54
    card ((%(y, g). g(x := y)) ` {(y, g). y : T & g : extensional_funcset S (T - {y}) & inj_on g S})"
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    55
    by metis
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    56
  also from extensional_funcset_extend_domain_inj_onI[OF `x \<notin> S`, of T] have "... =  card {(y, g). y : T & g : extensional_funcset S (T - {y}) & inj_on g S}"
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    57
    by (simp add: card_image)
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    58
  also have "card {(y, g). y \<in> T \<and> g \<in> extensional_funcset S (T - {y}) \<and> inj_on g S} =
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    59
    card {(y, g). y \<in> T \<and> g \<in> {f \<in> extensional_funcset S (T - {y}). inj_on f S}}" by auto
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    60
  also from `finite T` finite_delete have "... = (\<Sum>y \<in> T. card {g. g \<in> extensional_funcset S (T - {y}) \<and>  inj_on g S})"
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    61
    by (subst card_product_dependent) auto
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    62
  also from hyps have "... = (card T) * ?k"
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    63
    by auto
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    64
  also have "... = card T * fact (card T - 1) div fact (card T - card (insert x S))"
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    65
    using insert unfolding div_mult1_eq[of "card T" "fact (card T - 1)"]
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    66
    by (simp add: fact_mod)
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    67
  also have "... = fact (card T) div fact (card T - card (insert x S))"
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    68
    using insert by (simp add: fact_reduce_nat[of "card T"])
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    69
  finally show ?case .
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    70
qed
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    71
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    72
lemma card_extensional_funcset_not_inj_on:
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    73
  assumes "finite S" "finite T" "card S \<le> card T"
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    74
  shows "card {f \<in> extensional_funcset S T. \<not> inj_on f S} = (card T) ^ (card S) - (fact (card T)) div (fact (card T - card S))"
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    75
proof -
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    76
  have subset: "{f : extensional_funcset S T. inj_on f S} <= extensional_funcset S T" by auto
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    77
  from finite_subset[OF subset] assms have finite: "finite {f : extensional_funcset S T. inj_on f S}"
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    78
    by (auto intro!: finite_extensional_funcset)
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    79
  have "{f \<in> extensional_funcset S T. \<not> inj_on f S} = extensional_funcset S T - {f \<in> extensional_funcset S T. inj_on f S}" by auto 
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    80
  from assms this finite subset show ?thesis
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    81
    by (simp add: card_Diff_subset card_extensional_funcset card_extensional_funcset_inj_on)
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    82
qed
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    83
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    84
lemma setprod_upto_nat_unfold:
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    85
  "setprod f {m..(n::nat)} = (if n < m then 1 else (if n = 0 then f 0 else f n * setprod f {m..(n - 1)}))"
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    86
  by auto (auto simp add: gr0_conv_Suc atLeastAtMostSuc_conv)
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    87
43238
04c886a1d1a5 renaming the formalisation of the birthday problem to a proper English name
bulwahn
parents: 40632
diff changeset
    88
section {* Birthday paradox *}
40632
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    89
43238
04c886a1d1a5 renaming the formalisation of the birthday problem to a proper English name
bulwahn
parents: 40632
diff changeset
    90
lemma birthday_paradox:
40632
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    91
  assumes "card S = 23" "card T = 365"
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    92
  shows "2 * card {f \<in> extensional_funcset S T. \<not> inj_on f S} \<ge> card (extensional_funcset S T)"
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    93
proof -
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    94
  from `card S = 23` `card T = 365` have "finite S" "finite T" "card S <= card T" by (auto intro: card_ge_0_finite)
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    95
  from assms show ?thesis
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    96
    using card_extensional_funcset[OF `finite S`, of T]
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    97
      card_extensional_funcset_not_inj_on[OF `finite S` `finite T` `card S <= card T`]
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    98
    by (simp add: fact_div_fact setprod_upto_nat_unfold)
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
    99
qed
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
   100
dc55e6752046 adding birthday paradoxon from some abandoned drawer
bulwahn
parents:
diff changeset
   101
end