251 ALL x:A. ALL y:{y: B. <<x,y>,<p,q>>:wf(R)}. g(x,y) : D(x,y) |] ==> |
251 ALL x:A. ALL y:{y: B. <<x,y>,<p,q>>:wf(R)}. g(x,y) : D(x,y) |] ==> |
252 h(p,q,g) : D(p,q)" |
252 h(p,q,g) : D(p,q)" |
253 shows "letrec g x y be h(x,y,g) in g(a,b) : D(a,b)" |
253 shows "letrec g x y be h(x,y,g) in g(a,b) : D(a,b)" |
254 apply (unfold letrec2_def) |
254 apply (unfold letrec2_def) |
255 apply (rule SPLITB [THEN subst]) |
255 apply (rule SPLITB [THEN subst]) |
256 apply (assumption | rule letrecT pairT splitT prems)+ |
256 apply (assumption | rule letrecT pairT splitT assms)+ |
257 apply (subst SPLITB) |
257 apply (subst SPLITB) |
258 apply (assumption | rule ballI SubtypeI prems)+ |
258 apply (assumption | rule ballI SubtypeI assms)+ |
259 apply (rule SPLITB [THEN subst]) |
259 apply (rule SPLITB [THEN subst]) |
260 apply (assumption | rule letrecT SubtypeI pairT splitT prems | |
260 apply (assumption | rule letrecT SubtypeI pairT splitT assms | |
261 erule bspec SubtypeE sym [THEN subst])+ |
261 erule bspec SubtypeE sym [THEN subst])+ |
262 done |
262 done |
263 |
263 |
264 lemma lem: "SPLIT(<a,<b,c>>,%x xs. SPLIT(xs,%y z. B(x,y,z))) = B(a,b,c)" |
264 lemma lem: "SPLIT(<a,<b,c>>,%x xs. SPLIT(xs,%y z. B(x,y,z))) = B(a,b,c)" |
265 by (simp add: SPLITB) |
265 by (simp add: SPLITB) |
273 g(x,y,z) : D(x,y,z) |] ==> |
273 g(x,y,z) : D(x,y,z) |] ==> |
274 h(p,q,r,g) : D(p,q,r)" |
274 h(p,q,r,g) : D(p,q,r)" |
275 shows "letrec g x y z be h(x,y,z,g) in g(a,b,c) : D(a,b,c)" |
275 shows "letrec g x y z be h(x,y,z,g) in g(a,b,c) : D(a,b,c)" |
276 apply (unfold letrec3_def) |
276 apply (unfold letrec3_def) |
277 apply (rule lem [THEN subst]) |
277 apply (rule lem [THEN subst]) |
278 apply (assumption | rule letrecT pairT splitT prems)+ |
278 apply (assumption | rule letrecT pairT splitT assms)+ |
279 apply (simp add: SPLITB) |
279 apply (simp add: SPLITB) |
280 apply (assumption | rule ballI SubtypeI prems)+ |
280 apply (assumption | rule ballI SubtypeI assms)+ |
281 apply (rule lem [THEN subst]) |
281 apply (rule lem [THEN subst]) |
282 apply (assumption | rule letrecT SubtypeI pairT splitT prems | |
282 apply (assumption | rule letrecT SubtypeI pairT splitT assms | |
283 erule bspec SubtypeE sym [THEN subst])+ |
283 erule bspec SubtypeE sym [THEN subst])+ |
284 done |
284 done |
285 |
285 |
286 lemmas letrecTs = letrecT letrec2T letrec3T |
286 lemmas letrecTs = letrecT letrec2T letrec3T |
287 |
287 |