src/HOL/Nominal/nominal_induct.ML
changeset 24830 a7b3ab44d993
parent 23591 d32a85385e17
child 24920 2a45e400fdad
equal deleted inserted replaced
24829:e1214fa781ca 24830:a7b3ab44d993
    41       if length insts = l then ()
    41       if length insts = l then ()
    42       else error ("Bad number of instantiations for " ^ string_of_int l ^ " rules");
    42       else error ("Bad number of instantiations for " ^ string_of_int l ^ " rules");
    43 
    43 
    44     fun subst inst concl =
    44     fun subst inst concl =
    45       let
    45       let
    46         val vars = InductAttrib.vars_of concl;
    46         val vars = Induct.vars_of concl;
    47         val m = length vars and n = length inst;
    47         val m = length vars and n = length inst;
    48         val _ = if m >= n + 2 then () else error "Too few variables in conclusion of rule";
    48         val _ = if m >= n + 2 then () else error "Too few variables in conclusion of rule";
    49         val P :: x :: ys = vars;
    49         val P :: x :: ys = vars;
    50         val zs = Library.drop (m - n - 2, ys);
    50         val zs = Library.drop (m - n - 2, ys);
    51       in
    51       in
    85 fun nominal_induct_tac ctxt def_insts avoiding fixings rules facts =
    85 fun nominal_induct_tac ctxt def_insts avoiding fixings rules facts =
    86   let
    86   let
    87     val thy = ProofContext.theory_of ctxt;
    87     val thy = ProofContext.theory_of ctxt;
    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 Induct.add_defs def_insts ctxt |>> split_list;
    91     val atomized_defs = map (map (Conv.fconv_rule ObjectLogic.atomize)) defs;
    91     val atomized_defs = map (map (Conv.fconv_rule ObjectLogic.atomize)) defs;
    92 
    92 
    93     val finish_rule =
    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);
    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) (Induct.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 ctxt insts avoiding
   100       |> inst_mutual_rule ctxt insts avoiding
   101       |> RuleCases.consume (List.concat defs) facts
   101       |> RuleCases.consume (List.concat defs) facts
   102       |> Seq.maps (fn (((cases, concls), (more_consumes, more_facts)), rule) =>
   102       |> Seq.maps (fn (((cases, concls), (more_consumes, more_facts)), rule) =>
   103         (PRECISE_CONJUNCTS (length concls) (ALLGOALS (fn j =>
   103         (PRECISE_CONJUNCTS (length concls) (ALLGOALS (fn j =>
   104           (CONJUNCTS (ALLGOALS
   104           (CONJUNCTS (ALLGOALS
   105             (Method.insert_tac (more_facts @ nth_list atomized_defs (j - 1))
   105             (Method.insert_tac (more_facts @ nth_list atomized_defs (j - 1))
   106               THEN' InductMethod.fix_tac defs_ctxt
   106               THEN' Induct.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' Induct.inner_atomize_tac) j))
   110         THEN' InductMethod.atomize_tac) i st |> Seq.maps (fn st' =>
   110         THEN' Induct.atomize_tac) i st |> Seq.maps (fn st' =>
   111             InductMethod.guess_instance
   111             Induct.guess_instance
   112               (finish_rule (InductMethod.internalize more_consumes rule)) i st'
   112               (finish_rule (Induct.internalize more_consumes rule)) i st'
   113             |> Seq.maps (fn rule' =>
   113             |> Seq.maps (fn rule' =>
   114               CASES (rule_cases rule' cases)
   114               CASES (rule_cases rule' cases)
   115                 (Tactic.rtac (rename_params_rule false [] rule') i THEN
   115                 (Tactic.rtac (rename_params_rule false [] rule') i THEN
   116                   PRIMITIVE (singleton (ProofContext.export defs_ctxt ctxt))) st'))))
   116                   PRIMITIVE (singleton (ProofContext.export defs_ctxt ctxt))) st'))))
   117     THEN_ALL_NEW_CASES InductMethod.rulify_tac
   117     THEN_ALL_NEW_CASES Induct.rulify_tac
   118   end;
   118   end;
   119 
   119 
   120 
   120 
   121 (* concrete syntax *)
   121 (* concrete syntax *)
   122 
   122