author | wenzelm |
Sun, 23 Jul 2000 12:02:22 +0200 | |
changeset 9410 | 612ee826a409 |
parent 8201 | a81d18b0a9b1 |
child 9491 | 1a36151ee2fc |
permissions | -rw-r--r-- |
1461 | 1 |
(* Title: ZF/ex/Primrec |
515 | 2 |
ID: $Id$ |
1461 | 3 |
Author: Lawrence C Paulson, Cambridge University Computer Laboratory |
515 | 4 |
Copyright 1994 University of Cambridge |
5 |
||
6 |
Primitive Recursive Functions |
|
7 |
||
8 |
Proof adopted from |
|
9 |
Nora Szasz, |
|
10 |
A Machine Checked Proof that Ackermann's Function is not Primitive Recursive, |
|
11 |
In: Huet & Plotkin, eds., Logical Environments (CUP, 1993), 317-338. |
|
12 |
||
13 |
See also E. Mendelson, Introduction to Mathematical Logic. |
|
14 |
(Van Nostrand, 1964), page 250, exercise 11. |
|
15 |
*) |
|
16 |
||
17 |
(*** Inductive definition of the PR functions ***) |
|
18 |
||
6044
e0f9d930e956
Needs separate theory Primrec_defs due to new inductive defs package
paulson
parents:
5268
diff
changeset
|
19 |
(* c: prim_rec ==> c: list(nat) -> nat *) |
e0f9d930e956
Needs separate theory Primrec_defs due to new inductive defs package
paulson
parents:
5268
diff
changeset
|
20 |
val prim_rec_into_fun = prim_rec.dom_subset RS subsetD; |
515 | 21 |
|
6153 | 22 |
AddTCs ([prim_rec_into_fun] @ prim_rec.intrs); |
515 | 23 |
|
6071 | 24 |
Goal "i:nat ==> ACK(i): prim_rec"; |
6070 | 25 |
by (induct_tac "i" 1); |
2469 | 26 |
by (ALLGOALS Asm_simp_tac); |
6044
e0f9d930e956
Needs separate theory Primrec_defs due to new inductive defs package
paulson
parents:
5268
diff
changeset
|
27 |
qed "ACK_in_prim_rec"; |
515 | 28 |
|
6153 | 29 |
AddTCs [ACK_in_prim_rec, prim_rec_into_fun RS apply_type, |
30 |
list_add_type, nat_into_Ord, rec_type]; |
|
515 | 31 |
|
5137 | 32 |
Goal "[| i:nat; j:nat |] ==> ack(i,j): nat"; |
6071 | 33 |
by Auto_tac; |
760 | 34 |
qed "ack_type"; |
6153 | 35 |
AddTCs [ack_type]; |
515 | 36 |
|
37 |
(** Ackermann's function cases **) |
|
38 |
||
39 |
(*PROPERTY A 1*) |
|
6071 | 40 |
Goal "j:nat ==> ack(0,j) = succ(j)"; |
4091 | 41 |
by (asm_simp_tac (simpset() addsimps [SC]) 1); |
782
200a16083201
added bind_thm for theorems defined by "standard ..."
clasohm
parents:
760
diff
changeset
|
42 |
qed "ack_0"; |
515 | 43 |
|
44 |
(*PROPERTY A 2*) |
|
6071 | 45 |
Goal "ack(succ(i), 0) = ack(i,1)"; |
4091 | 46 |
by (asm_simp_tac (simpset() addsimps [CONST,PREC_0]) 1); |
782
200a16083201
added bind_thm for theorems defined by "standard ..."
clasohm
parents:
760
diff
changeset
|
47 |
qed "ack_succ_0"; |
515 | 48 |
|
49 |
(*PROPERTY A 3*) |
|
6071 | 50 |
Goal "[| i:nat; j:nat |] \ |
51 |
\ ==> ack(succ(i), succ(j)) = ack(i, ack(succ(i), j))"; |
|
4091 | 52 |
by (asm_simp_tac (simpset() addsimps [CONST,PREC_succ,COMP_1,PROJ_0]) 1); |
782
200a16083201
added bind_thm for theorems defined by "standard ..."
clasohm
parents:
760
diff
changeset
|
53 |
qed "ack_succ_succ"; |
515 | 54 |
|
8201 | 55 |
Addsimps [ack_0, ack_succ_0, ack_succ_succ, ack_type]; |
6071 | 56 |
Delsimps [ACK_0, ACK_succ]; |
57 |
||
515 | 58 |
|
59 |
(*PROPERTY A 4*) |
|
5137 | 60 |
Goal "i:nat ==> ALL j:nat. j < ack(i,j)"; |
6070 | 61 |
by (induct_tac "i" 1); |
2469 | 62 |
by (Asm_simp_tac 1); |
515 | 63 |
by (rtac ballI 1); |
6070 | 64 |
by (induct_tac "j" 1); |
6071 | 65 |
by (etac (succ_leI RS lt_trans1) 2); |
66 |
by (rtac (nat_0I RS nat_0_le RS lt_trans) 1); |
|
67 |
by Auto_tac; |
|
6112 | 68 |
qed_spec_mp "lt_ack2"; |
515 | 69 |
|
70 |
(*PROPERTY A 5-, the single-step lemma*) |
|
5137 | 71 |
Goal "[| i:nat; j:nat |] ==> ack(i,j) < ack(i, succ(j))"; |
6070 | 72 |
by (induct_tac "i" 1); |
4091 | 73 |
by (ALLGOALS (asm_simp_tac (simpset() addsimps [lt_ack2]))); |
782
200a16083201
added bind_thm for theorems defined by "standard ..."
clasohm
parents:
760
diff
changeset
|
74 |
qed "ack_lt_ack_succ2"; |
515 | 75 |
|
76 |
(*PROPERTY A 5, monotonicity for < *) |
|
5137 | 77 |
Goal "[| j<k; i:nat; k:nat |] ==> ack(i,j) < ack(i,k)"; |
7499 | 78 |
by (ftac lt_nat_in_nat 1 THEN assume_tac 1); |
515 | 79 |
by (etac succ_lt_induct 1); |
80 |
by (assume_tac 1); |
|
81 |
by (rtac lt_trans 2); |
|
6153 | 82 |
by (auto_tac (claset() addIs [ack_lt_ack_succ2], simpset())); |
760 | 83 |
qed "ack_lt_mono2"; |
515 | 84 |
|
85 |
(*PROPERTY A 5', monotonicity for le *) |
|
5147
825877190618
More tidying and removal of "\!\!... from Goal commands
paulson
parents:
5137
diff
changeset
|
86 |
Goal "[| j le k; i: nat; k:nat |] ==> ack(i,j) le ack(i,k)"; |
3840 | 87 |
by (res_inst_tac [("f", "%j. ack(i,j)")] Ord_lt_mono_imp_le_mono 1); |
515 | 88 |
by (REPEAT (ares_tac [ack_lt_mono2, ack_type RS nat_into_Ord] 1)); |
782
200a16083201
added bind_thm for theorems defined by "standard ..."
clasohm
parents:
760
diff
changeset
|
89 |
qed "ack_le_mono2"; |
515 | 90 |
|
91 |
(*PROPERTY A 6*) |
|
5147
825877190618
More tidying and removal of "\!\!... from Goal commands
paulson
parents:
5137
diff
changeset
|
92 |
Goal "[| i:nat; j:nat |] ==> ack(i, succ(j)) le ack(succ(i), j)"; |
6070 | 93 |
by (induct_tac "j" 1); |
2469 | 94 |
by (ALLGOALS Asm_simp_tac); |
515 | 95 |
by (rtac ack_le_mono2 1); |
96 |
by (rtac (lt_ack2 RS succ_leI RS le_trans) 1); |
|
6153 | 97 |
by Auto_tac; |
760 | 98 |
qed "ack2_le_ack1"; |
515 | 99 |
|
100 |
(*PROPERTY A 7-, the single-step lemma*) |
|
5137 | 101 |
Goal "[| i:nat; j:nat |] ==> ack(i,j) < ack(succ(i),j)"; |
515 | 102 |
by (rtac (ack_lt_mono2 RS lt_trans2) 1); |
103 |
by (rtac ack2_le_ack1 4); |
|
6153 | 104 |
by Auto_tac; |
760 | 105 |
qed "ack_lt_ack_succ1"; |
515 | 106 |
|
107 |
(*PROPERTY A 7, monotonicity for < *) |
|
5137 | 108 |
Goal "[| i<j; j:nat; k:nat |] ==> ack(i,k) < ack(j,k)"; |
7499 | 109 |
by (ftac lt_nat_in_nat 1 THEN assume_tac 1); |
515 | 110 |
by (etac succ_lt_induct 1); |
111 |
by (assume_tac 1); |
|
112 |
by (rtac lt_trans 2); |
|
6153 | 113 |
by (auto_tac (claset() addIs [ack_lt_ack_succ1], simpset())); |
760 | 114 |
qed "ack_lt_mono1"; |
515 | 115 |
|
116 |
(*PROPERTY A 7', monotonicity for le *) |
|
5147
825877190618
More tidying and removal of "\!\!... from Goal commands
paulson
parents:
5137
diff
changeset
|
117 |
Goal "[| i le j; j:nat; k:nat |] ==> ack(i,k) le ack(j,k)"; |
3840 | 118 |
by (res_inst_tac [("f", "%j. ack(j,k)")] Ord_lt_mono_imp_le_mono 1); |
515 | 119 |
by (REPEAT (ares_tac [ack_lt_mono1, ack_type RS nat_into_Ord] 1)); |
760 | 120 |
qed "ack_le_mono1"; |
515 | 121 |
|
122 |
(*PROPERTY A 8*) |
|
5137 | 123 |
Goal "j:nat ==> ack(1,j) = succ(succ(j))"; |
6070 | 124 |
by (induct_tac "j" 1); |
2469 | 125 |
by (ALLGOALS Asm_simp_tac); |
760 | 126 |
qed "ack_1"; |
515 | 127 |
|
128 |
(*PROPERTY A 9*) |
|
5137 | 129 |
Goal "j:nat ==> ack(succ(1),j) = succ(succ(succ(j#+j)))"; |
6070 | 130 |
by (induct_tac "j" 1); |
4091 | 131 |
by (ALLGOALS (asm_simp_tac (simpset() addsimps [ack_1, add_succ_right]))); |
782
200a16083201
added bind_thm for theorems defined by "standard ..."
clasohm
parents:
760
diff
changeset
|
132 |
qed "ack_2"; |
515 | 133 |
|
134 |
(*PROPERTY A 10*) |
|
5147
825877190618
More tidying and removal of "\!\!... from Goal commands
paulson
parents:
5137
diff
changeset
|
135 |
Goal "[| i1:nat; i2:nat; j:nat |] ==> \ |
515 | 136 |
\ ack(i1, ack(i2,j)) < ack(succ(succ(i1#+i2)), j)"; |
137 |
by (rtac (ack2_le_ack1 RSN (2,lt_trans2)) 1); |
|
2469 | 138 |
by (Asm_simp_tac 1); |
515 | 139 |
by (rtac (add_le_self RS ack_le_mono1 RS lt_trans1) 1); |
140 |
by (rtac (add_le_self2 RS ack_lt_mono1 RS ack_lt_mono2) 5); |
|
6071 | 141 |
by Auto_tac; |
760 | 142 |
qed "ack_nest_bound"; |
515 | 143 |
|
144 |
(*PROPERTY A 11*) |
|
5147
825877190618
More tidying and removal of "\!\!... from Goal commands
paulson
parents:
5137
diff
changeset
|
145 |
Goal "[| i1:nat; i2:nat; j:nat |] ==> \ |
515 | 146 |
\ ack(i1,j) #+ ack(i2,j) < ack(succ(succ(succ(succ(i1#+i2)))), j)"; |
147 |
by (res_inst_tac [("j", "ack(succ(1), ack(i1 #+ i2, j))")] lt_trans 1); |
|
4091 | 148 |
by (asm_simp_tac (simpset() addsimps [ack_2]) 1); |
515 | 149 |
by (rtac (ack_nest_bound RS lt_trans2) 2); |
2469 | 150 |
by (Asm_simp_tac 5); |
515 | 151 |
by (rtac (add_le_mono RS leI RS leI) 1); |
6153 | 152 |
by (auto_tac (claset() addIs [add_le_self, add_le_self2, ack_le_mono1], |
153 |
simpset())); |
|
760 | 154 |
qed "ack_add_bound"; |
515 | 155 |
|
156 |
(*PROPERTY A 12. Article uses existential quantifier but the ALF proof |
|
157 |
used k#+4. Quantified version must be nested EX k'. ALL i,j... *) |
|
5147
825877190618
More tidying and removal of "\!\!... from Goal commands
paulson
parents:
5137
diff
changeset
|
158 |
Goal "[| i < ack(k,j); j:nat; k:nat |] ==> \ |
515 | 159 |
\ i#+j < ack(succ(succ(succ(succ(k)))), j)"; |
160 |
by (res_inst_tac [("j", "ack(k,j) #+ ack(0,j)")] lt_trans 1); |
|
161 |
by (rtac (ack_add_bound RS lt_trans2) 2); |
|
6163 | 162 |
by (rtac add_lt_mono 1); |
6153 | 163 |
by Auto_tac; |
782
200a16083201
added bind_thm for theorems defined by "standard ..."
clasohm
parents:
760
diff
changeset
|
164 |
qed "ack_add_bound2"; |
515 | 165 |
|
166 |
(*** MAIN RESULT ***) |
|
167 |
||
8201 | 168 |
Addsimps [list_add_type]; |
515 | 169 |
|
6065 | 170 |
Goalw [SC_def] "l: list(nat) ==> SC ` l < ack(1, list_add(l))"; |
171 |
by (exhaust_tac "l" 1); |
|
4091 | 172 |
by (asm_simp_tac (simpset() addsimps [succ_iff]) 1); |
173 |
by (asm_simp_tac (simpset() addsimps [ack_1, add_le_self]) 1); |
|
782
200a16083201
added bind_thm for theorems defined by "standard ..."
clasohm
parents:
760
diff
changeset
|
174 |
qed "SC_case"; |
515 | 175 |
|
176 |
(*PROPERTY A 4'? Extra lemma needed for CONST case, constant functions*) |
|
5137 | 177 |
Goal "[| i:nat; j:nat |] ==> i < ack(i,j)"; |
6070 | 178 |
by (induct_tac "i" 1); |
4091 | 179 |
by (asm_simp_tac (simpset() addsimps [nat_0_le]) 1); |
515 | 180 |
by (etac ([succ_leI, ack_lt_ack_succ1] MRS lt_trans1) 1); |
6071 | 181 |
by Auto_tac; |
760 | 182 |
qed "lt_ack1"; |
515 | 183 |
|
5068 | 184 |
Goalw [CONST_def] |
5147
825877190618
More tidying and removal of "\!\!... from Goal commands
paulson
parents:
5137
diff
changeset
|
185 |
"[| l: list(nat); k: nat |] ==> CONST(k) ` l < ack(k, list_add(l))"; |
4091 | 186 |
by (asm_simp_tac (simpset() addsimps [lt_ack1]) 1); |
782
200a16083201
added bind_thm for theorems defined by "standard ..."
clasohm
parents:
760
diff
changeset
|
187 |
qed "CONST_case"; |
515 | 188 |
|
5068 | 189 |
Goalw [PROJ_def] |
5147
825877190618
More tidying and removal of "\!\!... from Goal commands
paulson
parents:
5137
diff
changeset
|
190 |
"l: list(nat) ==> ALL i:nat. PROJ(i) ` l < ack(0, list_add(l))"; |
2469 | 191 |
by (Asm_simp_tac 1); |
515 | 192 |
by (etac list.induct 1); |
4091 | 193 |
by (asm_simp_tac (simpset() addsimps [nat_0_le]) 1); |
2469 | 194 |
by (Asm_simp_tac 1); |
515 | 195 |
by (rtac ballI 1); |
196 |
by (eres_inst_tac [("n","x")] natE 1); |
|
4091 | 197 |
by (asm_simp_tac (simpset() addsimps [add_le_self]) 1); |
2469 | 198 |
by (Asm_simp_tac 1); |
515 | 199 |
by (etac (bspec RS lt_trans2) 1); |
200 |
by (rtac (add_le_self2 RS succ_leI) 2); |
|
6071 | 201 |
by Auto_tac; |
6154
6a00a5baef2b
automatic insertion of datatype intr rules into claset
paulson
parents:
6153
diff
changeset
|
202 |
qed_spec_mp "PROJ_case"; |
515 | 203 |
|
204 |
(** COMP case **) |
|
205 |
||
6044
e0f9d930e956
Needs separate theory Primrec_defs due to new inductive defs package
paulson
parents:
5268
diff
changeset
|
206 |
Goal "fs : list({f: prim_rec . \ |
1461 | 207 |
\ EX kf:nat. ALL l:list(nat). \ |
208 |
\ f`l < ack(kf, list_add(l))}) \ |
|
209 |
\ ==> EX k:nat. ALL l: list(nat). \ |
|
515 | 210 |
\ list_add(map(%f. f ` l, fs)) < ack(k, list_add(l))"; |
211 |
by (etac list.induct 1); |
|
6071 | 212 |
by (res_inst_tac [("x","0")] bexI 1); |
6154
6a00a5baef2b
automatic insertion of datatype intr rules into claset
paulson
parents:
6153
diff
changeset
|
213 |
by (ALLGOALS (asm_simp_tac (simpset() addsimps [lt_ack1, nat_0_le]))); |
6a00a5baef2b
automatic insertion of datatype intr rules into claset
paulson
parents:
6153
diff
changeset
|
214 |
by (Clarify_tac 1); |
515 | 215 |
by (rtac (ballI RS bexI) 1); |
216 |
by (rtac (add_lt_mono RS lt_trans) 1); |
|
217 |
by (REPEAT (FIRSTGOAL (etac bspec))); |
|
218 |
by (rtac ack_add_bound 5); |
|
6071 | 219 |
by Auto_tac; |
782
200a16083201
added bind_thm for theorems defined by "standard ..."
clasohm
parents:
760
diff
changeset
|
220 |
qed "COMP_map_lemma"; |
515 | 221 |
|
5068 | 222 |
Goalw [COMP_def] |
5147
825877190618
More tidying and removal of "\!\!... from Goal commands
paulson
parents:
5137
diff
changeset
|
223 |
"[| kg: nat; \ |
1461 | 224 |
\ ALL l:list(nat). g`l < ack(kg, list_add(l)); \ |
6044
e0f9d930e956
Needs separate theory Primrec_defs due to new inductive defs package
paulson
parents:
5268
diff
changeset
|
225 |
\ fs : list({f: prim_rec . \ |
1461 | 226 |
\ EX kf:nat. ALL l:list(nat). \ |
227 |
\ f`l < ack(kf, list_add(l))}) \ |
|
515 | 228 |
\ |] ==> EX k:nat. ALL l: list(nat). COMP(g,fs)`l < ack(k, list_add(l))"; |
2469 | 229 |
by (Asm_simp_tac 1); |
7499 | 230 |
by (ftac list_CollectD 1); |
515 | 231 |
by (etac (COMP_map_lemma RS bexE) 1); |
232 |
by (rtac (ballI RS bexI) 1); |
|
233 |
by (etac (bspec RS lt_trans) 1); |
|
234 |
by (rtac lt_trans 2); |
|
235 |
by (rtac ack_nest_bound 3); |
|
236 |
by (etac (bspec RS ack_lt_mono2) 2); |
|
6071 | 237 |
by Auto_tac; |
782
200a16083201
added bind_thm for theorems defined by "standard ..."
clasohm
parents:
760
diff
changeset
|
238 |
qed "COMP_case"; |
515 | 239 |
|
240 |
(** PREC case **) |
|
241 |
||
5068 | 242 |
Goalw [PREC_def] |
5147
825877190618
More tidying and removal of "\!\!... from Goal commands
paulson
parents:
5137
diff
changeset
|
243 |
"[| ALL l:list(nat). f`l #+ list_add(l) < ack(kf, list_add(l)); \ |
1461 | 244 |
\ ALL l:list(nat). g`l #+ list_add(l) < ack(kg, list_add(l)); \ |
6044
e0f9d930e956
Needs separate theory Primrec_defs due to new inductive defs package
paulson
parents:
5268
diff
changeset
|
245 |
\ f: prim_rec; kf: nat; \ |
e0f9d930e956
Needs separate theory Primrec_defs due to new inductive defs package
paulson
parents:
5268
diff
changeset
|
246 |
\ g: prim_rec; kg: nat; \ |
1461 | 247 |
\ l: list(nat) \ |
515 | 248 |
\ |] ==> PREC(f,g)`l #+ list_add(l) < ack(succ(kf#+kg), list_add(l))"; |
6065 | 249 |
by (exhaust_tac "l" 1); |
4091 | 250 |
by (asm_simp_tac (simpset() addsimps [[nat_le_refl, lt_ack2] MRS lt_trans]) 1); |
2469 | 251 |
by (Asm_simp_tac 1); |
515 | 252 |
by (etac ssubst 1); (*get rid of the needless assumption*) |
6070 | 253 |
by (induct_tac "a" 1); |
515 | 254 |
(*base case*) |
6071 | 255 |
by (EVERY1 [Asm_simp_tac, rtac lt_trans, etac bspec, |
6153 | 256 |
assume_tac, rtac (add_le_self RS ack_lt_mono1)]); |
6154
6a00a5baef2b
automatic insertion of datatype intr rules into claset
paulson
parents:
6153
diff
changeset
|
257 |
by (ALLGOALS Asm_simp_tac); |
515 | 258 |
(*ind step*) |
259 |
by (rtac (succ_leI RS lt_trans1) 1); |
|
260 |
by (res_inst_tac [("j", "g ` ?ll #+ ?mm")] lt_trans1 1); |
|
261 |
by (etac bspec 2); |
|
262 |
by (rtac (nat_le_refl RS add_le_mono) 1); |
|
6153 | 263 |
by Typecheck_tac; |
4091 | 264 |
by (asm_simp_tac (simpset() addsimps [add_le_self2]) 1); |
515 | 265 |
(*final part of the simplification*) |
2469 | 266 |
by (Asm_simp_tac 1); |
515 | 267 |
by (rtac (add_le_self2 RS ack_le_mono1 RS lt_trans1) 1); |
268 |
by (etac ack_lt_mono2 5); |
|
6071 | 269 |
by Auto_tac; |
782
200a16083201
added bind_thm for theorems defined by "standard ..."
clasohm
parents:
760
diff
changeset
|
270 |
qed "PREC_case_lemma"; |
515 | 271 |
|
6044
e0f9d930e956
Needs separate theory Primrec_defs due to new inductive defs package
paulson
parents:
5268
diff
changeset
|
272 |
Goal "[| f: prim_rec; kf: nat; \ |
e0f9d930e956
Needs separate theory Primrec_defs due to new inductive defs package
paulson
parents:
5268
diff
changeset
|
273 |
\ g: prim_rec; kg: nat; \ |
5147
825877190618
More tidying and removal of "\!\!... from Goal commands
paulson
parents:
5137
diff
changeset
|
274 |
\ ALL l:list(nat). f`l < ack(kf, list_add(l)); \ |
825877190618
More tidying and removal of "\!\!... from Goal commands
paulson
parents:
5137
diff
changeset
|
275 |
\ ALL l:list(nat). g`l < ack(kg, list_add(l)) \ |
825877190618
More tidying and removal of "\!\!... from Goal commands
paulson
parents:
5137
diff
changeset
|
276 |
\ |] ==> EX k:nat. ALL l: list(nat). PREC(f,g)`l< ack(k, list_add(l))"; |
515 | 277 |
by (rtac (ballI RS bexI) 1); |
278 |
by (rtac ([add_le_self, PREC_case_lemma] MRS lt_trans1) 1); |
|
6153 | 279 |
by (REPEAT_FIRST (rtac (ack_add_bound2 RS ballI) THEN' etac bspec)); |
280 |
by Typecheck_tac; |
|
782
200a16083201
added bind_thm for theorems defined by "standard ..."
clasohm
parents:
760
diff
changeset
|
281 |
qed "PREC_case"; |
515 | 282 |
|
6044
e0f9d930e956
Needs separate theory Primrec_defs due to new inductive defs package
paulson
parents:
5268
diff
changeset
|
283 |
Goal "f:prim_rec ==> EX k:nat. ALL l:list(nat). f`l < ack(k, list_add(l))"; |
e0f9d930e956
Needs separate theory Primrec_defs due to new inductive defs package
paulson
parents:
5268
diff
changeset
|
284 |
by (etac prim_rec.induct 1); |
6153 | 285 |
by (auto_tac (claset() addIs [SC_case, CONST_case, PROJ_case, COMP_case, |
286 |
PREC_case], |
|
287 |
simpset())); |
|
6044
e0f9d930e956
Needs separate theory Primrec_defs due to new inductive defs package
paulson
parents:
5268
diff
changeset
|
288 |
qed "ack_bounds_prim_rec"; |
515 | 289 |
|
6044
e0f9d930e956
Needs separate theory Primrec_defs due to new inductive defs package
paulson
parents:
5268
diff
changeset
|
290 |
Goal "~ (lam l:list(nat). list_case(0, %x xs. ack(x,x), l)) : prim_rec"; |
515 | 291 |
by (rtac notI 1); |
6044
e0f9d930e956
Needs separate theory Primrec_defs due to new inductive defs package
paulson
parents:
5268
diff
changeset
|
292 |
by (etac (ack_bounds_prim_rec RS bexE) 1); |
515 | 293 |
by (rtac lt_irrefl 1); |
294 |
by (dres_inst_tac [("x", "[x]")] bspec 1); |
|
6153 | 295 |
by Auto_tac; |
6044
e0f9d930e956
Needs separate theory Primrec_defs due to new inductive defs package
paulson
parents:
5268
diff
changeset
|
296 |
qed "ack_not_prim_rec"; |
515 | 297 |