src/HOL/Tools/inductive_package.ML
changeset 25978 8ba1eba8d058
parent 25822 05756950011c
child 26128 fe2d24c26e0c
     1.1 --- a/src/HOL/Tools/inductive_package.ML	Sat Jan 26 17:08:35 2008 +0100
     1.2 +++ b/src/HOL/Tools/inductive_package.ML	Sat Jan 26 17:08:36 2008 +0100
     1.3 @@ -39,7 +39,8 @@
     1.4    val inductive_cases_i: ((bstring * Attrib.src list) * term list) list ->
     1.5      Proof.context -> thm list list * local_theory
     1.6    val add_inductive_i:
     1.7 -    {verbose: bool, kind: string, alt_name: bstring, coind: bool, no_elim: bool, no_ind: bool} ->
     1.8 +    {verbose: bool, kind: string, group: string, alt_name: bstring,
     1.9 +      coind: bool, no_elim: bool, no_ind: bool} ->
    1.10      ((string * typ) * mixfix) list ->
    1.11      (string * typ) list -> ((bstring * Attrib.src list) * term) list -> thm list ->
    1.12        local_theory -> inductive_result * local_theory
    1.13 @@ -48,7 +49,8 @@
    1.14      ((bstring * Attrib.src list) * string) list -> (thmref * Attrib.src list) list ->
    1.15      local_theory -> inductive_result * local_theory
    1.16    val add_inductive_global:
    1.17 -    {verbose: bool, kind: string, alt_name: bstring, coind: bool, no_elim: bool, no_ind: bool} ->
    1.18 +    {verbose: bool, kind: string, group: string, alt_name: bstring,
    1.19 +      coind: bool, no_elim: bool, no_ind: bool} ->
    1.20      ((string * typ) * mixfix) list -> (string * typ) list ->
    1.21      ((bstring * Attrib.src list) * term) list -> thm list -> theory -> inductive_result * theory
    1.22    val arities_of: thm -> (string * int) list
    1.23 @@ -64,12 +66,13 @@
    1.24  sig
    1.25    include BASIC_INDUCTIVE_PACKAGE
    1.26    type add_ind_def
    1.27 -  val declare_rules: string -> bstring -> bool -> bool -> string list ->
    1.28 +  val declare_rules: string -> string -> bstring -> bool -> bool -> string list ->
    1.29      thm list -> bstring list -> Attrib.src list list -> (thm * string list) list ->
    1.30      thm -> local_theory -> thm list * thm list * thm * local_theory
    1.31    val add_ind_def: add_ind_def
    1.32    val gen_add_inductive_i: add_ind_def ->
    1.33 -    {verbose: bool, kind: string, alt_name: bstring, coind: bool, no_elim: bool, no_ind: bool} ->
    1.34 +    {verbose: bool, kind: string, group: string, alt_name: bstring,
    1.35 +      coind: bool, no_elim: bool, no_ind: bool} ->
    1.36      ((string * typ) * mixfix) list ->
    1.37      (string * typ) list -> ((bstring * Attrib.src list) * term) list -> thm list ->
    1.38        local_theory -> inductive_result * local_theory
    1.39 @@ -585,7 +588,7 @@
    1.40  
    1.41  (** specification of (co)inductive predicates **)
    1.42  
    1.43 -fun mk_ind_def alt_name coind cs intr_ts monos
    1.44 +fun mk_ind_def group alt_name coind cs intr_ts monos
    1.45        params cnames_syn ctxt =
    1.46    let
    1.47      val fp_name = if coind then @{const_name Inductive.gfp} else @{const_name Inductive.lfp};
    1.48 @@ -644,7 +647,7 @@
    1.49        space_implode "_" (map fst cnames_syn) else alt_name;
    1.50  
    1.51      val ((rec_const, (_, fp_def)), ctxt') = ctxt |>
    1.52 -      LocalTheory.define Thm.internalK
    1.53 +      LocalTheory.define_grouped Thm.internalK group
    1.54          ((rec_name, case cnames_syn of [(_, syn)] => syn | _ => NoSyn),
    1.55           (("", []), fold_rev lambda params
    1.56             (Const (fp_name, (predT --> predT) --> predT) $ fp_fun)));
    1.57 @@ -661,7 +664,7 @@
    1.58              (list_comb (rec_const, params @ make_bool_args' bs i @
    1.59                make_args argTs (xs ~~ Ts)))))
    1.60          end) (cnames_syn ~~ cs);
    1.61 -    val (consts_defs, ctxt'') = fold_map (LocalTheory.define Thm.internalK) specs ctxt';
    1.62 +    val (consts_defs, ctxt'') = fold_map (LocalTheory.define_grouped Thm.internalK group) specs ctxt';
    1.63      val preds = (case cs of [_] => [rec_const] | _ => map #1 consts_defs);
    1.64  
    1.65      val mono = prove_mono predT fp_fun monos ctxt''
    1.66 @@ -670,7 +673,7 @@
    1.67      list_comb (rec_const, params), preds, argTs, bs, xs)
    1.68    end;
    1.69  
    1.70 -fun declare_rules kind rec_name coind no_ind cnames intrs intr_names intr_atts
    1.71 +fun declare_rules kind group rec_name coind no_ind cnames intrs intr_names intr_atts
    1.72        elims raw_induct ctxt =
    1.73    let
    1.74      val ind_case_names = RuleCases.case_names intr_names;
    1.75 @@ -685,29 +688,29 @@
    1.76  
    1.77      val (intrs', ctxt1) =
    1.78        ctxt |>
    1.79 -      LocalTheory.notes kind
    1.80 +      LocalTheory.notes_grouped kind group
    1.81          (map (NameSpace.qualified rec_name) intr_names ~~
    1.82           intr_atts ~~ map (fn th => [([th],
    1.83             [Attrib.internal (K (ContextRules.intro_query NONE))])]) intrs) |>>
    1.84        map (hd o snd);
    1.85      val (((_, elims'), (_, [induct'])), ctxt2) =
    1.86        ctxt1 |>
    1.87 -      LocalTheory.note kind ((NameSpace.qualified rec_name "intros", []), intrs') ||>>
    1.88 +      LocalTheory.note_grouped kind group ((NameSpace.qualified rec_name "intros", []), intrs') ||>>
    1.89        fold_map (fn (name, (elim, cases)) =>
    1.90 -        LocalTheory.note kind ((NameSpace.qualified (Sign.base_name name) "cases",
    1.91 +        LocalTheory.note_grouped kind group ((NameSpace.qualified (Sign.base_name name) "cases",
    1.92            [Attrib.internal (K (RuleCases.case_names cases)),
    1.93             Attrib.internal (K (RuleCases.consumes 1)),
    1.94             Attrib.internal (K (Induct.cases_pred name)),
    1.95             Attrib.internal (K (ContextRules.elim_query NONE))]), [elim]) #>
    1.96          apfst (hd o snd)) (if null elims then [] else cnames ~~ elims) ||>>
    1.97 -      LocalTheory.note kind ((NameSpace.qualified rec_name (coind_prefix coind ^ "induct"),
    1.98 +      LocalTheory.note_grouped kind group ((NameSpace.qualified rec_name (coind_prefix coind ^ "induct"),
    1.99          map (Attrib.internal o K) (#2 induct)), [rulify (#1 induct)]);
   1.100  
   1.101      val ctxt3 = if no_ind orelse coind then ctxt2 else
   1.102        let val inducts = cnames ~~ ProjectRule.projects ctxt2 (1 upto length cnames) induct'
   1.103        in
   1.104          ctxt2 |>
   1.105 -        LocalTheory.notes kind [((NameSpace.qualified rec_name "inducts", []),
   1.106 +        LocalTheory.notes_grouped kind group [((NameSpace.qualified rec_name "inducts", []),
   1.107            inducts |> map (fn (name, th) => ([th],
   1.108              [Attrib.internal (K ind_case_names),
   1.109               Attrib.internal (K (RuleCases.consumes 1)),
   1.110 @@ -716,12 +719,13 @@
   1.111    in (intrs', elims', induct', ctxt3) end;
   1.112  
   1.113  type add_ind_def =
   1.114 -  {verbose: bool, kind: string, alt_name: bstring, coind: bool, no_elim: bool, no_ind: bool} ->
   1.115 +  {verbose: bool, kind: string, group: string, alt_name: bstring,
   1.116 +    coind: bool, no_elim: bool, no_ind: bool} ->
   1.117    term list -> ((string * Attrib.src list) * term) list -> thm list ->
   1.118    term list -> (string * mixfix) list ->
   1.119    local_theory -> inductive_result * local_theory
   1.120  
   1.121 -fun add_ind_def {verbose, kind, alt_name, coind, no_elim, no_ind}
   1.122 +fun add_ind_def {verbose, kind, group, alt_name, coind, no_elim, no_ind}
   1.123      cs intros monos params cnames_syn ctxt =
   1.124    let
   1.125      val _ = null cnames_syn andalso error "No inductive predicates given";
   1.126 @@ -734,7 +738,7 @@
   1.127        apfst split_list (split_list (map (check_rule ctxt cs params) intros));
   1.128  
   1.129      val (ctxt1, rec_name, mono, fp_def, rec_preds_defs, rec_const, preds,
   1.130 -      argTs, bs, xs) = mk_ind_def alt_name coind cs intr_ts
   1.131 +      argTs, bs, xs) = mk_ind_def group alt_name coind cs intr_ts
   1.132          monos params cnames_syn ctxt;
   1.133  
   1.134      val (intrs, unfold) = prove_intrs coind mono fp_def (length bs + length xs)
   1.135 @@ -753,7 +757,7 @@
   1.136           prove_indrule cs argTs bs xs rec_const params intr_ts mono fp_def
   1.137             rec_preds_defs ctxt1);
   1.138  
   1.139 -    val (intrs', elims', induct, ctxt2) = declare_rules kind rec_name coind no_ind
   1.140 +    val (intrs', elims', induct, ctxt2) = declare_rules kind group rec_name coind no_ind
   1.141        cnames intrs intr_names intr_atts elims raw_induct ctxt1;
   1.142  
   1.143      val names = map #1 cnames_syn;
   1.144 @@ -773,7 +777,7 @@
   1.145  
   1.146  (* external interfaces *)
   1.147  
   1.148 -fun gen_add_inductive_i mk_def (flags as {verbose, kind, alt_name, coind, no_elim, no_ind})
   1.149 +fun gen_add_inductive_i mk_def (flags as {verbose, kind, group, alt_name, coind, no_elim, no_ind})
   1.150      cnames_syn pnames spec monos lthy =
   1.151    let
   1.152      val thy = ProofContext.theory_of lthy;
   1.153 @@ -837,7 +841,7 @@
   1.154      val (cs, ps) = chop (length cnames_syn) vars;
   1.155      val intrs = map (apsnd the_single) specs;
   1.156      val monos = Attrib.eval_thms lthy raw_monos;
   1.157 -    val flags = {verbose = verbose, kind = Thm.theoremK, alt_name = "",
   1.158 +    val flags = {verbose = verbose, kind = Thm.theoremK, group = serial_string (), alt_name = "",
   1.159        coind = coind, no_elim = false, no_ind = false};
   1.160    in gen_add_inductive_i mk_def flags cs (map fst ps) intrs monos lthy end;
   1.161  
   1.162 @@ -911,6 +915,7 @@
   1.163    end;
   1.164  
   1.165  
   1.166 +
   1.167  (** package setup **)
   1.168  
   1.169  (* setup theory *)