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 |