author | paulson |
Wed, 04 Jul 2007 13:56:26 +0200 | |
changeset 23563 | 42f2f90b51a6 |
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 |