202 val (fs_ctxt_tyname, _) = Name.variant "'n" (Variable.names_of ctxt'); |
202 val (fs_ctxt_tyname, _) = Name.variant "'n" (Variable.names_of ctxt'); |
203 val ([fs_ctxt_name], ctxt'') = Variable.variant_fixes ["z"] ctxt'; |
203 val ([fs_ctxt_name], ctxt'') = Variable.variant_fixes ["z"] ctxt'; |
204 val fsT = TFree (fs_ctxt_tyname, ind_sort); |
204 val fsT = TFree (fs_ctxt_tyname, ind_sort); |
205 |
205 |
206 val inductive_forall_def' = Drule.instantiate' |
206 val inductive_forall_def' = Drule.instantiate' |
207 [SOME (Thm.ctyp_of thy fsT)] [] inductive_forall_def; |
207 [SOME (Thm.global_ctyp_of thy fsT)] [] inductive_forall_def; |
208 |
208 |
209 fun lift_pred' t (Free (s, T)) ts = |
209 fun lift_pred' t (Free (s, T)) ts = |
210 list_comb (Free (s, fsT --> T), t :: ts); |
210 list_comb (Free (s, fsT --> T), t :: ts); |
211 val lift_pred = lift_pred' (Bound 0); |
211 val lift_pred = lift_pred' (Bound 0); |
212 |
212 |
336 else pi2 |
336 else pi2 |
337 end; |
337 end; |
338 val pis'' = fold (concat_perm #> map) pis' pis; |
338 val pis'' = fold (concat_perm #> map) pis' pis; |
339 val env = Pattern.first_order_match thy (ihypt, Thm.prop_of ihyp) |
339 val env = Pattern.first_order_match thy (ihypt, Thm.prop_of ihyp) |
340 (Vartab.empty, Vartab.empty); |
340 (Vartab.empty, Vartab.empty); |
341 val ihyp' = Thm.instantiate ([], map (apply2 (Thm.cterm_of thy)) |
341 val ihyp' = Thm.instantiate ([], map (apply2 (Thm.global_cterm_of thy)) |
342 (map (Envir.subst_term env) vs ~~ |
342 (map (Envir.subst_term env) vs ~~ |
343 map (fold_rev (NominalDatatype.mk_perm []) |
343 map (fold_rev (NominalDatatype.mk_perm []) |
344 (rev pis' @ pis)) params' @ [z])) ihyp; |
344 (rev pis' @ pis)) params' @ [z])) ihyp; |
345 fun mk_pi th = |
345 fun mk_pi th = |
346 Simplifier.simplify (put_simpset HOL_basic_ss ctxt' addsimps [@{thm id_apply}] |
346 Simplifier.simplify (put_simpset HOL_basic_ss ctxt' addsimps [@{thm id_apply}] |
347 addsimprocs [NominalDatatype.perm_simproc]) |
347 addsimprocs [NominalDatatype.perm_simproc]) |
348 (Simplifier.simplify (put_simpset eqvt_ss ctxt') |
348 (Simplifier.simplify (put_simpset eqvt_ss ctxt') |
349 (fold_rev (mk_perm_bool o Thm.cterm_of thy) |
349 (fold_rev (mk_perm_bool o Thm.global_cterm_of thy) |
350 (rev pis' @ pis) th)); |
350 (rev pis' @ pis) th)); |
351 val (gprems1, gprems2) = split_list |
351 val (gprems1, gprems2) = split_list |
352 (map (fn (th, t) => |
352 (map (fn (th, t) => |
353 if null (preds_of ps t) then (SOME th, mk_pi th) |
353 if null (preds_of ps t) then (SOME th, mk_pi th) |
354 else |
354 else |
503 (obtain_fresh_name (args @ map fst qs @ params')) |
503 (obtain_fresh_name (args @ map fst qs @ params')) |
504 (map snd qs) ([], [], ctxt2); |
504 (map snd qs) ([], [], ctxt2); |
505 val freshs2' = NominalDatatype.mk_not_sym freshs2; |
505 val freshs2' = NominalDatatype.mk_not_sym freshs2; |
506 val pis = map (NominalDatatype.perm_of_pair) |
506 val pis = map (NominalDatatype.perm_of_pair) |
507 ((freshs1 ~~ map fst qs) @ (params' ~~ freshs1)); |
507 ((freshs1 ~~ map fst qs) @ (params' ~~ freshs1)); |
508 val mk_pis = fold_rev mk_perm_bool (map (Thm.cterm_of thy) pis); |
508 val mk_pis = fold_rev mk_perm_bool (map (Thm.global_cterm_of thy) pis); |
509 val obj = Thm.cterm_of thy (foldr1 HOLogic.mk_conj (map (map_aterms |
509 val obj = Thm.global_cterm_of thy (foldr1 HOLogic.mk_conj (map (map_aterms |
510 (fn x as Free _ => |
510 (fn x as Free _ => |
511 if member (op =) args x then x |
511 if member (op =) args x then x |
512 else (case AList.lookup op = tab x of |
512 else (case AList.lookup op = tab x of |
513 SOME y => y |
513 SOME y => y |
514 | NONE => fold_rev (NominalDatatype.mk_perm []) pis x) |
514 | NONE => fold_rev (NominalDatatype.mk_perm []) pis x) |
628 val res = SUBPROOF (fn {context = ctxt'', prems, params, ...} => |
628 val res = SUBPROOF (fn {context = ctxt'', prems, params, ...} => |
629 let |
629 let |
630 val prems' = map (fn th => the_default th (map_thm ctxt'' |
630 val prems' = map (fn th => the_default th (map_thm ctxt'' |
631 (split_conj (K I) names) (etac conjunct2 1) monos NONE th)) prems; |
631 (split_conj (K I) names) (etac conjunct2 1) monos NONE th)) prems; |
632 val prems'' = map (fn th => Simplifier.simplify eqvt_simpset |
632 val prems'' = map (fn th => Simplifier.simplify eqvt_simpset |
633 (mk_perm_bool (Thm.cterm_of thy pi) th)) prems'; |
633 (mk_perm_bool (Thm.global_cterm_of thy pi) th)) prems'; |
634 val intr' = Drule.cterm_instantiate (map (Thm.cterm_of thy) vs ~~ |
634 val intr' = Drule.cterm_instantiate (map (Thm.global_cterm_of thy) vs ~~ |
635 map (Thm.cterm_of thy o NominalDatatype.mk_perm [] pi o Thm.term_of o #2) params) |
635 map (Thm.global_cterm_of thy o NominalDatatype.mk_perm [] pi o Thm.term_of o #2) params) |
636 intr |
636 intr |
637 in (rtac intr' THEN_ALL_NEW (TRY o resolve_tac ctxt'' prems'')) 1 |
637 in (rtac intr' THEN_ALL_NEW (TRY o resolve_tac ctxt'' prems'')) 1 |
638 end) ctxt' 1 st |
638 end) ctxt' 1 st |
639 in |
639 in |
640 case (Seq.pull res handle THM (s, _, _) => eqvt_err s) of |
640 case (Seq.pull res handle THM (s, _, _) => eqvt_err s) of |