src/CCL/eval.ML
changeset 757 2ca12511676d
parent 642 0db578095e6a
child 1459 d12da312eff4
equal deleted inserted replaced
756:e0e5c1581e4c 757:2ca12511676d
    14 fun ceval_tac rls = DEPTH_SOLVE_1 (resolve_tac (!EVal_rls@rls) 1);
    14 fun ceval_tac rls = DEPTH_SOLVE_1 (resolve_tac (!EVal_rls@rls) 1);
    15 
    15 
    16 val prems = goalw thy [apply_def]
    16 val prems = goalw thy [apply_def]
    17    "[| f ---> lam x.b(x);  b(a) ---> c |] ==> f ` a ---> c";
    17    "[| f ---> lam x.b(x);  b(a) ---> c |] ==> f ` a ---> c";
    18 by (ceval_tac prems);
    18 by (ceval_tac prems);
    19 val applyV = result();
    19 qed "applyV";
    20 
    20 
    21 EVal_rls := !EVal_rls @ [applyV];
    21 EVal_rls := !EVal_rls @ [applyV];
    22 
    22 
    23 val major::prems = goalw thy [let_def]
    23 val major::prems = goalw thy [let_def]
    24    "[| t ---> a;  f(a) ---> c |] ==> let x be t in f(x) ---> c";
    24    "[| t ---> a;  f(a) ---> c |] ==> let x be t in f(x) ---> c";
    25 by (rtac (major RS canonical) 1);
    25 by (rtac (major RS canonical) 1);
    26 by (REPEAT (DEPTH_SOLVE_1 (resolve_tac ([major]@prems@(!EVal_rls)) 1 ORELSE
    26 by (REPEAT (DEPTH_SOLVE_1 (resolve_tac ([major]@prems@(!EVal_rls)) 1 ORELSE
    27                            etac substitute 1)));
    27                            etac substitute 1)));
    28 val letV = result();
    28 qed "letV";
    29 
    29 
    30 val prems = goalw thy [fix_def]
    30 val prems = goalw thy [fix_def]
    31    "f(fix(f)) ---> c ==> fix(f) ---> c";
    31    "f(fix(f)) ---> c ==> fix(f) ---> c";
    32 by (rtac applyV 1);
    32 by (rtac applyV 1);
    33 by (rtac lamV 1);
    33 by (rtac lamV 1);
    34 by (resolve_tac prems 1);
    34 by (resolve_tac prems 1);
    35 val fixV = result();
    35 qed "fixV";
    36 
    36 
    37 val prems = goalw thy [letrec_def]
    37 val prems = goalw thy [letrec_def]
    38     "h(t,%y.letrec g x be h(x,g) in g(y)) ---> c ==> \
    38     "h(t,%y.letrec g x be h(x,g) in g(y)) ---> c ==> \
    39 \                  letrec g x be h(x,g) in g(t) ---> c";
    39 \                  letrec g x be h(x,g) in g(t) ---> c";
    40 by (REPEAT (resolve_tac (prems @ [fixV,applyV,lamV]) 1));
    40 by (REPEAT (resolve_tac (prems @ [fixV,applyV,lamV]) 1));
    41 val letrecV = result();
    41 qed "letrecV";
    42 
    42 
    43 EVal_rls := !EVal_rls @ [letV,letrecV,fixV];
    43 EVal_rls := !EVal_rls @ [letV,letrecV,fixV];
    44 
    44 
    45 fun mk_V_rl s = prove_goalw thy data_defs s (fn prems => [ceval_tac prems]);
    45 fun mk_V_rl s = prove_goalw thy data_defs s (fn prems => [ceval_tac prems]);
    46 
    46