src/HOL/thy_syntax.ML
author paulson
Wed, 06 May 1998 13:01:30 +0200
changeset 4898 68fd1a2b8b7b
parent 4873 b5999638979e
child 5097 6c4a7ad6ebc7
permissions -rw-r--r--
Removed some traces of UNITY
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
923
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
     1
(*  Title:      HOL/thy_syntax.ML
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
     2
    ID:         $Id$
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
     3
    Author:     Markus Wenzel and Lawrence C Paulson and Carsten Clasohm
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
     4
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
     5
Additional theory file sections for HOL.
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
     6
*)
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
     7
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
     8
(*the kind of distinctiveness axioms depends on number of constructors*)
2930
602cdeabb89b Turned Addsimps into AddIffs for datatype laws.
nipkow
parents: 2922
diff changeset
     9
val dtK = 7;  (* FIXME rename?, move? *)
923
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    10
3622
85898be702b2 use ThySyn.add_syntax;
wenzelm
parents: 3617
diff changeset
    11
85898be702b2 use ThySyn.add_syntax;
wenzelm
parents: 3617
diff changeset
    12
local
923
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    13
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    14
open ThyParse;
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    15
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    16
1475
7f5a4cd08209 expanded tabs; renamed subtype to typedef;
clasohm
parents: 1465
diff changeset
    17
(** typedef **)
923
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    18
1475
7f5a4cd08209 expanded tabs; renamed subtype to typedef;
clasohm
parents: 1465
diff changeset
    19
fun mk_typedef_decl (((((opt_name, vs), t), mx), rhs), wt) =
923
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    20
  let
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    21
    val name' = if_none opt_name t;
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    22
    val name = strip_quotes name';
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    23
  in
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    24
    (cat_lines [name', mk_triple (t, mk_list vs, mx), rhs, wt],
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    25
      [name ^ "_def", "Rep_" ^ name, "Rep_" ^ name ^ "_inverse",
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    26
        "Abs_" ^ name ^ "_inverse"])
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    27
  end;
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    28
1475
7f5a4cd08209 expanded tabs; renamed subtype to typedef;
clasohm
parents: 1465
diff changeset
    29
val typedef_decl =
923
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    30
  optional ("(" $$-- name --$$ ")" >> Some) None --
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    31
  type_args -- name -- opt_infix --$$ "=" -- string -- opt_witness
1475
7f5a4cd08209 expanded tabs; renamed subtype to typedef;
clasohm
parents: 1465
diff changeset
    32
  >> mk_typedef_decl;
923
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    33
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    34
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    35
3980
21ef91734970 added record section;
wenzelm
parents: 3945
diff changeset
    36
(** record **)
21ef91734970 added record section;
wenzelm
parents: 3945
diff changeset
    37
21ef91734970 added record section;
wenzelm
parents: 3945
diff changeset
    38
val record_decl =
4225
3d9e551bc5a6 improved record syntax;
wenzelm
parents: 4204
diff changeset
    39
  (type_args -- name >> (mk_pair o apfst mk_list)) --$$ "="
4226
38c91213f26b fixed record parser;
wenzelm
parents: 4225
diff changeset
    40
    -- optional (typ --$$ "+" >> (parens o cat "Some")) "None"
4225
3d9e551bc5a6 improved record syntax;
wenzelm
parents: 4204
diff changeset
    41
    -- repeat1 ((name --$$ "::" -- typ) >> mk_pair)
4001
b6a3c2665c45 record: tuned output;
wenzelm
parents: 3980
diff changeset
    42
  >> (fn ((x, y), zs) => cat_lines [x, y, mk_big_list zs]);
3980
21ef91734970 added record section;
wenzelm
parents: 3945
diff changeset
    43
21ef91734970 added record section;
wenzelm
parents: 3945
diff changeset
    44
923
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    45
(** (co)inductive **)
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    46
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    47
(*co is either "" or "Co"*)
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    48
fun inductive_decl co =
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    49
  let
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    50
    fun mk_intr_name (s, _) =   (*the "op" cancels any infix status*)
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    51
      if Syntax.is_identifier s then "op " ^ s else "_";
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    52
    fun mk_params (((recs, ipairs), monos), con_defs) =
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    53
      let val big_rec_name = space_implode "_" (map (scan_to_id o trim) recs)
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    54
          and srec_tms = mk_list recs
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    55
          and sintrs   = mk_big_list (map snd ipairs)
3194
36bfceef1800 TFL theory section
paulson
parents: 2930
diff changeset
    56
          val intrnl_name = big_rec_name ^ "_Intrnl"
923
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    57
      in
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    58
         (";\n\n\
3194
36bfceef1800 TFL theory section
paulson
parents: 2930
diff changeset
    59
          \structure " ^ intrnl_name ^ " =\n\
923
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    60
          \  struct\n\
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    61
          \  val _ = writeln \"" ^ co ^
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    62
                     "Inductive definition " ^ big_rec_name ^ "\"\n\
1430
439e1476a7f8 Improving space efficiency of inductive/datatype definitions.
paulson
parents: 1316
diff changeset
    63
          \  val rec_tms\t= map (readtm (sign_of thy) Ind_Syntax.termTVar) "
923
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    64
                           ^ srec_tms ^ "\n\
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    65
          \  and intr_tms\t= map (readtm (sign_of thy) propT)\n"
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    66
                           ^ sintrs ^ "\n\
1430
439e1476a7f8 Improving space efficiency of inductive/datatype definitions.
paulson
parents: 1316
diff changeset
    67
          \  end;\n\n\
923
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    68
          \val thy = thy |> " ^ co ^ "Ind.add_fp_def_i \n    (" ^
3194
36bfceef1800 TFL theory section
paulson
parents: 2930
diff changeset
    69
             intrnl_name ^ ".rec_tms, " ^
36bfceef1800 TFL theory section
paulson
parents: 2930
diff changeset
    70
             intrnl_name ^ ".intr_tms)"
923
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    71
         ,
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    72
          "structure " ^ big_rec_name ^ " =\n\
1430
439e1476a7f8 Improving space efficiency of inductive/datatype definitions.
paulson
parents: 1316
diff changeset
    73
          \ let\n\
439e1476a7f8 Improving space efficiency of inductive/datatype definitions.
paulson
parents: 1316
diff changeset
    74
          \  val _ = writeln \"Proofs for " ^ co ^ 
439e1476a7f8 Improving space efficiency of inductive/datatype definitions.
paulson
parents: 1316
diff changeset
    75
                     "Inductive definition " ^ big_rec_name ^ "\"\n\
923
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    76
          \  structure Result = " ^ co ^ "Ind_section_Fun\n\
3194
36bfceef1800 TFL theory section
paulson
parents: 2930
diff changeset
    77
          \\t  (open " ^ intrnl_name ^ "\n\
1430
439e1476a7f8 Improving space efficiency of inductive/datatype definitions.
paulson
parents: 1316
diff changeset
    78
          \\t   val thy\t\t= thy\n\
439e1476a7f8 Improving space efficiency of inductive/datatype definitions.
paulson
parents: 1316
diff changeset
    79
          \\t   val monos\t\t= " ^ monos ^ "\n\
439e1476a7f8 Improving space efficiency of inductive/datatype definitions.
paulson
parents: 1316
diff changeset
    80
          \\t   val con_defs\t\t= " ^ con_defs ^ ");\n\n\
1465
5d7a7e439cec expanded tabs
clasohm
parents: 1430
diff changeset
    81
          \ in\n\
1430
439e1476a7f8 Improving space efficiency of inductive/datatype definitions.
paulson
parents: 1316
diff changeset
    82
          \  struct\n\
923
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    83
          \  val " ^ mk_list (map mk_intr_name ipairs) ^ " = Result.intrs;\n\
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    84
          \  open Result\n\
1430
439e1476a7f8 Improving space efficiency of inductive/datatype definitions.
paulson
parents: 1316
diff changeset
    85
          \  end\n\
439e1476a7f8 Improving space efficiency of inductive/datatype definitions.
paulson
parents: 1316
diff changeset
    86
          \ end;\n\n\
3194
36bfceef1800 TFL theory section
paulson
parents: 2930
diff changeset
    87
          \structure " ^ intrnl_name ^ " = struct end;\n\n"
923
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    88
         )
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    89
      end
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    90
    val ipairs = "intrs" $$-- repeat1 (ident -- !! string)
3403
6cc663f6d62e A slight simplification of optstring
paulson
parents: 3345
diff changeset
    91
    fun optstring s = optional (s $$-- string >> trim) "[]"
923
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    92
  in
1788
ca62fab4ce92 Quotes now optional around inductive set
paulson
parents: 1668
diff changeset
    93
    repeat1 name -- ipairs -- optstring "monos" -- optstring "con_defs"
923
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    94
      >> mk_params
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    95
  end;
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    96
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    97
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    98
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
    99
(** datatype **)
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   100
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   101
local
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   102
  (* FIXME err -> add_datatype *)
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   103
  fun mk_cons cs =
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   104
    (case duplicates (map (fst o fst) cs) of
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   105
      [] => map (fn ((s, ts), syn) => mk_triple (s, mk_list ts, syn)) cs
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   106
    | dups => error ("Duplicate constructors: " ^ commas_quote dups));
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   107
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   108
  (*generate names of distinctiveness axioms*)
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   109
  fun mk_distinct_rules cs tname =
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   110
    let
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   111
      val uqcs = map (fn ((s, _), _) => strip_quotes s) cs;
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   112
      (*combine all constructor names with all others w/o duplicates*)
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   113
      fun neg_one c = map (fn c2 => quote (c ^ "_not_" ^ c2));
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   114
      fun neg1 [] = []
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   115
        | neg1 (c1 :: cs) = neg_one c1 cs @ neg1 cs;
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   116
    in
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   117
      if length uqcs < dtK then neg1 uqcs
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   118
      else quote (tname ^ "_ord_distinct") ::
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   119
        map (fn c => quote (tname ^ "_ord_" ^ c)) uqcs
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   120
    end;
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   121
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   122
  fun mk_rules tname cons pre = " map (get_axiom thy) " ^
3194
36bfceef1800 TFL theory section
paulson
parents: 2930
diff changeset
   123
    mk_list (map (fn ((s,_), _) => quote (tname ^ pre ^ strip_quotes s)) cons);
923
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   124
1668
8ead1fe65aad added Konrad's code for the datatype package
clasohm
parents: 1574
diff changeset
   125
  (*generate string for calling add_datatype and build_record*)
923
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   126
  fun mk_params ((ts, tname), cons) =
4184
23a09f2fd687 Each datatype t now proves a theorem split_t_case_prem
nipkow
parents: 4106
diff changeset
   127
    "val (thy,"^tname^"_add_primrec,size_"^tname^"_eqns,split_"^tname^"_eqns) =\n\
4032
4b1c69d8b767 For each datatype `t' there is now a theorem `split_t_case' of the form
nipkow
parents: 4001
diff changeset
   128
    \    Datatype.add_datatype\n"
923
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   129
    ^ mk_triple (mk_list ts, quote tname, mk_list (mk_cons cons)) ^ " thy\n\
4106
wenzelm
parents: 4091
diff changeset
   130
    \val thy = ("^tname^"_add_primrec size_"^tname^"_eqns thy)\n\
wenzelm
parents: 4091
diff changeset
   131
    \val _ = deny (" ^ quote tname ^ " mem (Sign.stamp_names_of (sign_of thy)))\n\
3665
3b44fac767f6 Added Larry's test for preventing a datatype shadowing a theory.
nipkow
parents: 3622
diff changeset
   132
    \   (\"Datatype \\\""^tname^"\\\" would clash with the theory of the same name!\");\n\
3b44fac767f6 Added Larry's test for preventing a datatype shadowing a theory.
nipkow
parents: 3622
diff changeset
   133
    \structure " ^ tname ^ " =\n\
923
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   134
    \struct\n\
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   135
    \ val inject = map (get_axiom thy) " ^
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   136
        mk_list (map (fn ((s, _), _) => quote ("inject_" ^ strip_quotes s))
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   137
          (filter_out (null o snd o fst) cons)) ^ ";\n\
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   138
    \ val distinct = " ^
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   139
        (if length cons < dtK then "let val distinct' = " else "") ^
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   140
        "map (get_axiom thy) " ^ mk_list (mk_distinct_rules cons tname) ^
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   141
        (if length cons < dtK then
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   142
          "  in distinct' @ (map (fn t => sym COMP (t RS contrapos))\
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   143
          \ distinct') end"
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   144
         else "") ^ ";\n\
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   145
    \ val induct = get_axiom thy \"" ^ tname ^ "_induct\";\n\
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   146
    \ val cases =" ^ mk_rules tname cons "_case_" ^ ";\n\
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   147
    \ val recs =" ^ mk_rules tname cons "_rec_" ^ ";\n\
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   148
    \ val simps = inject @ distinct @ cases @ recs;\n\
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   149
    \ fun induct_tac a = res_inst_tac [(" ^ quote tname ^ ", a)] induct;\n\
1264
3eb91524b938 added local simpsets; removed IOA from 'make test'
clasohm
parents: 1251
diff changeset
   150
    \end;\n\
4106
wenzelm
parents: 4091
diff changeset
   151
    \val thy = thy |> Dtype.add_record " ^
wenzelm
parents: 4091
diff changeset
   152
      mk_triple
wenzelm
parents: 4091
diff changeset
   153
        ("Sign.intern_tycon (sign_of thy) " ^ quote tname,
wenzelm
parents: 4091
diff changeset
   154
          mk_list (map (fst o fst) cons),
wenzelm
parents: 4091
diff changeset
   155
          tname ^ ".induct_tac") ^ ";\n\
wenzelm
parents: 4091
diff changeset
   156
    \val dummy = context thy;\n\
2930
602cdeabb89b Turned Addsimps into AddIffs for datatype laws.
nipkow
parents: 2922
diff changeset
   157
    \val dummy = Addsimps(" ^ tname ^ ".cases @ " ^ tname ^ ".recs);\n\
602cdeabb89b Turned Addsimps into AddIffs for datatype laws.
nipkow
parents: 2922
diff changeset
   158
    \val dummy = AddIffs " ^ tname ^ ".inject;\n\
602cdeabb89b Turned Addsimps into AddIffs for datatype laws.
nipkow
parents: 2922
diff changeset
   159
    \val dummy = " ^
602cdeabb89b Turned Addsimps into AddIffs for datatype laws.
nipkow
parents: 2922
diff changeset
   160
      (if length cons < dtK then "AddIffs " else "Addsimps ") ^
3308
da002cef7090 Added overloaded function `size' for all datatypes.
nipkow
parents: 3194
diff changeset
   161
      tname ^ ".distinct;\n\
da002cef7090 Added overloaded function `size' for all datatypes.
nipkow
parents: 3194
diff changeset
   162
    \val dummy = Addsimps(map (fn (_,eqn) =>\n\
da002cef7090 Added overloaded function `size' for all datatypes.
nipkow
parents: 3194
diff changeset
   163
    \ prove_goalw thy [get_def thy " ^ quote("size_"^tname) ^
4032
4b1c69d8b767 For each datatype `t' there is now a theorem `split_t_case' of the form
nipkow
parents: 4001
diff changeset
   164
                     "] eqn (fn _ => [Simp_tac 1])) size_"^tname^"_eqns);\n\
4184
23a09f2fd687 Each datatype t now proves a theorem split_t_case_prem
nipkow
parents: 4106
diff changeset
   165
    \val split_"^tname^"_case = prove_goal thy (#1(split_"^tname^"_eqns))\n\
23a09f2fd687 Each datatype t now proves a theorem split_t_case_prem
nipkow
parents: 4106
diff changeset
   166
    \  (fn _ => [#exhaust_tac (datatype_info thy (Sign.intern_tycon (sign_of thy) "
23a09f2fd687 Each datatype t now proves a theorem split_t_case_prem
nipkow
parents: 4106
diff changeset
   167
      ^ quote tname ^ ")) \""^tname^"0\" 1,\n\
23a09f2fd687 Each datatype t now proves a theorem split_t_case_prem
nipkow
parents: 4106
diff changeset
   168
    \            ALLGOALS Asm_simp_tac]);\n\
4204
7b15e7eee982 renamed split_T_case_prem to split_T_case_asm
oheimb
parents: 4184
diff changeset
   169
    \val split_"^tname^"_case_asm = prove_goal thy (#2(split_"^tname^"_eqns))\n\
4106
wenzelm
parents: 4091
diff changeset
   170
    \  (fn _ => [#exhaust_tac (datatype_info thy (Sign.intern_tycon (sign_of thy) "
wenzelm
parents: 4091
diff changeset
   171
      ^ quote tname ^ ")) \""^tname^"0\" 1,\n\
4536
74f7c556fd90 added split_paired_Ex to the implicit simpset
oheimb
parents: 4226
diff changeset
   172
    \            ALLGOALS (asm_simp_tac (simpset() delsimps [split_paired_Ex]))]);\n\
4106
wenzelm
parents: 4091
diff changeset
   173
    \val thy = thy\n";
wenzelm
parents: 4091
diff changeset
   174
4032
4b1c69d8b767 For each datatype `t' there is now a theorem `split_t_case' of the form
nipkow
parents: 4001
diff changeset
   175
(*
4b1c69d8b767 For each datatype `t' there is now a theorem `split_t_case' of the form
nipkow
parents: 4001
diff changeset
   176
The #exhaust_tac(snd(hd(!datatypes))) in the proof of split_"^tname^"_case
4b1c69d8b767 For each datatype `t' there is now a theorem `split_t_case' of the form
nipkow
parents: 4001
diff changeset
   177
is a hack. Ideally I would just write exhaust_tac, but the latter extracts the
4b1c69d8b767 For each datatype `t' there is now a theorem `split_t_case' of the form
nipkow
parents: 4001
diff changeset
   178
specific exhaustion tactic from the theory associated with the proof
4b1c69d8b767 For each datatype `t' there is now a theorem `split_t_case' of the form
nipkow
parents: 4001
diff changeset
   179
state. However, the exhaustion tactic for the current datatype has only just
4b1c69d8b767 For each datatype `t' there is now a theorem `split_t_case' of the form
nipkow
parents: 4001
diff changeset
   180
been added to !datatypes (a few lines above) but is not yet associated with
4b1c69d8b767 For each datatype `t' there is now a theorem `split_t_case' of the form
nipkow
parents: 4001
diff changeset
   181
the theory. Hope this can be simplified in the future.
4b1c69d8b767 For each datatype `t' there is now a theorem `split_t_case' of the form
nipkow
parents: 4001
diff changeset
   182
*)
923
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   183
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   184
  (*parsers*)
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   185
  val tvars = type_args >> map (cat "dtVar");
1316
ce35d42d2190 extended complex_typ
clasohm
parents: 1264
diff changeset
   186
ce35d42d2190 extended complex_typ
clasohm
parents: 1264
diff changeset
   187
  val simple_typ = ident >> (cat "dtTyp" o curry mk_pair "[]" o quote) ||
ce35d42d2190 extended complex_typ
clasohm
parents: 1264
diff changeset
   188
    type_var >> cat "dtVar";
ce35d42d2190 extended complex_typ
clasohm
parents: 1264
diff changeset
   189
1251
81fc4d8e3eda added nested types on right hand side of datatype definitions
clasohm
parents: 977
diff changeset
   190
  fun complex_typ toks =
1316
ce35d42d2190 extended complex_typ
clasohm
parents: 1264
diff changeset
   191
    let val typ = simple_typ || "(" $$-- complex_typ --$$ ")";
ce35d42d2190 extended complex_typ
clasohm
parents: 1264
diff changeset
   192
        val typ2 = complex_typ || "(" $$-- complex_typ --$$ ")";
ce35d42d2190 extended complex_typ
clasohm
parents: 1264
diff changeset
   193
    in
ce35d42d2190 extended complex_typ
clasohm
parents: 1264
diff changeset
   194
     (typ -- repeat (ident>>quote) >>
ce35d42d2190 extended complex_typ
clasohm
parents: 1264
diff changeset
   195
        (foldl (fn (x,y) => "dtTyp " ^ mk_pair (brackets x, y))) ||
ce35d42d2190 extended complex_typ
clasohm
parents: 1264
diff changeset
   196
      "(" $$-- !! (list1 typ2) --$$ ")" -- !! (repeat1 (ident>>quote)) >>
ce35d42d2190 extended complex_typ
clasohm
parents: 1264
diff changeset
   197
       (fn (fst, ids) => foldl (fn (x,y) => "dtTyp " ^
ce35d42d2190 extended complex_typ
clasohm
parents: 1264
diff changeset
   198
                         mk_pair (brackets x, y)) (commas fst, ids))) toks
ce35d42d2190 extended complex_typ
clasohm
parents: 1264
diff changeset
   199
    end;
ce35d42d2190 extended complex_typ
clasohm
parents: 1264
diff changeset
   200
977
5d57287e5e1e changed syntax of datatype declarations (curried types for constructor
clasohm
parents: 923
diff changeset
   201
  val opt_typs = repeat (simple_typ || ("(" $$-- complex_typ --$$ ")"));
923
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   202
  val constructor = name -- opt_typs -- opt_mixfix;
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   203
in
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   204
  val datatype_decl =
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   205
    tvars -- ident --$$ "=" -- enum1 "|" constructor >> mk_params;
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   206
end;
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   207
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   208
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   209
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   210
(** primrec **)
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   211
2922
580647a879cf Using Blast_tac
paulson
parents: 1845
diff changeset
   212
(*recursion equations have user-supplied names*)
1845
afa622bc829d Simplified syntax of primrec definitions.
berghofe
parents: 1788
diff changeset
   213
fun mk_primrec_decl_1 ((fname, tname), axms) =
923
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   214
  let
1574
5a63ab90ee8a modified primrec so it can be used in MiniML/Type.thy
clasohm
parents: 1475
diff changeset
   215
    (*Isolate type name from the structure's identifier it may be stored in*)
5a63ab90ee8a modified primrec so it can be used in MiniML/Type.thy
clasohm
parents: 1475
diff changeset
   216
    val tname' = implode (snd (take_suffix (not_equal ".") (explode tname)));
5a63ab90ee8a modified primrec so it can be used in MiniML/Type.thy
clasohm
parents: 1475
diff changeset
   217
923
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   218
    fun mk_prove (name, eqn) =
1264
3eb91524b938 added local simpsets; removed IOA from 'make test'
clasohm
parents: 1251
diff changeset
   219
      "val " ^ name ^ " = store_thm (" ^ quote name
1574
5a63ab90ee8a modified primrec so it can be used in MiniML/Type.thy
clasohm
parents: 1475
diff changeset
   220
      ^ ", prove_goalw thy [get_def thy "
5a63ab90ee8a modified primrec so it can be used in MiniML/Type.thy
clasohm
parents: 1475
diff changeset
   221
      ^ (quote (strip_quotes fname ^ "_" ^ tname')) ^ "] " ^ eqn ^ "\n\
1264
3eb91524b938 added local simpsets; removed IOA from 'make test'
clasohm
parents: 1251
diff changeset
   222
      \  (fn _ => [Simp_tac 1]));";
3eb91524b938 added local simpsets; removed IOA from 'make test'
clasohm
parents: 1251
diff changeset
   223
923
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   224
    val axs = mk_list (map (fn (n, a) => mk_pair (quote n, a)) axms);
2922
580647a879cf Using Blast_tac
paulson
parents: 1845
diff changeset
   225
  in ("|> " ^ tname ^ "_add_primrec " ^ axs
580647a879cf Using Blast_tac
paulson
parents: 1845
diff changeset
   226
      , 
580647a879cf Using Blast_tac
paulson
parents: 1845
diff changeset
   227
      cat_lines (map mk_prove axms)
1264
3eb91524b938 added local simpsets; removed IOA from 'make test'
clasohm
parents: 1251
diff changeset
   228
      ^ "\nval dummy = Addsimps " ^ mk_list (map fst axms) ^ ";")
3eb91524b938 added local simpsets; removed IOA from 'make test'
clasohm
parents: 1251
diff changeset
   229
  end;
923
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   230
2922
580647a879cf Using Blast_tac
paulson
parents: 1845
diff changeset
   231
(*recursion equations have no names*)
1845
afa622bc829d Simplified syntax of primrec definitions.
berghofe
parents: 1788
diff changeset
   232
fun mk_primrec_decl_2 ((fname, tname), axms) =
afa622bc829d Simplified syntax of primrec definitions.
berghofe
parents: 1788
diff changeset
   233
  let
afa622bc829d Simplified syntax of primrec definitions.
berghofe
parents: 1788
diff changeset
   234
    (*Isolate type name from the structure's identifier it may be stored in*)
afa622bc829d Simplified syntax of primrec definitions.
berghofe
parents: 1788
diff changeset
   235
    val tname' = implode (snd (take_suffix (not_equal ".") (explode tname)));
afa622bc829d Simplified syntax of primrec definitions.
berghofe
parents: 1788
diff changeset
   236
afa622bc829d Simplified syntax of primrec definitions.
berghofe
parents: 1788
diff changeset
   237
    fun mk_prove eqn =
afa622bc829d Simplified syntax of primrec definitions.
berghofe
parents: 1788
diff changeset
   238
      "prove_goalw thy [get_def thy "
afa622bc829d Simplified syntax of primrec definitions.
berghofe
parents: 1788
diff changeset
   239
      ^ (quote (strip_quotes fname ^ "_" ^ tname')) ^ "] " ^ eqn ^ " \
afa622bc829d Simplified syntax of primrec definitions.
berghofe
parents: 1788
diff changeset
   240
      \(fn _ => [Simp_tac 1])";
afa622bc829d Simplified syntax of primrec definitions.
berghofe
parents: 1788
diff changeset
   241
afa622bc829d Simplified syntax of primrec definitions.
berghofe
parents: 1788
diff changeset
   242
    val axs = mk_list (map (fn a => mk_pair ("\"\"", a)) axms);
2922
580647a879cf Using Blast_tac
paulson
parents: 1845
diff changeset
   243
  in ("|> " ^ tname ^ "_add_primrec " ^ axs
580647a879cf Using Blast_tac
paulson
parents: 1845
diff changeset
   244
      ,
1845
afa622bc829d Simplified syntax of primrec definitions.
berghofe
parents: 1788
diff changeset
   245
      "val dummy = Addsimps " ^
afa622bc829d Simplified syntax of primrec definitions.
berghofe
parents: 1788
diff changeset
   246
      brackets(space_implode ",\n" (map mk_prove axms)) ^ ";")
afa622bc829d Simplified syntax of primrec definitions.
berghofe
parents: 1788
diff changeset
   247
  end;
afa622bc829d Simplified syntax of primrec definitions.
berghofe
parents: 1788
diff changeset
   248
2922
580647a879cf Using Blast_tac
paulson
parents: 1845
diff changeset
   249
(*function name, argument type and either (name,axiom) pairs or just axioms*)
923
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   250
val primrec_decl =
1845
afa622bc829d Simplified syntax of primrec definitions.
berghofe
parents: 1788
diff changeset
   251
  (name -- long_id -- repeat1 (ident -- string) >> mk_primrec_decl_1) ||
afa622bc829d Simplified syntax of primrec definitions.
berghofe
parents: 1788
diff changeset
   252
  (name -- long_id -- repeat1 string >> mk_primrec_decl_2) ;
923
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   253
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   254
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   255
2922
580647a879cf Using Blast_tac
paulson
parents: 1845
diff changeset
   256
580647a879cf Using Blast_tac
paulson
parents: 1845
diff changeset
   257
(** rec: interface to Slind's TFL **)
580647a879cf Using Blast_tac
paulson
parents: 1845
diff changeset
   258
580647a879cf Using Blast_tac
paulson
parents: 1845
diff changeset
   259
3194
36bfceef1800 TFL theory section
paulson
parents: 2930
diff changeset
   260
(*fname: name of function being defined; rel: well-founded relation*)
3456
fdb1768ebd3e New "congs" keyword for recdef theory section
paulson
parents: 3403
diff changeset
   261
fun mk_rec_decl ((((fname, rel), congs), ss), axms) =
2922
580647a879cf Using Blast_tac
paulson
parents: 1845
diff changeset
   262
  let val fid = trim fname
3194
36bfceef1800 TFL theory section
paulson
parents: 2930
diff changeset
   263
      val intrnl_name = fid ^ "_Intrnl"
2922
580647a879cf Using Blast_tac
paulson
parents: 1845
diff changeset
   264
  in
580647a879cf Using Blast_tac
paulson
parents: 1845
diff changeset
   265
	 (";\n\n\
3194
36bfceef1800 TFL theory section
paulson
parents: 2930
diff changeset
   266
          \val _ = writeln \"Recursive function " ^ fid ^ "\"\n\
36bfceef1800 TFL theory section
paulson
parents: 2930
diff changeset
   267
          \val (thy, pats_" ^ intrnl_name ^ ") = Tfl.define thy " ^ 
3345
4d888ddd6284 Now recdef checks the name of the function being defined.
paulson
parents: 3308
diff changeset
   268
	                 quote fid ^ " " ^ 
3194
36bfceef1800 TFL theory section
paulson
parents: 2930
diff changeset
   269
	                 rel ^ "\n" ^ mk_big_list axms ^ ";\n\
2922
580647a879cf Using Blast_tac
paulson
parents: 1845
diff changeset
   270
          \val thy = thy"
580647a879cf Using Blast_tac
paulson
parents: 1845
diff changeset
   271
         ,
3194
36bfceef1800 TFL theory section
paulson
parents: 2930
diff changeset
   272
          "structure " ^ fid ^ " =\n\
36bfceef1800 TFL theory section
paulson
parents: 2930
diff changeset
   273
          \  struct\n\
36bfceef1800 TFL theory section
paulson
parents: 2930
diff changeset
   274
          \  val _ = writeln \"Proofs for recursive function " ^ fid ^ "\"\n\
36bfceef1800 TFL theory section
paulson
parents: 2930
diff changeset
   275
          \  val {rules, induct, tcs} = \n\
3456
fdb1768ebd3e New "congs" keyword for recdef theory section
paulson
parents: 3403
diff changeset
   276
          \    \t Tfl.simplify_defn (" ^ ss ^ ", " ^ congs ^ ")\n\
fdb1768ebd3e New "congs" keyword for recdef theory section
paulson
parents: 3403
diff changeset
   277
          \    \t\t  (thy, (" ^ quote fid ^ ", pats_" ^ intrnl_name ^ "))\n\
3194
36bfceef1800 TFL theory section
paulson
parents: 2930
diff changeset
   278
          \  end;\n\
36bfceef1800 TFL theory section
paulson
parents: 2930
diff changeset
   279
          \val pats_" ^ intrnl_name ^ " = ();\n")
2922
580647a879cf Using Blast_tac
paulson
parents: 1845
diff changeset
   280
  end;
580647a879cf Using Blast_tac
paulson
parents: 1845
diff changeset
   281
3403
6cc663f6d62e A slight simplification of optstring
paulson
parents: 3345
diff changeset
   282
val rec_decl = (name -- string -- 
3456
fdb1768ebd3e New "congs" keyword for recdef theory section
paulson
parents: 3403
diff changeset
   283
		optional ("congs" $$-- string >> trim) "[]" -- 
4091
771b1f6422a8 isatool fixclasimp;
wenzelm
parents: 4032
diff changeset
   284
		optional ("simpset" $$-- string >> trim) "simpset()" -- 
3403
6cc663f6d62e A slight simplification of optstring
paulson
parents: 3345
diff changeset
   285
		repeat1 string >> mk_rec_decl) ;
2922
580647a879cf Using Blast_tac
paulson
parents: 1845
diff changeset
   286
580647a879cf Using Blast_tac
paulson
parents: 1845
diff changeset
   287
580647a879cf Using Blast_tac
paulson
parents: 1845
diff changeset
   288
3622
85898be702b2 use ThySyn.add_syntax;
wenzelm
parents: 3617
diff changeset
   289
(** augment thy syntax **)
923
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   290
3622
85898be702b2 use ThySyn.add_syntax;
wenzelm
parents: 3617
diff changeset
   291
in
923
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   292
3622
85898be702b2 use ThySyn.add_syntax;
wenzelm
parents: 3617
diff changeset
   293
val _ = ThySyn.add_syntax
85898be702b2 use ThySyn.add_syntax;
wenzelm
parents: 3617
diff changeset
   294
 ["intrs", "monos", "con_defs", "congs", "simpset", "|"]
4873
b5999638979e TypedefPackage.add_typedef;
wenzelm
parents: 4536
diff changeset
   295
 [axm_section "typedef" "|> TypedefPackage.add_typedef" typedef_decl,
b5999638979e TypedefPackage.add_typedef;
wenzelm
parents: 4536
diff changeset
   296
  (section "record" "|> RecordPackage.add_record" record_decl),
923
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   297
  ("inductive", inductive_decl ""),
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   298
  ("coinductive", inductive_decl "Co"),
4106
wenzelm
parents: 4091
diff changeset
   299
  (section "datatype" "" datatype_decl),
2922
580647a879cf Using Blast_tac
paulson
parents: 1845
diff changeset
   300
  ("primrec", primrec_decl),
580647a879cf Using Blast_tac
paulson
parents: 1845
diff changeset
   301
  ("recdef", rec_decl)];
923
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   302
ff1574a81019 new version of HOL with curried function application
clasohm
parents:
diff changeset
   303
end;