src/HOL/Nominal/nominal_induct.ML
changeset 19115 bc8da9b4a81c
parent 19036 73782d21e855
child 19903 158ea5884966
equal deleted inserted replaced
19114:dfe6ace301c3 19115:bc8da9b4a81c
    54         (P, tuple_fun (map #2 avoiding) (Term.dest_Var P)) ::
    54         (P, tuple_fun (map #2 avoiding) (Term.dest_Var P)) ::
    55         (x, tuple (map Free avoiding)) ::
    55         (x, tuple (map Free avoiding)) ::
    56         List.mapPartial (fn (z, SOME t) => SOME (z, t) | _ => NONE) (zs ~~ inst)
    56         List.mapPartial (fn (z, SOME t) => SOME (z, t) | _ => NONE) (zs ~~ inst)
    57       end;
    57       end;
    58      val substs =
    58      val substs =
    59        map2 subst insts rules |> List.concat |> distinct
    59        map2 subst insts rules |> List.concat |> distinct (op =)
    60        |> map (pairself (Thm.cterm_of thy));
    60        |> map (pairself (Thm.cterm_of thy));
    61   in (((cases, concls), consumes), Drule.cterm_instantiate substs rule) end;
    61   in (((cases, concls), consumes), Drule.cterm_instantiate substs rule) end;
    62 
    62 
    63 fun rename_params_rule internal xs rule =
    63 fun rename_params_rule internal xs rule =
    64   let
    64   let
    88     val cert = Thm.cterm_of thy;
    88     val cert = Thm.cterm_of thy;
    89 
    89 
    90     val ((insts, defs), defs_ctxt) = fold_map InductMethod.add_defs def_insts ctxt |>> split_list;
    90     val ((insts, defs), defs_ctxt) = fold_map InductMethod.add_defs def_insts ctxt |>> split_list;
    91     val atomized_defs = map (map ObjectLogic.atomize_thm) defs;
    91     val atomized_defs = map (map ObjectLogic.atomize_thm) defs;
    92 
    92 
    93     val finish_rule = PolyML.print #>
    93     val finish_rule =
    94       split_all_tuples
    94       split_all_tuples
    95       #> rename_params_rule true (map (ProofContext.revert_skolem defs_ctxt o fst) avoiding) #> PolyML.print;
    95       #> rename_params_rule true (map (ProofContext.revert_skolem defs_ctxt o fst) avoiding);
    96     fun rule_cases r = RuleCases.make_nested true (Thm.prop_of r) (InductMethod.rulified_term r);
    96     fun rule_cases r = RuleCases.make_nested true (Thm.prop_of r) (InductMethod.rulified_term r);
    97   in
    97   in
    98     (fn i => fn st =>
    98     (fn i => fn st =>
    99       rules
    99       rules
   100       |> inst_mutual_rule thy insts avoiding
   100       |> inst_mutual_rule thy insts avoiding
   106               THEN' InductMethod.fix_tac defs_ctxt
   106               THEN' InductMethod.fix_tac defs_ctxt
   107                 (nth concls (j - 1) + more_consumes)
   107                 (nth concls (j - 1) + more_consumes)
   108                 (nth_list fixings (j - 1))))
   108                 (nth_list fixings (j - 1))))
   109           THEN' InductMethod.inner_atomize_tac) j))
   109           THEN' InductMethod.inner_atomize_tac) j))
   110         THEN' InductMethod.atomize_tac) i st |> Seq.maps (fn st' =>
   110         THEN' InductMethod.atomize_tac) i st |> Seq.maps (fn st' =>
   111             InductMethod.guess_instance (finish_rule (InductMethod.internalize more_consumes rule)) i (PolyML.print st')
   111             InductMethod.guess_instance
       
   112               (finish_rule (InductMethod.internalize more_consumes rule)) i st'
   112             |> Seq.maps (fn rule' =>
   113             |> Seq.maps (fn rule' =>
   113               CASES (rule_cases (PolyML.print rule') cases)
   114               CASES (rule_cases rule' cases)
   114                 (Tactic.rtac (rename_params_rule false [] rule') i THEN
   115                 (Tactic.rtac (rename_params_rule false [] rule') i THEN
   115                   PRIMSEQ (ProofContext.exports defs_ctxt ctxt)) st'))))
   116                   PRIMSEQ (ProofContext.exports defs_ctxt ctxt)) st'))))
   116     THEN_ALL_NEW_CASES InductMethod.rulify_tac
   117     THEN_ALL_NEW_CASES InductMethod.rulify_tac
   117   end;
   118   end;
   118 
   119