| author | wenzelm | 
| Thu, 08 Nov 2007 14:51:30 +0100 | |
| changeset 25345 | dd5b851f8ef0 | 
| parent 19108 | 6f8c1343341b | 
| child 28098 | c92850d2d16c | 
| permissions | -rw-r--r-- | 
| 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 |