src/ZF/Tools/induct_tacs.ML
author huffman
Thu, 26 May 2005 02:23:27 +0200
changeset 16081 81a4b4a245b0
parent 15705 b5edb9dcec9a
child 16122 864fda4a4056
permissions -rw-r--r--
cleaned up, added cpair_less and cpair_eq_pair, removed some obsolete stuff
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6070
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
     1
(*  Title:      ZF/Tools/induct_tacs.ML
6065
3b4a29166f26 induct_tac and exhaust_tac
paulson
parents:
diff changeset
     2
    ID:         $Id$
3b4a29166f26 induct_tac and exhaust_tac
paulson
parents:
diff changeset
     3
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
3b4a29166f26 induct_tac and exhaust_tac
paulson
parents:
diff changeset
     4
    Copyright   1994  University of Cambridge
3b4a29166f26 induct_tac and exhaust_tac
paulson
parents:
diff changeset
     5
12204
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
     6
Induction and exhaustion tactics for Isabelle/ZF.  The theory
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
     7
information needed to support them (and to support primrec).  Also a
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
     8
function to install other sets as if they were datatypes.
6065
3b4a29166f26 induct_tac and exhaust_tac
paulson
parents:
diff changeset
     9
*)
3b4a29166f26 induct_tac and exhaust_tac
paulson
parents:
diff changeset
    10
3b4a29166f26 induct_tac and exhaust_tac
paulson
parents:
diff changeset
    11
signature DATATYPE_TACTICS =
3b4a29166f26 induct_tac and exhaust_tac
paulson
parents:
diff changeset
    12
sig
12204
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
    13
  val induct_tac: string -> int -> tactic
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
    14
  val exhaust_tac: string -> int -> tactic
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
    15
  val rep_datatype_i: thm -> thm -> thm list -> thm list -> theory -> theory
15703
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15574
diff changeset
    16
  val rep_datatype: thmref * Attrib.src list -> thmref * Attrib.src list ->
727ef1b8b3ee *** empty log message ***
wenzelm
parents: 15574
diff changeset
    17
    (thmref * Attrib.src list) list -> (thmref * Attrib.src list) list -> theory -> theory
12204
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
    18
  val setup: (theory -> theory) list
6065
3b4a29166f26 induct_tac and exhaust_tac
paulson
parents:
diff changeset
    19
end;
3b4a29166f26 induct_tac and exhaust_tac
paulson
parents:
diff changeset
    20
3b4a29166f26 induct_tac and exhaust_tac
paulson
parents:
diff changeset
    21
6070
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    22
(** Datatype information, e.g. associated theorems **)
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    23
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    24
type datatype_info =
12175
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
    25
  {inductive: bool,             (*true if inductive, not coinductive*)
6070
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    26
   constructors : term list,    (*the constructors, as Consts*)
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    27
   rec_rewrites : thm list,     (*recursor equations*)
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    28
   case_rewrites : thm list,    (*case equations*)
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    29
   induct : thm,
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    30
   mutual_induct : thm,
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    31
   exhaustion : thm};
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    32
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    33
structure DatatypesArgs =
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    34
  struct
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    35
  val name = "ZF/datatypes";
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    36
  type T = datatype_info Symtab.table;
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    37
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    38
  val empty = Symtab.empty;
6556
daa00919502b theory data: copy;
wenzelm
parents: 6141
diff changeset
    39
  val copy = I;
6070
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    40
  val prep_ext = I;
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    41
  val merge: T * T -> T = Symtab.merge (K true);
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    42
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    43
  fun print sg tab =
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    44
    Pretty.writeln (Pretty.strs ("datatypes:" ::
6851
526c0b90bcef cond_extern_table;
wenzelm
parents: 6556
diff changeset
    45
      map #1 (Sign.cond_extern_table sg Sign.typeK tab)));
6070
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    46
  end;
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    47
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    48
structure DatatypesData = TheoryDataFun(DatatypesArgs);
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    49
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    50
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    51
(** Constructor information: needed to map constructors to datatypes **)
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    52
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    53
type constructor_info =
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    54
  {big_rec_name : string,     (*name of the mutually recursive set*)
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    55
   constructors : term list,  (*the constructors, as Consts*)
6141
a6922171b396 removal of the (thm list) argument of mk_cases
paulson
parents: 6112
diff changeset
    56
   free_iffs    : thm list,   (*freeness simprules*)
6070
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    57
   rec_rewrites : thm list};  (*recursor equations*)
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    58
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    59
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    60
structure ConstructorsArgs =
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    61
struct
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    62
  val name = "ZF/constructors"
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    63
  type T = constructor_info Symtab.table
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    64
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    65
  val empty = Symtab.empty
6556
daa00919502b theory data: copy;
wenzelm
parents: 6141
diff changeset
    66
  val copy = I;
6070
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    67
  val prep_ext = I
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    68
  val merge: T * T -> T = Symtab.merge (K true)
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    69
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    70
  fun print sg tab = ()   (*nothing extra to print*)
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    71
end;
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    72
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    73
structure ConstructorsData = TheoryDataFun(ConstructorsArgs);
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    74
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
    75
6065
3b4a29166f26 induct_tac and exhaust_tac
paulson
parents:
diff changeset
    76
structure DatatypeTactics : DATATYPE_TACTICS =
3b4a29166f26 induct_tac and exhaust_tac
paulson
parents:
diff changeset
    77
struct
3b4a29166f26 induct_tac and exhaust_tac
paulson
parents:
diff changeset
    78
3b4a29166f26 induct_tac and exhaust_tac
paulson
parents:
diff changeset
    79
fun datatype_info_sg sign name =
3b4a29166f26 induct_tac and exhaust_tac
paulson
parents:
diff changeset
    80
  (case Symtab.lookup (DatatypesData.get_sg sign, name) of
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15462
diff changeset
    81
    SOME info => info
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15462
diff changeset
    82
  | NONE => error ("Unknown datatype " ^ quote name));
6065
3b4a29166f26 induct_tac and exhaust_tac
paulson
parents:
diff changeset
    83
3b4a29166f26 induct_tac and exhaust_tac
paulson
parents:
diff changeset
    84
3b4a29166f26 induct_tac and exhaust_tac
paulson
parents:
diff changeset
    85
(*Given a variable, find the inductive set associated it in the assumptions*)
14153
76a6ba67bd15 new case_tac
paulson
parents: 12311
diff changeset
    86
exception Find_tname of string
76a6ba67bd15 new case_tac
paulson
parents: 12311
diff changeset
    87
6065
3b4a29166f26 induct_tac and exhaust_tac
paulson
parents:
diff changeset
    88
fun find_tname var Bi =
12175
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
    89
  let fun mk_pair (Const("op :",_) $ Free (v,_) $ A) =
6065
3b4a29166f26 induct_tac and exhaust_tac
paulson
parents:
diff changeset
    90
             (v, #1 (dest_Const (head_of A)))
12175
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
    91
        | mk_pair _ = raise Match
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
    92
      val pairs = List.mapPartial (try (mk_pair o FOLogic.dest_Trueprop))
12175
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
    93
          (#2 (strip_context Bi))
6065
3b4a29166f26 induct_tac and exhaust_tac
paulson
parents:
diff changeset
    94
  in case assoc (pairs, var) of
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15462
diff changeset
    95
       NONE => raise Find_tname ("Cannot determine datatype of " ^ quote var)
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15462
diff changeset
    96
     | SOME t => t
6065
3b4a29166f26 induct_tac and exhaust_tac
paulson
parents:
diff changeset
    97
  end;
3b4a29166f26 induct_tac and exhaust_tac
paulson
parents:
diff changeset
    98
12175
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
    99
(** generic exhaustion and induction tactic for datatypes
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
   100
    Differences from HOL:
6065
3b4a29166f26 induct_tac and exhaust_tac
paulson
parents:
diff changeset
   101
      (1) no checking if the induction var occurs in premises, since it always
3b4a29166f26 induct_tac and exhaust_tac
paulson
parents:
diff changeset
   102
          appears in one of them, and it's hard to check for other occurrences
3b4a29166f26 induct_tac and exhaust_tac
paulson
parents:
diff changeset
   103
      (2) exhaustion works for VARIABLES in the premises, not general terms
3b4a29166f26 induct_tac and exhaust_tac
paulson
parents:
diff changeset
   104
**)
3b4a29166f26 induct_tac and exhaust_tac
paulson
parents:
diff changeset
   105
3b4a29166f26 induct_tac and exhaust_tac
paulson
parents:
diff changeset
   106
fun exhaust_induct_tac exh var i state =
3b4a29166f26 induct_tac and exhaust_tac
paulson
parents:
diff changeset
   107
  let
3b4a29166f26 induct_tac and exhaust_tac
paulson
parents:
diff changeset
   108
    val (_, _, Bi, _) = dest_state (state, i)
3b4a29166f26 induct_tac and exhaust_tac
paulson
parents:
diff changeset
   109
    val {sign, ...} = rep_thm state
3b4a29166f26 induct_tac and exhaust_tac
paulson
parents:
diff changeset
   110
    val tn = find_tname var Bi
12175
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
   111
    val rule =
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
   112
        if exh then #exhaustion (datatype_info_sg sign tn)
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
   113
               else #induct  (datatype_info_sg sign tn)
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
   114
    val (Const("op :",_) $ Var(ixn,_) $ _) =
6112
5e4871c5136b datatype package improvements
paulson
parents: 6092
diff changeset
   115
        (case prems_of rule of
12175
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
   116
             [] => error "induction is not available for this datatype"
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
   117
           | major::_ => FOLogic.dest_Trueprop major)
6065
3b4a29166f26 induct_tac and exhaust_tac
paulson
parents:
diff changeset
   118
  in
15462
b4208fbf9439 Eliminated hack for deleting leading question mark from induction
berghofe
parents: 14153
diff changeset
   119
    Tactic.eres_inst_tac' [(ixn, var)] rule i state
14153
76a6ba67bd15 new case_tac
paulson
parents: 12311
diff changeset
   120
  end
76a6ba67bd15 new case_tac
paulson
parents: 12311
diff changeset
   121
  handle Find_tname msg =>
76a6ba67bd15 new case_tac
paulson
parents: 12311
diff changeset
   122
            if exh then (*try boolean case analysis instead*)
76a6ba67bd15 new case_tac
paulson
parents: 12311
diff changeset
   123
		case_tac var i state
76a6ba67bd15 new case_tac
paulson
parents: 12311
diff changeset
   124
            else error msg;
6065
3b4a29166f26 induct_tac and exhaust_tac
paulson
parents:
diff changeset
   125
3b4a29166f26 induct_tac and exhaust_tac
paulson
parents:
diff changeset
   126
val exhaust_tac = exhaust_induct_tac true;
3b4a29166f26 induct_tac and exhaust_tac
paulson
parents:
diff changeset
   127
val induct_tac = exhaust_induct_tac false;
3b4a29166f26 induct_tac and exhaust_tac
paulson
parents:
diff changeset
   128
6070
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
   129
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
   130
(**** declare non-datatype as datatype ****)
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
   131
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
   132
fun rep_datatype_i elim induct case_eqns recursor_eqns thy =
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
   133
  let
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
   134
    val sign = sign_of thy;
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
   135
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
   136
    (*analyze the LHS of a case equation to get a constructor*)
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
   137
    fun const_of (Const("op =", _) $ (_ $ c) $ _) = c
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
   138
      | const_of eqn = error ("Ill-formed case equation: " ^
12175
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
   139
                              Sign.string_of_term sign eqn);
6070
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
   140
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
   141
    val constructors =
12175
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
   142
        map (head_of o const_of o FOLogic.dest_Trueprop o
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
   143
             #prop o rep_thm) case_eqns;
6070
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
   144
6112
5e4871c5136b datatype package improvements
paulson
parents: 6092
diff changeset
   145
    val Const ("op :", _) $ _ $ data =
12175
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
   146
        FOLogic.dest_Trueprop (hd (prems_of elim));
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
   147
6112
5e4871c5136b datatype package improvements
paulson
parents: 6092
diff changeset
   148
    val Const(big_rec_name, _) = head_of data;
5e4871c5136b datatype package improvements
paulson
parents: 6092
diff changeset
   149
6070
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
   150
    val simps = case_eqns @ recursor_eqns;
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
   151
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
   152
    val dt_info =
12175
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
   153
          {inductive = true,
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
   154
           constructors = constructors,
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
   155
           rec_rewrites = recursor_eqns,
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
   156
           case_rewrites = case_eqns,
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
   157
           induct = induct,
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
   158
           mutual_induct = TrueI,  (*No need for mutual induction*)
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
   159
           exhaustion = elim};
6070
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
   160
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
   161
    val con_info =
12175
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
   162
          {big_rec_name = big_rec_name,
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
   163
           constructors = constructors,
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
   164
              (*let primrec handle definition by cases*)
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
   165
           free_iffs = [],  (*thus we expect the necessary freeness rewrites
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
   166
                              to be in the simpset already, as is the case for
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
   167
                              Nat and disjoint sum*)
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
   168
           rec_rewrites = (case recursor_eqns of
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
   169
                               [] => case_eqns | _ => recursor_eqns)};
6070
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
   170
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
   171
    (*associate with each constructor the datatype name and rewrites*)
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
   172
    val con_pairs = map (fn c => (#1 (dest_Const c), con_info)) constructors
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
   173
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
   174
  in
032babd0120b ZF: the natural numbers as a datatype
paulson
parents: 6065
diff changeset
   175
      thy |> Theory.add_path (Sign.base_name big_rec_name)
12175
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
   176
          |> (#1 o PureThy.add_thmss [(("simps", simps), [Simplifier.simp_add_global])])
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
   177
          |> DatatypesData.put
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
   178
              (Symtab.update
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
   179
               ((big_rec_name, dt_info), DatatypesData.get thy))
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
   180
          |> ConstructorsData.put
15574
b1d1b5bfc464 Removed practically all references to Library.foldr.
skalberg
parents: 15570
diff changeset
   181
               (foldr Symtab.update (ConstructorsData.get thy) con_pairs)
12175
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
   182
          |> Theory.parent_path
12204
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   183
  end;
6065
3b4a29166f26 induct_tac and exhaust_tac
paulson
parents:
diff changeset
   184
12204
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   185
fun rep_datatype raw_elim raw_induct raw_case_eqns raw_recursor_eqns thy =
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   186
  let
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   187
    val (thy', (((elims, inducts), case_eqns), recursor_eqns)) = thy
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   188
      |> IsarThy.apply_theorems [raw_elim]
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   189
      |>>> IsarThy.apply_theorems [raw_induct]
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   190
      |>>> IsarThy.apply_theorems raw_case_eqns
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   191
      |>>> IsarThy.apply_theorems raw_recursor_eqns;
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   192
  in
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   193
    thy' |> rep_datatype_i (PureThy.single_thm "elimination" elims)
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   194
      (PureThy.single_thm "induction" inducts) case_eqns recursor_eqns
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   195
  end;
12175
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
   196
12204
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   197
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   198
(* theory setup *)
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   199
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   200
val setup =
12175
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
   201
 [DatatypesData.init,
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
   202
  ConstructorsData.init,
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
   203
  Method.add_methods
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
   204
    [("induct_tac", Method.goal_args Args.name induct_tac,
5cf58a1799a7 rearranged inductive package for Isar;
wenzelm
parents: 12109
diff changeset
   205
      "induct_tac emulation (dynamic instantiation!)"),
14153
76a6ba67bd15 new case_tac
paulson
parents: 12311
diff changeset
   206
     ("case_tac", Method.goal_args Args.name exhaust_tac,
76a6ba67bd15 new case_tac
paulson
parents: 12311
diff changeset
   207
      "datatype case_tac emulation (dynamic instantiation!)")]];
12204
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   208
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   209
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   210
(* outer syntax *)
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   211
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   212
local structure P = OuterParse and K = OuterSyntax.Keyword in
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   213
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   214
val rep_datatype_decl =
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   215
  (P.$$$ "elimination" |-- P.!!! P.xthm) --
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   216
  (P.$$$ "induction" |-- P.!!! P.xthm) --
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   217
  (P.$$$ "case_eqns" |-- P.!!! P.xthms1) --
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   218
  Scan.optional (P.$$$ "recursor_eqns" |-- P.!!! P.xthms1) []
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   219
  >> (fn (((x, y), z), w) => rep_datatype x y z w);
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   220
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   221
val rep_datatypeP =
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   222
  OuterSyntax.command "rep_datatype" "represent existing set inductively" K.thy_decl
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   223
    (rep_datatype_decl >> Toplevel.theory);
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   224
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   225
val _ = OuterSyntax.add_keywords ["elimination", "induction", "case_eqns", "recursor_eqns"];
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   226
val _ = OuterSyntax.add_parsers [rep_datatypeP];
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   227
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   228
end;
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   229
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   230
end;
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   231
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   232
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   233
val exhaust_tac = DatatypeTactics.exhaust_tac;
98115606ee42 Isar version of 'rep_datatype';
wenzelm
parents: 12175
diff changeset
   234
val induct_tac  = DatatypeTactics.induct_tac;
15705
b5edb9dcec9a *** MESSAGE REFERS TO PREVIOUS VERSION ***
wenzelm
parents: 15703
diff changeset
   235