12051
|
1 |
(* Title: HOL/Real/ex/Sqrt_Script.thy
|
|
2 |
ID: $Id$
|
|
3 |
Author: Lawrence C Paulson, Cambridge University Computer Laboratory
|
|
4 |
Copyright 2001 University of Cambridge
|
|
5 |
*)
|
|
6 |
|
|
7 |
header {* Square roots of primes are irrational *}
|
|
8 |
|
12077
|
9 |
theory Sqrt_Script = Primes + Real:
|
|
10 |
|
12051
|
11 |
text {*
|
12077
|
12 |
\medskip Contrast this linear Isar script with Markus Wenzel's more
|
|
13 |
mathematical version.
|
12051
|
14 |
*}
|
|
15 |
|
12087
|
16 |
subsection {* Preliminaries *}
|
12051
|
17 |
|
|
18 |
lemma prime_nonzero: "p \<in> prime \<Longrightarrow> p\<noteq>0"
|
|
19 |
by (force simp add: prime_def)
|
|
20 |
|
|
21 |
lemma prime_dvd_other_side: "\<lbrakk>n*n = p*(k*k); p \<in> prime\<rbrakk> \<Longrightarrow> p dvd n"
|
|
22 |
apply (subgoal_tac "p dvd n*n", blast dest: prime_dvd_mult)
|
|
23 |
apply (rule_tac j="k*k" in dvd_mult_left, simp)
|
|
24 |
done
|
|
25 |
|
|
26 |
lemma reduction: "\<lbrakk>p \<in> prime; 0 < k; k*k = p*(j*j)\<rbrakk> \<Longrightarrow> k < p*j & 0 < j"
|
|
27 |
apply (rule ccontr)
|
|
28 |
apply (simp add: linorder_not_less)
|
|
29 |
apply (erule disjE)
|
|
30 |
apply (frule mult_le_mono, assumption)
|
|
31 |
apply auto
|
|
32 |
apply (force simp add: prime_def)
|
|
33 |
done
|
|
34 |
|
|
35 |
lemma rearrange: "(j::nat) * (p*j) = k*k \<Longrightarrow> k*k = p*(j*j)"
|
|
36 |
by (simp add: mult_ac)
|
|
37 |
|
|
38 |
lemma prime_not_square [rule_format]:
|
|
39 |
"p \<in> prime \<Longrightarrow> \<forall>k. 0<k \<longrightarrow> m*m \<noteq> p*(k*k)"
|
|
40 |
apply (induct_tac m rule: nat_less_induct)
|
|
41 |
apply clarify
|
|
42 |
apply (frule prime_dvd_other_side, assumption)
|
|
43 |
apply (erule dvdE)
|
|
44 |
apply (simp add: nat_mult_eq_cancel_disj prime_nonzero)
|
|
45 |
apply (blast dest: rearrange reduction)
|
|
46 |
done
|
|
47 |
|
|
48 |
|
12087
|
49 |
subsection {* The set of rational numbers *}
|
12051
|
50 |
|
|
51 |
constdefs
|
|
52 |
rationals :: "real set" ("\<rat>")
|
|
53 |
"\<rat> \<equiv> {x. \<exists>m n. n \<noteq> 0 \<and> \<bar>x\<bar> = real (m::nat) / real (n::nat)}"
|
|
54 |
|
|
55 |
|
12087
|
56 |
subsection {* Main theorem *}
|
12051
|
57 |
|
|
58 |
text {*
|
12077
|
59 |
The square root of any prime number (including @{text 2}) is
|
|
60 |
irrational.
|
12051
|
61 |
*}
|
|
62 |
|
|
63 |
theorem prime_sqrt_irrational: "\<lbrakk>p \<in> prime; x*x = real p; 0 \<le> x\<rbrakk> \<Longrightarrow> x \<notin> \<rat>"
|
|
64 |
apply (simp add: rationals_def real_abs_def)
|
|
65 |
apply clarify
|
|
66 |
apply (erule_tac P="real m / real n * ?x = ?y" in rev_mp)
|
|
67 |
apply (simp del: real_of_nat_mult
|
|
68 |
add: real_divide_eq_eq prime_not_square
|
12077
|
69 |
real_of_nat_mult [symmetric])
|
12051
|
70 |
done
|
|
71 |
|
|
72 |
lemma two_is_prime: "2 \<in> prime"
|
|
73 |
apply (auto simp add: prime_def)
|
12077
|
74 |
apply (case_tac m)
|
12051
|
75 |
apply (auto dest!: dvd_imp_le)
|
|
76 |
apply arith
|
|
77 |
done
|
|
78 |
|
|
79 |
lemmas two_sqrt_irrational = prime_sqrt_irrational [OF two_is_prime]
|
|
80 |
|
|
81 |
end
|