thy_syntax.ML
author lcp
Thu, 06 Apr 1995 11:49:42 +0200
changeset 246 0f9230a24164
parent 215 5f9d7ed4ea0c
permissions -rw-r--r--
Deleted extra space in clos_mk.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
160
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
     1
(*  Title:      HOL/thy_syntax.ML
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
     2
    ID:         $Id$
172
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
     3
    Author:     Markus Wenzel and Lawrence C Paulson and Carsten Clasohm
160
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
     4
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
     5
Additional theory file sections for HOL.
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
     6
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
     7
TODO:
172
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
     8
  move datatype / primrec stuff to pre_datatype.ML (?)
160
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
     9
*)
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
    10
172
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    11
(*the kind of distinctiveness axioms depends on number of constructors*)
201
4d0545e93c0d improved primrec: now calls store_thm;
wenzelm
parents: 196
diff changeset
    12
val dtK = 5;  (* FIXME rename?, move? *)
172
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    13
160
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
    14
structure ThySynData: THY_SYN_DATA =
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
    15
struct
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
    16
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
    17
open ThyParse;
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
    18
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
    19
172
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    20
(** subtype **)
160
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
    21
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
    22
fun mk_subtype_decl (((((opt_name, vs), t), mx), rhs), wt) =
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
    23
  let
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
    24
    val name' = if_none opt_name t;
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
    25
    val name = strip_quotes name';
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
    26
  in
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
    27
    (cat_lines [name', mk_triple (t, mk_list vs, mx), rhs, wt],
172
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    28
      [name ^ "_def", "Rep_" ^ name, "Rep_" ^ name ^ "_inverse",
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    29
        "Abs_" ^ name ^ "_inverse"])
160
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
    30
  end;
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
    31
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
    32
val subtype_decl =
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
    33
  optional ("(" $$-- name --$$ ")" >> Some) None --
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
    34
  type_args -- name -- opt_infix --$$ "=" -- string -- opt_witness
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
    35
  >> mk_subtype_decl;
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
    36
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
    37
172
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    38
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    39
(** (co)inductive **)
160
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
    40
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
    41
(*co is either "" or "Co"*)
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
    42
fun inductive_decl co =
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
    43
  let
172
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    44
    fun mk_intr_name (s, _) =   (*the "op" cancels any infix status*)
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    45
      if Syntax.is_identifier s then "op " ^ s else "_";
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    46
    fun mk_params (((recs, ipairs), monos), con_defs) =
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    47
      let val big_rec_name = space_implode "_" (map (scan_to_id o trim) recs)
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    48
          and srec_tms = mk_list recs
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    49
          and sintrs   = mk_big_list (map snd ipairs)
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    50
          val stri_name = big_rec_name ^ "_Intrnl"
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    51
      in
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    52
         (";\n\n\
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    53
          \structure " ^ stri_name ^ " =\n\
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    54
          \ let open Ind_Syntax in\n\
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    55
          \  struct\n\
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    56
          \  val _ = writeln \"" ^ co ^
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    57
                     "Inductive definition " ^ big_rec_name ^ "\"\n\
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    58
          \  val rec_tms\t= map (readtm (sign_of thy) termTVar) "
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    59
                           ^ srec_tms ^ "\n\
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    60
          \  and intr_tms\t= map (readtm (sign_of thy) propT)\n"
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    61
                           ^ sintrs ^ "\n\
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    62
          \  end\n\
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    63
          \ end;\n\n\
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    64
          \val thy = thy |> " ^ co ^ "Ind.add_fp_def_i \n    (" ^
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    65
             stri_name ^ ".rec_tms, " ^
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    66
             stri_name ^ ".intr_tms)"
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    67
         ,
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    68
          "structure " ^ big_rec_name ^ " =\n\
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    69
          \  struct\n\
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    70
          \  structure Result = " ^ co ^ "Ind_section_Fun\n\
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    71
          \  (open " ^ stri_name ^ "\n\
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    72
          \   val thy\t\t= thy\n\
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    73
          \   val monos\t\t= " ^ monos ^ "\n\
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    74
          \   val con_defs\t\t= " ^ con_defs ^ ");\n\n\
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    75
          \  val " ^ mk_list (map mk_intr_name ipairs) ^ " = Result.intrs;\n\
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    76
          \  open Result\n\
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    77
          \  end\n"
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    78
         )
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    79
      end
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    80
    val ipairs = "intrs" $$-- repeat1 (ident -- !! string)
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    81
    fun optstring s = optional (s $$-- string) "\"[]\"" >> trim
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    82
  in
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    83
    repeat1 string -- ipairs -- optstring "monos" -- optstring "con_defs"
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    84
      >> mk_params
160
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
    85
  end;
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
    86
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
    87
172
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    88
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    89
(** datatype **)
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    90
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    91
local
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    92
  (* FIXME err -> add_datatype *)
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    93
  fun mk_cons cs =
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    94
    (case duplicates (map (fst o fst) cs) of
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    95
      [] => map (fn ((s, ts), syn) => mk_triple (s, mk_list ts, syn)) cs
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    96
    | dups => error ("Duplicate constructors: " ^ commas_quote dups));
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    97
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    98
  (*generate names of distinctiveness axioms*)
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
    99
  fun mk_distinct_rules cs tname =
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   100
    let
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   101
      val uqcs = map (fn ((s, _), _) => strip_quotes s) cs;
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   102
      (*combine all constructor names with all others w/o duplicates*)
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   103
      fun neg_one c = map (fn c2 => quote (c ^ "_not_" ^ c2));
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   104
      fun neg1 [] = []
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   105
        | neg1 (c1 :: cs) = neg_one c1 cs @ neg1 cs;
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   106
    in
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   107
      if length uqcs < dtK then neg1 uqcs
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   108
      else quote (tname ^ "_ord_distinct") ::
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   109
        map (fn c => quote (tname ^ "_ord_" ^ c)) uqcs
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   110
    end;
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   111
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   112
  fun mk_rules tname cons pre = " map (get_axiom thy) " ^
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   113
    mk_list (map (fn ((s, _), _) => quote (tname ^ pre ^ strip_quotes s)) cons);
160
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
   114
172
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   115
  (*generate string for calling add_datatype*)
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   116
  fun mk_params ((ts, tname), cons) =
215
5f9d7ed4ea0c Reorganized/optimized datatype definitions.
nipkow
parents: 201
diff changeset
   117
   ("val (thy, " ^ tname ^ "_add_primrec) = Datatype.add_datatype\n"
172
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   118
    ^ mk_triple (mk_list ts, quote tname, mk_list (mk_cons cons)) ^ " thy\n\
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   119
    \val thy = thy",
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   120
    "structure " ^ tname ^ " =\n\
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   121
    \struct\n\
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   122
    \ val inject = map (get_axiom thy) " ^
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   123
        mk_list (map (fn ((s, _), _) => quote ("inject_" ^ strip_quotes s))
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   124
          (filter_out (null o snd o fst) cons)) ^ ";\n\
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   125
    \ val distinct = " ^
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   126
        (if length cons < dtK then "let val distinct' = " else "") ^
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   127
        "map (get_axiom thy) " ^ mk_list (mk_distinct_rules cons tname) ^
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   128
        (if length cons < dtK then
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   129
          "  in distinct' @ (map (fn t => sym COMP (t RS contrapos))\
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   130
          \ distinct') end"
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   131
         else "") ^ ";\n\
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   132
    \ val induct = get_axiom thy \"" ^ tname ^ "_induct\";\n\
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   133
    \ val cases =" ^ mk_rules tname cons "_case_" ^ ";\n\
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   134
    \ val recs =" ^ mk_rules tname cons "_rec_" ^ ";\n\
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   135
    \ val simps = inject @ distinct @ cases @ recs;\n\
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   136
    \ fun induct_tac a = res_inst_tac [(" ^ quote tname ^ ", a)] induct;\n\
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   137
    \end;\n");
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   138
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   139
  (*parsers*)
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   140
  val tvars = type_args >> map (cat "dtVar");
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   141
  val typ =
196
61620d959717 Moved the old List to ex and replaced it by one defined via
nipkow
parents: 172
diff changeset
   142
    tvars -- (ident>>quote) >> (cat "dtTyp" o mk_pair o apfst mk_list) ||
172
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   143
    type_var >> cat "dtVar";
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   144
  val opt_typs = optional ("(" $$-- list1 typ --$$ ")") [];
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   145
  val constructor = name -- opt_typs -- opt_mixfix;
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   146
in
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   147
  val datatype_decl =
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   148
    (* FIXME tvars -> type_args *)
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   149
    tvars -- ident --$$ "=" -- enum1 "|" constructor >> mk_params;
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   150
end;
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   151
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   152
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   153
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   154
(** primrec **)
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   155
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   156
fun mk_primrec_decl ((fname, tname), axms) =
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   157
  let
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   158
    fun mk_prove (name, eqn) =
201
4d0545e93c0d improved primrec: now calls store_thm;
wenzelm
parents: 196
diff changeset
   159
      "val " ^ name ^ " = store_thm (" ^ quote name ^ ", prove_goalw thy [get_def thy " 
4d0545e93c0d improved primrec: now calls store_thm;
wenzelm
parents: 196
diff changeset
   160
      ^ fname ^ "] " ^ eqn ^ "\n\
4d0545e93c0d improved primrec: now calls store_thm;
wenzelm
parents: 196
diff changeset
   161
      \  (fn _ => [simp_tac (HOL_ss addsimps " ^ tname ^ ".recs) 1]));";
172
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   162
    val axs = mk_list (map (fn (n, a) => mk_pair (quote n, a)) axms);
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   163
  in ("|> " ^ tname ^ "_add_primrec " ^ axs, cat_lines (map mk_prove axms)) end;
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   164
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   165
val primrec_decl =
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   166
  name -- long_id -- repeat1 (ident -- string) >> mk_primrec_decl;
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   167
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   168
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   169
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   170
(** sections **)
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   171
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   172
val user_keywords = ["intrs", "monos", "con_defs", "|"];
160
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
   173
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
   174
val user_sections =
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
   175
 [axm_section "subtype" "|> Subtype.add_subtype" subtype_decl,
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
   176
  ("inductive", inductive_decl ""),
172
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   177
  ("coinductive", inductive_decl "Co"),
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   178
  ("datatype", datatype_decl),
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   179
  ("primrec", primrec_decl)];
160
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
   180
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
   181
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
   182
end;
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
   183
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
   184
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
   185
structure ThySyn = ThySynFun(ThySynData);
437e00414994 additional theory file sections for HOL;
wenzelm
parents:
diff changeset
   186
init_thy_reader ();
172
8aa51768ade4 added 'datatype' and 'primrec';
wenzelm
parents: 160
diff changeset
   187