src/Pure/Isar/induct_attrib.ML
author haftmann
Thu, 24 May 2007 08:37:37 +0200
changeset 23086 12320f6e2523
parent 22846 fb79144af9a3
permissions -rw-r--r--
tuned Pure/General/name_space.ML
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
11658
4200394242c5 Isar/induct_attrib.ML;
wenzelm
parents: 11656
diff changeset
     1
(*  Title:      Pure/Isar/induct_attrib.ML
11656
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
     2
    ID:         $Id$
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
     3
    Author:     Markus Wenzel, TU Muenchen
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
     4
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
     5
Declaration of rules for cases and induction.
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
     6
*)
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
     7
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
     8
signature INDUCT_ATTRIB =
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
     9
sig
11730
418533653668 removed get_cases, get_induct;
wenzelm
parents: 11665
diff changeset
    10
  val vars_of: term -> term list
21506
b2a673894ce5 prefer Proof.context over Context.generic;
wenzelm
parents: 19046
diff changeset
    11
  val dest_rules: Proof.context ->
11656
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
    12
    {type_cases: (string * thm) list, set_cases: (string * thm) list,
18210
ad4b8567f6eb added coinduct attribute;
wenzelm
parents: 17184
diff changeset
    13
      type_induct: (string * thm) list, set_induct: (string * thm) list,
ad4b8567f6eb added coinduct attribute;
wenzelm
parents: 17184
diff changeset
    14
      type_coinduct: (string * thm) list, set_coinduct: (string * thm) list}
21506
b2a673894ce5 prefer Proof.context over Context.generic;
wenzelm
parents: 19046
diff changeset
    15
  val print_rules: Proof.context -> unit
11730
418533653668 removed get_cases, get_induct;
wenzelm
parents: 11665
diff changeset
    16
  val lookup_casesT : Proof.context -> string -> thm option
11656
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
    17
  val lookup_casesS : Proof.context -> string -> thm option
11730
418533653668 removed get_cases, get_induct;
wenzelm
parents: 11665
diff changeset
    18
  val lookup_inductT : Proof.context -> string -> thm option
11656
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
    19
  val lookup_inductS : Proof.context -> string -> thm option
18210
ad4b8567f6eb added coinduct attribute;
wenzelm
parents: 17184
diff changeset
    20
  val lookup_coinductT : Proof.context -> string -> thm option
ad4b8567f6eb added coinduct attribute;
wenzelm
parents: 17184
diff changeset
    21
  val lookup_coinductS : Proof.context -> string -> thm option
11730
418533653668 removed get_cases, get_induct;
wenzelm
parents: 11665
diff changeset
    22
  val find_casesT: Proof.context -> typ -> thm list
18226
8fde30f5cca6 find_xxxS: term instead of thm;
wenzelm
parents: 18210
diff changeset
    23
  val find_casesS: Proof.context -> term -> thm list
11730
418533653668 removed get_cases, get_induct;
wenzelm
parents: 11665
diff changeset
    24
  val find_inductT: Proof.context -> typ -> thm list
18226
8fde30f5cca6 find_xxxS: term instead of thm;
wenzelm
parents: 18210
diff changeset
    25
  val find_inductS: Proof.context -> term -> thm list
18210
ad4b8567f6eb added coinduct attribute;
wenzelm
parents: 17184
diff changeset
    26
  val find_coinductT: Proof.context -> typ -> thm list
18226
8fde30f5cca6 find_xxxS: term instead of thm;
wenzelm
parents: 18210
diff changeset
    27
  val find_coinductS: Proof.context -> term -> thm list
18728
6790126ab5f6 simplified type attribute;
wenzelm
parents: 18708
diff changeset
    28
  val cases_type: string -> attribute
6790126ab5f6 simplified type attribute;
wenzelm
parents: 18708
diff changeset
    29
  val cases_set: string -> attribute
6790126ab5f6 simplified type attribute;
wenzelm
parents: 18708
diff changeset
    30
  val induct_type: string -> attribute
6790126ab5f6 simplified type attribute;
wenzelm
parents: 18708
diff changeset
    31
  val induct_set: string -> attribute
6790126ab5f6 simplified type attribute;
wenzelm
parents: 18708
diff changeset
    32
  val coinduct_type: string -> attribute
6790126ab5f6 simplified type attribute;
wenzelm
parents: 18708
diff changeset
    33
  val coinduct_set: string -> attribute
11656
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
    34
  val casesN: string
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
    35
  val inductN: string
18210
ad4b8567f6eb added coinduct attribute;
wenzelm
parents: 17184
diff changeset
    36
  val coinductN: string
11656
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
    37
  val typeN: string
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
    38
  val setN: string
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
    39
end;
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
    40
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
    41
structure InductAttrib: INDUCT_ATTRIB =
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
    42
struct
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
    43
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
    44
11730
418533653668 removed get_cases, get_induct;
wenzelm
parents: 11665
diff changeset
    45
(** misc utils **)
418533653668 removed get_cases, get_induct;
wenzelm
parents: 11665
diff changeset
    46
418533653668 removed get_cases, get_induct;
wenzelm
parents: 11665
diff changeset
    47
(* encode_type -- for indexing purposes *)
418533653668 removed get_cases, get_induct;
wenzelm
parents: 11665
diff changeset
    48
418533653668 removed get_cases, get_induct;
wenzelm
parents: 11665
diff changeset
    49
fun encode_type (Type (c, Ts)) = Term.list_comb (Const (c, dummyT), map encode_type Ts)
418533653668 removed get_cases, get_induct;
wenzelm
parents: 11665
diff changeset
    50
  | encode_type (TFree (a, _)) = Free (a, dummyT)
418533653668 removed get_cases, get_induct;
wenzelm
parents: 11665
diff changeset
    51
  | encode_type (TVar (a, _)) = Var (a, dummyT);
418533653668 removed get_cases, get_induct;
wenzelm
parents: 11665
diff changeset
    52
418533653668 removed get_cases, get_induct;
wenzelm
parents: 11665
diff changeset
    53
418533653668 removed get_cases, get_induct;
wenzelm
parents: 11665
diff changeset
    54
(* variables -- ordered left-to-right, preferring right *)
418533653668 removed get_cases, get_induct;
wenzelm
parents: 11665
diff changeset
    55
18210
ad4b8567f6eb added coinduct attribute;
wenzelm
parents: 17184
diff changeset
    56
fun vars_of tm =
19046
bc5c6c9b114e removed distinct, renamed gen_distinct to distinct;
wenzelm
parents: 18977
diff changeset
    57
  rev (distinct (op =) (Term.fold_aterms (fn (t as Var _) => cons t | _ => I) tm []));
11730
418533653668 removed get_cases, get_induct;
wenzelm
parents: 11665
diff changeset
    58
18210
ad4b8567f6eb added coinduct attribute;
wenzelm
parents: 17184
diff changeset
    59
local
11730
418533653668 removed get_cases, get_induct;
wenzelm
parents: 11665
diff changeset
    60
418533653668 removed get_cases, get_induct;
wenzelm
parents: 11665
diff changeset
    61
val mk_var = encode_type o #2 o Term.dest_Var;
418533653668 removed get_cases, get_induct;
wenzelm
parents: 11665
diff changeset
    62
18210
ad4b8567f6eb added coinduct attribute;
wenzelm
parents: 17184
diff changeset
    63
fun concl_var which thm = mk_var (which (vars_of (Thm.concl_of thm))) handle Empty =>
ad4b8567f6eb added coinduct attribute;
wenzelm
parents: 17184
diff changeset
    64
  raise THM ("No variables in conclusion of rule", 0, [thm]);
ad4b8567f6eb added coinduct attribute;
wenzelm
parents: 17184
diff changeset
    65
11730
418533653668 removed get_cases, get_induct;
wenzelm
parents: 11665
diff changeset
    66
in
418533653668 removed get_cases, get_induct;
wenzelm
parents: 11665
diff changeset
    67
18210
ad4b8567f6eb added coinduct attribute;
wenzelm
parents: 17184
diff changeset
    68
fun left_var_prem thm = mk_var (hd (vars_of (hd (Thm.prems_of thm)))) handle Empty =>
ad4b8567f6eb added coinduct attribute;
wenzelm
parents: 17184
diff changeset
    69
  raise THM ("No variables in major premise of rule", 0, [thm]);
11730
418533653668 removed get_cases, get_induct;
wenzelm
parents: 11665
diff changeset
    70
18210
ad4b8567f6eb added coinduct attribute;
wenzelm
parents: 17184
diff changeset
    71
val left_var_concl = concl_var hd;
ad4b8567f6eb added coinduct attribute;
wenzelm
parents: 17184
diff changeset
    72
val right_var_concl = concl_var List.last;
11730
418533653668 removed get_cases, get_induct;
wenzelm
parents: 11665
diff changeset
    73
418533653668 removed get_cases, get_induct;
wenzelm
parents: 11665
diff changeset
    74
end;
418533653668 removed get_cases, get_induct;
wenzelm
parents: 11665
diff changeset
    75
418533653668 removed get_cases, get_induct;
wenzelm
parents: 11665
diff changeset
    76
418533653668 removed get_cases, get_induct;
wenzelm
parents: 11665
diff changeset
    77
18637
33a6f6caa617 generic data and attributes;
wenzelm
parents: 18226
diff changeset
    78
(** induct data **)
11656
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
    79
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
    80
(* rules *)
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
    81
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
    82
type rules = (string * thm) NetRules.T;
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
    83
12381
5177845a34f5 simplified NetRules;
wenzelm
parents: 12311
diff changeset
    84
val init_rules =
13105
3d1e7a199bdc use eq_thm_prop instead of slightly inadequate eq_thm;
wenzelm
parents: 12381
diff changeset
    85
  NetRules.init (fn ((s1: string, th1), (s2, th2)) => s1 = s2 andalso
22360
26ead7ed4f4b moved eq_thm etc. to structure Thm in Pure/more_thm.ML;
wenzelm
parents: 21506
diff changeset
    86
    Thm.eq_thm_prop (th1, th2));
11656
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
    87
17184
3d80209e9a53 use AList operations;
wenzelm
parents: 16787
diff changeset
    88
fun lookup_rule (rs: rules) = AList.lookup (op =) (NetRules.rules rs);
11656
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
    89
18637
33a6f6caa617 generic data and attributes;
wenzelm
parents: 18226
diff changeset
    90
fun pretty_rules ctxt kind rs =
11656
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
    91
  let val thms = map snd (NetRules.rules rs)
18637
33a6f6caa617 generic data and attributes;
wenzelm
parents: 18226
diff changeset
    92
  in Pretty.big_list kind (map (ProofContext.pretty_thm ctxt) thms) end;
11656
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
    93
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
    94
18637
33a6f6caa617 generic data and attributes;
wenzelm
parents: 18226
diff changeset
    95
(* context data *)
11656
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
    96
18637
33a6f6caa617 generic data and attributes;
wenzelm
parents: 18226
diff changeset
    97
structure Induct = GenericDataFun
33a6f6caa617 generic data and attributes;
wenzelm
parents: 18226
diff changeset
    98
(
18210
ad4b8567f6eb added coinduct attribute;
wenzelm
parents: 17184
diff changeset
    99
  type T = (rules * rules) * (rules * rules) * (rules * rules);
11730
418533653668 removed get_cases, get_induct;
wenzelm
parents: 11665
diff changeset
   100
  val empty =
18210
ad4b8567f6eb added coinduct attribute;
wenzelm
parents: 17184
diff changeset
   101
    ((init_rules (left_var_prem o #2), init_rules (Thm.major_prem_of o #2)),
ad4b8567f6eb added coinduct attribute;
wenzelm
parents: 17184
diff changeset
   102
     (init_rules (right_var_concl o #2), init_rules (Thm.major_prem_of o #2)),
ad4b8567f6eb added coinduct attribute;
wenzelm
parents: 17184
diff changeset
   103
     (init_rules (left_var_concl o #2), init_rules (Thm.concl_of o #2)));
16424
18a07ad8fea8 accomodate change of TheoryDataFun;
wenzelm
parents: 15801
diff changeset
   104
  val extend = I;
18210
ad4b8567f6eb added coinduct attribute;
wenzelm
parents: 17184
diff changeset
   105
  fun merge _ (((casesT1, casesS1), (inductT1, inductS1), (coinductT1, coinductS1)),
ad4b8567f6eb added coinduct attribute;
wenzelm
parents: 17184
diff changeset
   106
      ((casesT2, casesS2), (inductT2, inductS2), (coinductT2, coinductS2))) =
11656
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   107
    ((NetRules.merge (casesT1, casesT2), NetRules.merge (casesS1, casesS2)),
18210
ad4b8567f6eb added coinduct attribute;
wenzelm
parents: 17184
diff changeset
   108
      (NetRules.merge (inductT1, inductT2), NetRules.merge (inductS1, inductS2)),
ad4b8567f6eb added coinduct attribute;
wenzelm
parents: 17184
diff changeset
   109
      (NetRules.merge (coinductT1, coinductT2), NetRules.merge (coinductS1, coinductS2)));
18637
33a6f6caa617 generic data and attributes;
wenzelm
parents: 18226
diff changeset
   110
);
11656
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   111
22846
fb79144af9a3 simplified DataFun interfaces;
wenzelm
parents: 22360
diff changeset
   112
val get_local = Induct.get o Context.Proof;
11656
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   113
22846
fb79144af9a3 simplified DataFun interfaces;
wenzelm
parents: 22360
diff changeset
   114
fun dest_rules ctxt =
fb79144af9a3 simplified DataFun interfaces;
wenzelm
parents: 22360
diff changeset
   115
  let val ((casesT, casesS), (inductT, inductS), (coinductT, coinductS)) = get_local ctxt in
fb79144af9a3 simplified DataFun interfaces;
wenzelm
parents: 22360
diff changeset
   116
    {type_cases = NetRules.rules casesT,
fb79144af9a3 simplified DataFun interfaces;
wenzelm
parents: 22360
diff changeset
   117
     set_cases = NetRules.rules casesS,
fb79144af9a3 simplified DataFun interfaces;
wenzelm
parents: 22360
diff changeset
   118
     type_induct = NetRules.rules inductT,
fb79144af9a3 simplified DataFun interfaces;
wenzelm
parents: 22360
diff changeset
   119
     set_induct = NetRules.rules inductS,
fb79144af9a3 simplified DataFun interfaces;
wenzelm
parents: 22360
diff changeset
   120
     type_coinduct = NetRules.rules coinductT,
fb79144af9a3 simplified DataFun interfaces;
wenzelm
parents: 22360
diff changeset
   121
     set_coinduct = NetRules.rules coinductS}
fb79144af9a3 simplified DataFun interfaces;
wenzelm
parents: 22360
diff changeset
   122
  end;
fb79144af9a3 simplified DataFun interfaces;
wenzelm
parents: 22360
diff changeset
   123
fb79144af9a3 simplified DataFun interfaces;
wenzelm
parents: 22360
diff changeset
   124
fun print_rules ctxt =
fb79144af9a3 simplified DataFun interfaces;
wenzelm
parents: 22360
diff changeset
   125
  let val ((casesT, casesS), (inductT, inductS), (coinductT, coinductS)) = get_local ctxt in
fb79144af9a3 simplified DataFun interfaces;
wenzelm
parents: 22360
diff changeset
   126
   [pretty_rules ctxt "coinduct type:" coinductT,
fb79144af9a3 simplified DataFun interfaces;
wenzelm
parents: 22360
diff changeset
   127
    pretty_rules ctxt "coinduct set:" coinductS,
fb79144af9a3 simplified DataFun interfaces;
wenzelm
parents: 22360
diff changeset
   128
    pretty_rules ctxt "induct type:" inductT,
fb79144af9a3 simplified DataFun interfaces;
wenzelm
parents: 22360
diff changeset
   129
    pretty_rules ctxt "induct set:" inductS,
fb79144af9a3 simplified DataFun interfaces;
wenzelm
parents: 22360
diff changeset
   130
    pretty_rules ctxt "cases type:" casesT,
fb79144af9a3 simplified DataFun interfaces;
wenzelm
parents: 22360
diff changeset
   131
    pretty_rules ctxt "cases set:" casesS]
fb79144af9a3 simplified DataFun interfaces;
wenzelm
parents: 22360
diff changeset
   132
    |> Pretty.chunks |> Pretty.writeln
fb79144af9a3 simplified DataFun interfaces;
wenzelm
parents: 22360
diff changeset
   133
  end;
11656
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   134
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   135
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   136
(* access rules *)
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   137
18637
33a6f6caa617 generic data and attributes;
wenzelm
parents: 18226
diff changeset
   138
val lookup_casesT = lookup_rule o #1 o #1 o get_local;
33a6f6caa617 generic data and attributes;
wenzelm
parents: 18226
diff changeset
   139
val lookup_casesS = lookup_rule o #2 o #1 o get_local;
33a6f6caa617 generic data and attributes;
wenzelm
parents: 18226
diff changeset
   140
val lookup_inductT = lookup_rule o #1 o #2 o get_local;
33a6f6caa617 generic data and attributes;
wenzelm
parents: 18226
diff changeset
   141
val lookup_inductS = lookup_rule o #2 o #2 o get_local;
33a6f6caa617 generic data and attributes;
wenzelm
parents: 18226
diff changeset
   142
val lookup_coinductT = lookup_rule o #1 o #3 o get_local;
33a6f6caa617 generic data and attributes;
wenzelm
parents: 18226
diff changeset
   143
val lookup_coinductS = lookup_rule o #2 o #3 o get_local;
11730
418533653668 removed get_cases, get_induct;
wenzelm
parents: 11665
diff changeset
   144
11656
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   145
11730
418533653668 removed get_cases, get_induct;
wenzelm
parents: 11665
diff changeset
   146
fun find_rules which how ctxt x =
18637
33a6f6caa617 generic data and attributes;
wenzelm
parents: 18226
diff changeset
   147
  map snd (NetRules.retrieve (which (get_local ctxt)) (how x));
11730
418533653668 removed get_cases, get_induct;
wenzelm
parents: 11665
diff changeset
   148
418533653668 removed get_cases, get_induct;
wenzelm
parents: 11665
diff changeset
   149
val find_casesT = find_rules (#1 o #1) encode_type;
18226
8fde30f5cca6 find_xxxS: term instead of thm;
wenzelm
parents: 18210
diff changeset
   150
val find_casesS = find_rules (#2 o #1) I;
11730
418533653668 removed get_cases, get_induct;
wenzelm
parents: 11665
diff changeset
   151
val find_inductT = find_rules (#1 o #2) encode_type;
18226
8fde30f5cca6 find_xxxS: term instead of thm;
wenzelm
parents: 18210
diff changeset
   152
val find_inductS = find_rules (#2 o #2) I;
18210
ad4b8567f6eb added coinduct attribute;
wenzelm
parents: 17184
diff changeset
   153
val find_coinductT = find_rules (#1 o #3) encode_type;
18226
8fde30f5cca6 find_xxxS: term instead of thm;
wenzelm
parents: 18210
diff changeset
   154
val find_coinductS = find_rules (#2 o #3) I;
11656
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   155
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   156
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   157
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   158
(** attributes **)
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   159
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   160
local
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   161
18637
33a6f6caa617 generic data and attributes;
wenzelm
parents: 18226
diff changeset
   162
fun mk_att f g name arg =
33a6f6caa617 generic data and attributes;
wenzelm
parents: 18226
diff changeset
   163
  let val (x, thm) = g arg in (Induct.map (f (name, thm)) x, thm) end;
11656
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   164
18210
ad4b8567f6eb added coinduct attribute;
wenzelm
parents: 17184
diff changeset
   165
fun map1 f (x, y, z) = (f x, y, z);
ad4b8567f6eb added coinduct attribute;
wenzelm
parents: 17184
diff changeset
   166
fun map2 f (x, y, z) = (x, f y, z);
ad4b8567f6eb added coinduct attribute;
wenzelm
parents: 17184
diff changeset
   167
fun map3 f (x, y, z) = (x, y, f z);
ad4b8567f6eb added coinduct attribute;
wenzelm
parents: 17184
diff changeset
   168
ad4b8567f6eb added coinduct attribute;
wenzelm
parents: 17184
diff changeset
   169
fun add_casesT rule x = map1 (apfst (NetRules.insert rule)) x;
ad4b8567f6eb added coinduct attribute;
wenzelm
parents: 17184
diff changeset
   170
fun add_casesS rule x = map1 (apsnd (NetRules.insert rule)) x;
ad4b8567f6eb added coinduct attribute;
wenzelm
parents: 17184
diff changeset
   171
fun add_inductT rule x = map2 (apfst (NetRules.insert rule)) x;
ad4b8567f6eb added coinduct attribute;
wenzelm
parents: 17184
diff changeset
   172
fun add_inductS rule x = map2 (apsnd (NetRules.insert rule)) x;
ad4b8567f6eb added coinduct attribute;
wenzelm
parents: 17184
diff changeset
   173
fun add_coinductT rule x = map3 (apfst (NetRules.insert rule)) x;
ad4b8567f6eb added coinduct attribute;
wenzelm
parents: 17184
diff changeset
   174
fun add_coinductS rule x = map3 (apsnd (NetRules.insert rule)) x;
11656
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   175
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   176
fun consumes0 x = RuleCases.consumes_default 0 x;
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   177
fun consumes1 x = RuleCases.consumes_default 1 x;
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   178
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   179
in
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   180
18637
33a6f6caa617 generic data and attributes;
wenzelm
parents: 18226
diff changeset
   181
val cases_type = mk_att add_casesT consumes0;
33a6f6caa617 generic data and attributes;
wenzelm
parents: 18226
diff changeset
   182
val cases_set = mk_att add_casesS consumes1;
33a6f6caa617 generic data and attributes;
wenzelm
parents: 18226
diff changeset
   183
val induct_type = mk_att add_inductT consumes0;
33a6f6caa617 generic data and attributes;
wenzelm
parents: 18226
diff changeset
   184
val induct_set = mk_att add_inductS consumes1;
33a6f6caa617 generic data and attributes;
wenzelm
parents: 18226
diff changeset
   185
val coinduct_type = mk_att add_coinductT consumes0;
33a6f6caa617 generic data and attributes;
wenzelm
parents: 18226
diff changeset
   186
val coinduct_set = mk_att add_coinductS consumes1;
11656
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   187
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   188
end;
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   189
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   190
18637
33a6f6caa617 generic data and attributes;
wenzelm
parents: 18226
diff changeset
   191
11656
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   192
(** concrete syntax **)
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   193
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   194
val casesN = "cases";
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   195
val inductN = "induct";
18210
ad4b8567f6eb added coinduct attribute;
wenzelm
parents: 17184
diff changeset
   196
val coinductN = "coinduct";
11656
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   197
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   198
val typeN = "type";
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   199
val setN = "set";
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   200
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   201
local
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   202
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15570
diff changeset
   203
fun spec k arg =
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15570
diff changeset
   204
  Scan.lift (Args.$$$ k -- Args.colon) |-- arg ||
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15570
diff changeset
   205
  Scan.lift (Args.$$$ k) >> K "";
11656
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   206
18637
33a6f6caa617 generic data and attributes;
wenzelm
parents: 18226
diff changeset
   207
fun attrib add_type add_set =
33a6f6caa617 generic data and attributes;
wenzelm
parents: 18226
diff changeset
   208
  Attrib.syntax (spec typeN Args.tyname >> add_type || spec setN Args.const >> add_set);
11656
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   209
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   210
in
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   211
18637
33a6f6caa617 generic data and attributes;
wenzelm
parents: 18226
diff changeset
   212
val cases_att = attrib cases_type cases_set;
33a6f6caa617 generic data and attributes;
wenzelm
parents: 18226
diff changeset
   213
val induct_att = attrib induct_type induct_set;
33a6f6caa617 generic data and attributes;
wenzelm
parents: 18226
diff changeset
   214
val coinduct_att = attrib coinduct_type coinduct_set;
18210
ad4b8567f6eb added coinduct attribute;
wenzelm
parents: 17184
diff changeset
   215
11656
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   216
end;
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   217
15801
d2f5ca3c048d superceded by Pure.thy and CPure.thy;
wenzelm
parents: 15710
diff changeset
   218
val _ = Context.add_setup
18708
4b3dadb4fe33 setup: theory -> theory;
wenzelm
parents: 18637
diff changeset
   219
 (Attrib.add_attributes
18728
6790126ab5f6 simplified type attribute;
wenzelm
parents: 18708
diff changeset
   220
  [(casesN, cases_att, "declaration of cases rule for type or set"),
6790126ab5f6 simplified type attribute;
wenzelm
parents: 18708
diff changeset
   221
   (inductN, induct_att, "declaration of induction rule for type or set"),
6790126ab5f6 simplified type attribute;
wenzelm
parents: 18708
diff changeset
   222
   (coinductN, coinduct_att, "declaration of coinduction rule for type or set")]);
11656
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   223
e499dceca569 moved HOL/Tools/induct_attrib.ML to Pure/Isar/induct_attrib.ML;
wenzelm
parents:
diff changeset
   224
end;