src/HOL/Nominal/nominal_inductive.ML
changeset 59621 291934bac95e
parent 59586 ddf6deaadfe8
child 59936 b8ffc3dc9e24
equal deleted inserted replaced
59620:92d7d8e4f1bf 59621:291934bac95e
   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