src/HOL/Nominal/nominal_induct.ML
changeset 54742 7a86358a3c0b
parent 53168 d998de7f0efc
child 55947 72db54a67152
equal deleted inserted replaced
54741:010eefa0a4f3 54742:7a86358a3c0b
    85   let
    85   let
    86     val thy = Proof_Context.theory_of ctxt;
    86     val thy = Proof_Context.theory_of ctxt;
    87     val cert = Thm.cterm_of thy;
    87     val cert = Thm.cterm_of thy;
    88 
    88 
    89     val ((insts, defs), defs_ctxt) = fold_map Induct.add_defs def_insts ctxt |>> split_list;
    89     val ((insts, defs), defs_ctxt) = fold_map Induct.add_defs def_insts ctxt |>> split_list;
    90     val atomized_defs = map (map (Conv.fconv_rule Induct.atomize_cterm)) defs;
    90     val atomized_defs = map (map (Conv.fconv_rule (Induct.atomize_cterm ctxt))) defs;
    91 
    91 
    92     val finish_rule =
    92     val finish_rule =
    93       split_all_tuples defs_ctxt
    93       split_all_tuples defs_ctxt
    94       #> rename_params_rule true
    94       #> rename_params_rule true
    95         (map (Name.clean o Variable.revert_fixed defs_ctxt o fst) avoiding);
    95         (map (Name.clean o Variable.revert_fixed defs_ctxt o fst) avoiding);
    99       in Rule_Cases.make_nested (Thm.prop_of r') (Induct.rulified_term r') end;
    99       in Rule_Cases.make_nested (Thm.prop_of r') (Induct.rulified_term r') end;
   100   in
   100   in
   101     (fn i => fn st =>
   101     (fn i => fn st =>
   102       rules
   102       rules
   103       |> inst_mutual_rule ctxt insts avoiding
   103       |> inst_mutual_rule ctxt insts avoiding
   104       |> Rule_Cases.consume (flat defs) facts
   104       |> Rule_Cases.consume ctxt (flat defs) facts
   105       |> Seq.maps (fn (((cases, concls), (more_consumes, more_facts)), rule) =>
   105       |> Seq.maps (fn (((cases, concls), (more_consumes, more_facts)), rule) =>
   106         (PRECISE_CONJUNCTS (length concls) (ALLGOALS (fn j =>
   106         (PRECISE_CONJUNCTS (length concls) (ALLGOALS (fn j =>
   107           (CONJUNCTS (ALLGOALS
   107           (CONJUNCTS (ALLGOALS
   108             let
   108             let
   109               val adefs = nth_list atomized_defs (j - 1);
   109               val adefs = nth_list atomized_defs (j - 1);
   116                    Induct.rotate_tac k (length adefs) THEN'
   116                    Induct.rotate_tac k (length adefs) THEN'
   117                    Induct.arbitrary_tac defs_ctxt k (List.partition (member op = frees) xs |> op @)
   117                    Induct.arbitrary_tac defs_ctxt k (List.partition (member op = frees) xs |> op @)
   118                  else
   118                  else
   119                    Induct.arbitrary_tac defs_ctxt k xs)
   119                    Induct.arbitrary_tac defs_ctxt k xs)
   120             end)
   120             end)
   121           THEN' Induct.inner_atomize_tac) j))
   121           THEN' Induct.inner_atomize_tac defs_ctxt) j))
   122         THEN' Induct.atomize_tac) i st |> Seq.maps (fn st' =>
   122         THEN' Induct.atomize_tac ctxt) i st |> Seq.maps (fn st' =>
   123             Induct.guess_instance ctxt
   123             Induct.guess_instance ctxt
   124               (finish_rule (Induct.internalize more_consumes rule)) i st'
   124               (finish_rule (Induct.internalize ctxt more_consumes rule)) i st'
   125             |> Seq.maps (fn rule' =>
   125             |> Seq.maps (fn rule' =>
   126               CASES (rule_cases ctxt rule' cases)
   126               CASES (rule_cases ctxt rule' cases)
   127                 (rtac (rename_params_rule false [] rule') i THEN
   127                 (rtac (rename_params_rule false [] rule') i THEN
   128                   PRIMITIVE (singleton (Proof_Context.export defs_ctxt ctxt))) st'))))
   128                   PRIMITIVE (singleton (Proof_Context.export defs_ctxt ctxt))) st'))))
   129     THEN_ALL_NEW_CASES
   129     THEN_ALL_NEW_CASES
   130       ((if simp then Induct.simplify_tac ctxt THEN' (TRY o Induct.trivial_tac)
   130       ((if simp then Induct.simplify_tac ctxt THEN' (TRY o Induct.trivial_tac)
   131         else K all_tac)
   131         else K all_tac)
   132        THEN_ALL_NEW Induct.rulify_tac)
   132        THEN_ALL_NEW Induct.rulify_tac ctxt)
   133   end;
   133   end;
   134 
   134 
   135 
   135 
   136 (* concrete syntax *)
   136 (* concrete syntax *)
   137 
   137