src/CCL/Type.ML
changeset 642 0db578095e6a
parent 289 78541329ff35
child 757 2ca12511676d
equal deleted inserted replaced
641:49fc43cd6a35 642:0db578095e6a
    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();