author | nipkow |
Thu, 15 Apr 1999 18:10:37 +0200 | |
changeset 6433 | 228237ec56e5 |
parent 6301 | 08245f5a436d |
child 6805 | 52b13dfbe954 |
permissions | -rw-r--r-- |
2441 | 1 |
(* Title: HOL/Nat.ML |
923 | 2 |
ID: $Id$ |
2608 | 3 |
Author: Tobias Nipkow |
4 |
Copyright 1997 TU Muenchen |
|
923 | 5 |
*) |
6 |
||
5188
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
7 |
(** conversion rules for nat_rec **) |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
8 |
|
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
9 |
val [nat_rec_0, nat_rec_Suc] = nat.recs; |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
10 |
|
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
11 |
(*These 2 rules ease the use of primitive recursion. NOTE USE OF == *) |
5316 | 12 |
val prems = Goal |
5188
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
13 |
"[| !!n. f(n) == nat_rec c h n |] ==> f(0) = c"; |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
14 |
by (simp_tac (simpset() addsimps prems) 1); |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
15 |
qed "def_nat_rec_0"; |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
16 |
|
5316 | 17 |
val prems = Goal |
5188
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
18 |
"[| !!n. f(n) == nat_rec c h n |] ==> f(Suc(n)) = h n (f n)"; |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
19 |
by (simp_tac (simpset() addsimps prems) 1); |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
20 |
qed "def_nat_rec_Suc"; |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
21 |
|
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
22 |
val [nat_case_0, nat_case_Suc] = nat.cases; |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
23 |
|
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
24 |
Goal "n ~= 0 ==> EX m. n = Suc m"; |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
25 |
by (exhaust_tac "n" 1); |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
26 |
by (REPEAT (Blast_tac 1)); |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
27 |
qed "not0_implies_Suc"; |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
28 |
|
5316 | 29 |
Goal "m<n ==> n ~= 0"; |
5188
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
30 |
by (exhaust_tac "n" 1); |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
31 |
by (ALLGOALS Asm_full_simp_tac); |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
32 |
qed "gr_implies_not0"; |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
33 |
|
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
34 |
Goal "(n ~= 0) = (0 < n)"; |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
35 |
by (exhaust_tac "n" 1); |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
36 |
by (Blast_tac 1); |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
37 |
by (Blast_tac 1); |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
38 |
qed "neq0_conv"; |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
39 |
AddIffs [neq0_conv]; |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
40 |
|
5644 | 41 |
Goal "(0 ~= n) = (0 < n)"; |
6301 | 42 |
by (exhaust_tac "n" 1); |
43 |
by (Auto_tac); |
|
5644 | 44 |
qed "zero_neq_conv"; |
45 |
AddIffs [zero_neq_conv]; |
|
46 |
||
5188
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
47 |
(*This theorem is useful with blast_tac: (n=0 ==> False) ==> 0<n *) |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
48 |
bind_thm ("gr0I", [neq0_conv, notI] MRS iffD1); |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
49 |
|
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
50 |
Goal "(~(0 < n)) = (n=0)"; |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
51 |
by (rtac iffI 1); |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
52 |
by (etac swap 1); |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
53 |
by (ALLGOALS Asm_full_simp_tac); |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
54 |
qed "not_gr0"; |
6109 | 55 |
AddIffs [not_gr0]; |
5188
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
56 |
|
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
57 |
qed_goalw "Least_Suc" thy [Least_nat_def] |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
58 |
"!!P. [| ? n. P(Suc n); ~ P 0 |] ==> (LEAST n. P n) = Suc (LEAST m. P(Suc m))" |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
59 |
(fn _ => [ |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
60 |
rtac select_equality 1, |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
61 |
fold_goals_tac [Least_nat_def], |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
62 |
safe_tac (claset() addSEs [LeastI]), |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
63 |
rename_tac "j" 1, |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
64 |
exhaust_tac "j" 1, |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
65 |
Blast_tac 1, |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
66 |
blast_tac (claset() addDs [Suc_less_SucD, not_less_Least]) 1, |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
67 |
rename_tac "k n" 1, |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
68 |
exhaust_tac "k" 1, |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
69 |
Blast_tac 1, |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
70 |
hyp_subst_tac 1, |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
71 |
rewtac Least_nat_def, |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
72 |
rtac (select_equality RS arg_cong RS sym) 1, |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
73 |
Safe_tac, |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
74 |
dtac Suc_mono 1, |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
75 |
Blast_tac 1, |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
76 |
cut_facts_tac [less_linear] 1, |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
77 |
Safe_tac, |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
78 |
atac 2, |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
79 |
Blast_tac 2, |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
80 |
dtac Suc_mono 1, |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
81 |
Blast_tac 1]); |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
82 |
|
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
83 |
qed_goal "nat_induct2" thy |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
84 |
"[| P 0; P 1; !!k. P k ==> P (Suc (Suc k)) |] ==> P n" (fn prems => [ |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
85 |
cut_facts_tac prems 1, |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
86 |
rtac less_induct 1, |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
87 |
exhaust_tac "n" 1, |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
88 |
hyp_subst_tac 1, |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
89 |
atac 1, |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
90 |
hyp_subst_tac 1, |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
91 |
exhaust_tac "nat" 1, |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
92 |
hyp_subst_tac 1, |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
93 |
atac 1, |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
94 |
hyp_subst_tac 1, |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
95 |
resolve_tac prems 1, |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
96 |
dtac spec 1, |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
97 |
etac mp 1, |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
98 |
rtac (lessI RS less_trans) 1, |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
99 |
rtac (lessI RS Suc_mono) 1]); |
633ec5f6c155
Declaration of type 'nat' as a datatype (this allows usage of
berghofe
parents:
5069
diff
changeset
|
100 |
|
5069 | 101 |
Goal "min 0 n = 0"; |
3023 | 102 |
by (rtac min_leastL 1); |
5983 | 103 |
by (Simp_tac 1); |
2608 | 104 |
qed "min_0L"; |
1301 | 105 |
|
5069 | 106 |
Goal "min n 0 = 0"; |
3023 | 107 |
by (rtac min_leastR 1); |
5983 | 108 |
by (Simp_tac 1); |
2608 | 109 |
qed "min_0R"; |
923 | 110 |
|
5069 | 111 |
Goalw [min_def] "min (Suc m) (Suc n) = Suc(min m n)"; |
3023 | 112 |
by (Simp_tac 1); |
2608 | 113 |
qed "min_Suc_Suc"; |
1660 | 114 |
|
2608 | 115 |
Addsimps [min_0L,min_0R,min_Suc_Suc]; |
6433 | 116 |
|
117 |
Goalw [max_def] "max 0 n = n"; |
|
118 |
by (Simp_tac 1); |
|
119 |
qed "max_0L"; |
|
120 |
||
121 |
Goalw [max_def] "max n 0 = n"; |
|
122 |
by (Simp_tac 1); |
|
123 |
qed "max_0R"; |
|
124 |
||
125 |
Goalw [max_def] "max (Suc m) (Suc n) = Suc(max m n)"; |
|
126 |
by (Simp_tac 1); |
|
127 |
qed "max_Suc_Suc"; |
|
128 |
||
129 |
Addsimps [max_0L,max_0R,max_Suc_Suc]; |