12 \ !!p g.[| p:A; ALL x:{x: A. <x,p>:wf(R)}. g(x) : D(x) |] ==>\ |
12 \ !!p g.[| p:A; ALL x:{x: A. <x,p>:wf(R)}. g(x) : D(x) |] ==>\ |
13 \ h(p,g) : D(p) |] ==> \ |
13 \ h(p,g) : D(p) |] ==> \ |
14 \ letrec g x be h(x,g) in g(a) : D(a)"; |
14 \ letrec g x be h(x,g) in g(a) : D(a)"; |
15 by (rtac (major RS rev_mp) 1); |
15 by (rtac (major RS rev_mp) 1); |
16 by (rtac (wf_wf RS wfd_induct) 1); |
16 by (rtac (wf_wf RS wfd_induct) 1); |
17 by (rtac (letrecB RS ssubst) 1); |
17 by (stac letrecB 1); |
18 by (rtac impI 1); |
18 by (rtac impI 1); |
19 by (eresolve_tac prems 1); |
19 by (eresolve_tac prems 1); |
20 by (rtac ballI 1); |
20 by (rtac ballI 1); |
21 by (etac (spec RS mp RS mp) 1); |
21 by (etac (spec RS mp RS mp) 1); |
22 by (REPEAT (eresolve_tac [SubtypeD1,SubtypeD2] 1)); |
22 by (REPEAT (eresolve_tac [SubtypeD1,SubtypeD2] 1)); |
33 \ ALL x:A.ALL y:{y: B. <<x,y>,<p,q>>:wf(R)}. g(x,y) : D(x,y) |] ==>\ |
33 \ ALL x:A.ALL y:{y: B. <<x,y>,<p,q>>:wf(R)}. g(x,y) : D(x,y) |] ==>\ |
34 \ h(p,q,g) : D(p,q) |] ==> \ |
34 \ h(p,q,g) : D(p,q) |] ==> \ |
35 \ letrec g x y be h(x,y,g) in g(a,b) : D(a,b)"; |
35 \ letrec g x y be h(x,y,g) in g(a,b) : D(a,b)"; |
36 by (rtac (SPLITB RS subst) 1); |
36 by (rtac (SPLITB RS subst) 1); |
37 by (REPEAT (ares_tac ([letrecT,pairT,splitT]@prems) 1)); |
37 by (REPEAT (ares_tac ([letrecT,pairT,splitT]@prems) 1)); |
38 by (rtac (SPLITB RS ssubst) 1); |
38 by (stac SPLITB 1); |
39 by (REPEAT (ares_tac ([ballI,SubtypeI]@prems) 1)); |
39 by (REPEAT (ares_tac ([ballI,SubtypeI]@prems) 1)); |
40 by (rtac (SPLITB RS subst) 1); |
40 by (rtac (SPLITB RS subst) 1); |
41 by (REPEAT (ares_tac ([letrecT,SubtypeI,pairT,splitT]@prems) 1 ORELSE |
41 by (REPEAT (ares_tac ([letrecT,SubtypeI,pairT,splitT]@prems) 1 ORELSE |
42 eresolve_tac [bspec,SubtypeE,sym RS subst] 1)); |
42 eresolve_tac [bspec,SubtypeE,sym RS subst] 1)); |
43 qed "letrec2T"; |
43 qed "letrec2T"; |