src/HOL/Complex/ex/DenumRat.thy
author paulson
Wed, 04 Jul 2007 13:56:26 +0200
changeset 23563 42f2f90b51a6
parent 19108 6f8c1343341b
child 28098 c92850d2d16c
permissions -rw-r--r--
simplified a proof
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
19108
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
     1
(*  Title:      HOL/Library/DenumRat.thy
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
     2
    ID:         $Id$
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
     3
    Author:     Benjamin Porter, 2006
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
     4
*)
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
     5
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
     6
header "Denumerability of the Rationals"
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
     7
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
     8
theory DenumRat
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
     9
imports
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    10
  Complex_Main NatPair
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    11
begin
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    12
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    13
lemma nat_to_int_surj: "\<exists>f::nat\<Rightarrow>int. surj f"
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    14
proof
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    15
  let ?f = "\<lambda>n. if (n mod 2 = 0) then - int (n div 2) else int ((n - 1) div 2 + 1)"
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    16
  have "\<forall>y. \<exists>x. y = ?f x"
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    17
  proof
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    18
    fix y::int
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    19
    {
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    20
      assume yl0: "y \<le> 0"
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    21
      then obtain n where ndef: "n = nat (- y * 2)" by simp
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    22
      from yl0 have g0: "- y * 2 \<ge> 0" by simp
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    23
      hence "nat (- y * 2) mod (nat 2) = nat ((-y * 2) mod 2)" by (subst nat_mod_distrib, auto)
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    24
      moreover have "(-y * 2) mod 2 = 0" by arith
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    25
      ultimately have "nat (- y * 2) mod 2 = 0" by simp
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    26
      with ndef have "n mod 2 = 0" by simp
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    27
      hence "?f n = - int (n div 2)" by simp
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    28
      also with ndef have "\<dots> = - int (nat (-y * 2) div 2)" by simp
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    29
      also with g0 have "\<dots> = - int (nat (((-y) * 2) div 2))" using nat_div_distrib by auto
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    30
      also have "\<dots> = - int (nat (-y))" using zdiv_zmult_self1 [of "2" "- y"]
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    31
        by simp
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    32
      also from yl0 have "\<dots> = y" using nat_0_le by auto
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    33
      finally have "?f n = y" .
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    34
      hence "\<exists>x. y = ?f x" by blast
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    35
    }
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    36
    moreover
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    37
    {
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    38
      assume "\<not>(y \<le> 0)"
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    39
      hence yg0: "y > 0" by simp
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    40
      hence yn0: "y \<noteq> 0" by simp
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    41
      from yg0 have g0: "y*2 + -2 \<ge> 0" by arith
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    42
      from yg0 obtain n where ndef: "n = nat (y * 2 - 1)" by simp
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    43
      from yg0 have "nat (y*2 - 1) mod 2 = nat ((y*2 - 1) mod 2)" using nat_mod_distrib by auto
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    44
      also have "\<dots> = nat ((y*2 + - 1) mod 2)" by (auto simp add: diff_int_def)
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    45
      also have "\<dots> = nat (1)" by (auto simp add: zmod_zadd_left_eq)
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    46
      finally have "n mod 2 = 1" using ndef by auto
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    47
      hence "?f n = int ((n - 1) div 2 + 1)" by simp
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    48
      also with ndef have "\<dots> = int ((nat (y*2 - 1) - 1) div 2 + 1)" by simp
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    49
      also with yg0 have "\<dots> = int (nat (y*2 - 2) div 2 + 1)" by arith
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    50
      also have "\<dots> = int (nat (y*2 + -2) div 2 + 1)" by (simp add: diff_int_def)
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    51
      also have "\<dots> = int (nat (y*2 + -2) div (nat 2) + 1)" by auto
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    52
      also from g0 have "\<dots> = int (nat ((y*2 + -2) div 2) + 1)"
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    53
        using nat_div_distrib by auto
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    54
      also have "\<dots> = int (nat ((y*2) div 2 + (-2) div 2 + ((y*2) mod 2 + (-2) mod 2) div 2) + 1)"
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    55
        by (auto simp add: zdiv_zadd1_eq)
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    56
      also from yg0 g0 have "\<dots> = int (nat (y))"
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    57
        by (auto)
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    58
      finally have "?f n = y" using yg0 by auto
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    59
      hence "\<exists>x. y = ?f x" by blast
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    60
    }
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    61
    ultimately show "\<exists>x. y = ?f x" by (rule case_split)
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    62
  qed
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    63
  thus "surj ?f" by (fold surj_def)
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    64
qed
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    65
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    66
lemma nat2_to_int2_surj: "\<exists>f::(nat*nat)\<Rightarrow>(int*int). surj f"
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    67
proof -
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    68
  from nat_to_int_surj obtain g::"nat\<Rightarrow>int" where "surj g" ..
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    69
  hence aux: "\<forall>y. \<exists>x. y = g x" by (unfold surj_def)
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    70
  let ?f = "\<lambda>n. (g (fst n), g (snd n))"
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    71
  {
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    72
    fix y::"(int*int)"
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    73
    from aux have "\<exists>x1 x2. fst y = g x1 \<and> snd y = g x2" by auto
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    74
    hence "\<exists>x. fst y = g (fst x) \<and> snd y = g (snd x)" by auto
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    75
    hence "\<exists>x. (fst y, snd y) = (g (fst x), g (snd x))" by blast
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    76
    hence "\<exists>x. y = ?f x" by auto
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    77
  }
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    78
  hence "\<forall>y. \<exists>x. y = ?f x" by auto
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    79
  hence "surj ?f" by (fold surj_def)
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    80
  thus ?thesis by auto
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    81
qed
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    82
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    83
lemma rat_denum:
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    84
  "\<exists>f::nat\<Rightarrow>rat. surj f"
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    85
proof -
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    86
  have "inj nat2_to_nat" by (rule nat2_to_nat_inj)
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    87
  hence "surj (inv nat2_to_nat)" by (rule inj_imp_surj_inv)
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    88
  moreover from nat2_to_int2_surj obtain h::"(nat*nat)\<Rightarrow>(int*int)" where "surj h" ..
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    89
  ultimately have "surj (h o (inv nat2_to_nat))" by (rule comp_surj)
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    90
  hence "\<exists>f::nat\<Rightarrow>(int*int). surj f" by auto
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    91
  then obtain g::"nat\<Rightarrow>(int*int)" where "surj g" by auto  
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    92
  hence gdef: "\<forall>y. \<exists>x. y = g x" by (unfold surj_def)  
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    93
  {
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    94
    fix y
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    95
    obtain a b where y: "y = Fract a b" by (cases y)
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    96
    from gdef
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    97
    obtain x where "(a,b) = g x" by blast
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    98
    hence "g x = (a,b)" ..
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
    99
    with y have "y = (split Fract o g) x" by simp 
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
   100
    hence "\<exists>x. y = (split Fract o g) x" ..
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
   101
  }
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
   102
  hence "surj (split Fract o g)" 
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
   103
    by (simp add: surj_def)
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
   104
  thus ?thesis by blast
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
   105
qed
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
   106
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
   107
6f8c1343341b * denumerability of rationals by Benjamin Porter, based on NatPair (by Stefan Richter)
kleing
parents:
diff changeset
   108
end