65 fun mk_ncanT_tac thy defs top_crls crls s = prove_goalw thy defs s |
65 fun mk_ncanT_tac thy defs top_crls crls s = prove_goalw thy defs s |
66 (fn major::prems => [(resolve_tac ([major] RL top_crls) 1), |
66 (fn major::prems => [(resolve_tac ([major] RL top_crls) 1), |
67 (REPEAT_SOME (eresolve_tac (crls @ [exE,bexE,conjE,disjE]))), |
67 (REPEAT_SOME (eresolve_tac (crls @ [exE,bexE,conjE,disjE]))), |
68 (ALLGOALS (asm_simp_tac term_ss)), |
68 (ALLGOALS (asm_simp_tac term_ss)), |
69 (ALLGOALS (ares_tac (prems RL [lemma]) ORELSE' |
69 (ALLGOALS (ares_tac (prems RL [lemma]) ORELSE' |
70 eresolve_tac [bspec])), |
70 etac bspec )), |
71 (safe_tac (ccl_cs addSIs prems))]); |
71 (safe_tac (ccl_cs addSIs prems))]); |
72 end; |
72 end; |
73 |
73 |
74 val ncanT_tac = mk_ncanT_tac Type.thy [] case_rls case_rls; |
74 val ncanT_tac = mk_ncanT_tac Type.thy [] case_rls case_rls; |
75 |
75 |
116 by (REPEAT (ares_tac [monoI,subset_refl] 1)); |
116 by (REPEAT (ares_tac [monoI,subset_refl] 1)); |
117 val constM = result(); |
117 val constM = result(); |
118 |
118 |
119 val major::prems = goal Type.thy |
119 val major::prems = goal Type.thy |
120 "mono(%X.A(X)) ==> mono(%X.[A(X)])"; |
120 "mono(%X.A(X)) ==> mono(%X.[A(X)])"; |
121 br (subsetI RS monoI) 1; |
121 by (rtac (subsetI RS monoI) 1); |
122 bd (LiftXH RS iffD1) 1; |
122 by (dtac (LiftXH RS iffD1) 1); |
123 be disjE 1; |
123 by (etac disjE 1); |
124 be (disjI1 RS (LiftXH RS iffD2)) 1; |
124 by (etac (disjI1 RS (LiftXH RS iffD2)) 1); |
125 br (disjI2 RS (LiftXH RS iffD2)) 1; |
125 by (rtac (disjI2 RS (LiftXH RS iffD2)) 1); |
126 be (major RS monoD RS subsetD) 1; |
126 by (etac (major RS monoD RS subsetD) 1); |
127 ba 1; |
127 by (assume_tac 1); |
128 val LiftM = result(); |
128 val LiftM = result(); |
129 |
129 |
130 val prems = goal Type.thy |
130 val prems = goal Type.thy |
131 "[| mono(%X.A(X)); !!x X. x:A(X) ==> mono(%X.B(X,x)) |] ==> \ |
131 "[| mono(%X.A(X)); !!x X. x:A(X) ==> mono(%X.B(X,x)) |] ==> \ |
132 \ mono(%X.Sigma(A(X),B(X)))"; |
132 \ mono(%X.Sigma(A(X),B(X)))"; |
259 (*** Theorem proving ***) |
259 (*** Theorem proving ***) |
260 |
260 |
261 val [major,minor] = goal Type.thy |
261 val [major,minor] = goal Type.thy |
262 "[| <a,b> : Sigma(A,B); [| a:A; b:B(a) |] ==> P \ |
262 "[| <a,b> : Sigma(A,B); [| a:A; b:B(a) |] ==> P \ |
263 \ |] ==> P"; |
263 \ |] ==> P"; |
264 br (major RS (XH_to_E SgXH)) 1; |
264 by (rtac (major RS (XH_to_E SgXH)) 1); |
265 br minor 1; |
265 by (rtac minor 1); |
266 by (ALLGOALS (fast_tac term_cs)); |
266 by (ALLGOALS (fast_tac term_cs)); |
267 val SgE2 = result(); |
267 val SgE2 = result(); |
268 |
268 |
269 (* General theorem proving ignores non-canonical term-formers, *) |
269 (* General theorem proving ignores non-canonical term-formers, *) |
270 (* - intro rules are type rules for canonical terms *) |
270 (* - intro rules are type rules for canonical terms *) |
275 |
275 |
276 |
276 |
277 (*** Infinite Data Types ***) |
277 (*** Infinite Data Types ***) |
278 |
278 |
279 val [mono] = goal Type.thy "mono(f) ==> lfp(f) <= gfp(f)"; |
279 val [mono] = goal Type.thy "mono(f) ==> lfp(f) <= gfp(f)"; |
280 br (lfp_lowerbound RS subset_trans) 1; |
280 by (rtac (lfp_lowerbound RS subset_trans) 1); |
281 br (mono RS gfp_lemma3) 1; |
281 by (rtac (mono RS gfp_lemma3) 1); |
282 br subset_refl 1; |
282 by (rtac subset_refl 1); |
283 val lfp_subset_gfp = result(); |
283 val lfp_subset_gfp = result(); |
284 |
284 |
285 val prems = goal Type.thy |
285 val prems = goal Type.thy |
286 "[| a:A; !!x X.[| x:A; ALL y:A.t(y):X |] ==> t(x) : B(X) |] ==> \ |
286 "[| a:A; !!x X.[| x:A; ALL y:A.t(y):X |] ==> t(x) : B(X) |] ==> \ |
287 \ t(a) : gfp(B)"; |
287 \ t(a) : gfp(B)"; |
288 br coinduct 1; |
288 by (rtac coinduct 1); |
289 by (res_inst_tac [("P","%x.EX y:A.x=t(y)")] CollectI 1); |
289 by (res_inst_tac [("P","%x.EX y:A.x=t(y)")] CollectI 1); |
290 by (ALLGOALS (fast_tac (ccl_cs addSIs prems))); |
290 by (ALLGOALS (fast_tac (ccl_cs addSIs prems))); |
291 val gfpI = result(); |
291 val gfpI = result(); |
292 |
292 |
293 val rew::prem::prems = goal Type.thy |
293 val rew::prem::prems = goal Type.thy |
300 (* EG *) |
300 (* EG *) |
301 |
301 |
302 val prems = goal Type.thy |
302 val prems = goal Type.thy |
303 "letrec g x be zero$g(x) in g(bot) : Lists(Nat)"; |
303 "letrec g x be zero$g(x) in g(bot) : Lists(Nat)"; |
304 by (rtac (refl RS (XH_to_I UnitXH) RS (Lists_def RS def_gfpI)) 1); |
304 by (rtac (refl RS (XH_to_I UnitXH) RS (Lists_def RS def_gfpI)) 1); |
305 br (letrecB RS ssubst) 1; |
305 by (rtac (letrecB RS ssubst) 1); |
306 bw cons_def; |
306 by (rewtac cons_def); |
307 by (fast_tac type_cs 1); |
307 by (fast_tac type_cs 1); |
308 result(); |
308 result(); |