src/HOL/Tools/Function/function_common.ML
author wenzelm
Tue, 21 Jan 2025 16:12:27 +0100
changeset 81941 cb8f396dd39f
parent 81441 29e60ca6ec01
permissions -rw-r--r--
tuned;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
34232
36a2a3029fd3 new year's resolution: reindented code in function package
krauss
parents: 34231
diff changeset
     1
(*  Title:      HOL/Tools/Function/function_common.ML
33099
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents:
diff changeset
     2
    Author:     Alexander Krauss, TU Muenchen
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents:
diff changeset
     3
41114
f9ae7c2abf7e tuned headers
krauss
parents: 39276
diff changeset
     4
Common definitions and other infrastructure for the function package.
33099
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents:
diff changeset
     5
*)
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents:
diff changeset
     6
67634
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
     7
signature FUNCTION_COMMON =
34230
b0d21ae2528e more official data record Function.info
krauss
parents: 33751
diff changeset
     8
sig
59159
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
     9
  type info =
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
    10
   {is_partial : bool,
63004
f507e6fe1d77 prefer binding over base name;
wenzelm
parents: 63002
diff changeset
    11
    defname : binding,
59159
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
    12
      (*contains no logical entities: invariant under morphisms:*)
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
    13
    add_simps : (binding -> binding) -> string -> (binding -> binding) ->
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
    14
      Token.src list -> thm list -> local_theory -> thm list * local_theory,
63004
f507e6fe1d77 prefer binding over base name;
wenzelm
parents: 63002
diff changeset
    15
    fnames : binding list,
59159
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
    16
    case_names : string list,
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
    17
    fs : term list,
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
    18
    R : term,
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
    19
    dom: term,
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
    20
    psimps: thm list,
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
    21
    pinducts: thm list,
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
    22
    simps : thm list option,
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
    23
    inducts : thm list option,
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
    24
    termination : thm,
65387
5dbe02addca5 store totality fact in function info
Lars Hupel <lars.hupel@mytum.de>
parents: 63183
diff changeset
    25
    totality : thm option,
59159
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
    26
    cases : thm list,
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
    27
    pelims: thm list list,
81441
29e60ca6ec01 added field input_eqns to record the list of equations (the specification)
nipkow
parents: 74561
diff changeset
    28
    elims: thm list list option,
29e60ca6ec01 added field input_eqns to record the list of equations (the specification)
nipkow
parents: 74561
diff changeset
    29
    input_eqns: term list}
49965
ee25a04fa06a proper signatures;
wenzelm
parents: 46949
diff changeset
    30
  val profile : bool Unsynchronized.ref
ee25a04fa06a proper signatures;
wenzelm
parents: 46949
diff changeset
    31
  val PROFILE : string -> ('a -> 'b) -> 'a -> 'b
ee25a04fa06a proper signatures;
wenzelm
parents: 46949
diff changeset
    32
  val mk_acc : typ -> term -> term
59159
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
    33
  val split_def : Proof.context -> (string -> 'a) -> term ->
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
    34
    string * (string * typ) list * term list * term list * term
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
    35
  val check_defs : Proof.context -> ((string * typ) * 'a) list -> term list -> unit
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
    36
  type fixes = ((string * typ) * mixfix) list
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
    37
  type 'a spec = (Attrib.binding * 'a list) list
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
    38
  datatype function_config = FunctionConfig of
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
    39
   {sequential: bool,
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
    40
    default: string option,
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
    41
    domintros: bool,
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
    42
    partials: bool}
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
    43
  type preproc = function_config -> Proof.context -> fixes -> term spec ->
63010
wenzelm
parents: 63005
diff changeset
    44
    term list * (thm list -> thm spec) * (thm list -> thm list list) * string list
59159
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
    45
  val fname_of : term -> string
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
    46
  val mk_case_names : int -> string -> int -> string list
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
    47
  val empty_preproc : (Proof.context -> ((string * typ) * mixfix) list -> term list -> 'c) ->
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
    48
    preproc
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
    49
  val termination_rule_tac : Proof.context -> int -> tactic
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
    50
  val store_termination_rule : thm -> Context.generic -> Context.generic
67634
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
    51
  val retrieve_function_data : Proof.context -> term -> (term * info) list
59159
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
    52
  val add_function_data : info -> Context.generic -> Context.generic
60682
5a6cd2560549 have the installed termination prover take a 'quiet' flag
blanchet
parents: 59621
diff changeset
    53
  val termination_prover_tac : bool -> Proof.context -> tactic
5a6cd2560549 have the installed termination prover take a 'quiet' flag
blanchet
parents: 59621
diff changeset
    54
  val set_termination_prover : (bool -> Proof.context -> tactic) -> Context.generic ->
5a6cd2560549 have the installed termination prover take a 'quiet' flag
blanchet
parents: 59621
diff changeset
    55
    Context.generic
59159
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
    56
  val get_preproc: Proof.context -> preproc
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
    57
  val set_preproc: preproc -> Context.generic -> Context.generic
49965
ee25a04fa06a proper signatures;
wenzelm
parents: 46949
diff changeset
    58
  datatype function_result = FunctionResult of
ee25a04fa06a proper signatures;
wenzelm
parents: 46949
diff changeset
    59
   {fs: term list,
ee25a04fa06a proper signatures;
wenzelm
parents: 46949
diff changeset
    60
    G: term,
ee25a04fa06a proper signatures;
wenzelm
parents: 46949
diff changeset
    61
    R: term,
52384
80c00a851de5 export dom predicate in the info record
krauss
parents: 52383
diff changeset
    62
    dom: term,
49965
ee25a04fa06a proper signatures;
wenzelm
parents: 46949
diff changeset
    63
    psimps : thm list,
ee25a04fa06a proper signatures;
wenzelm
parents: 46949
diff changeset
    64
    simple_pinducts : thm list,
53603
59ef06cda7b9 generate elim rules for elimination of function equalities;
Manuel Eberl
parents: 52384
diff changeset
    65
    cases : thm list,
59ef06cda7b9 generate elim rules for elimination of function equalities;
Manuel Eberl
parents: 52384
diff changeset
    66
    pelims : thm list list,
49965
ee25a04fa06a proper signatures;
wenzelm
parents: 46949
diff changeset
    67
    termination : thm,
ee25a04fa06a proper signatures;
wenzelm
parents: 46949
diff changeset
    68
    domintros : thm list option}
63004
f507e6fe1d77 prefer binding over base name;
wenzelm
parents: 63002
diff changeset
    69
  val transform_function_data : morphism -> info -> info
49965
ee25a04fa06a proper signatures;
wenzelm
parents: 46949
diff changeset
    70
  val import_function_data : term -> Proof.context -> info option
ee25a04fa06a proper signatures;
wenzelm
parents: 46949
diff changeset
    71
  val import_last_function : Proof.context -> info option
ee25a04fa06a proper signatures;
wenzelm
parents: 46949
diff changeset
    72
  val default_config : function_config
ee25a04fa06a proper signatures;
wenzelm
parents: 46949
diff changeset
    73
  val function_parser : function_config ->
63183
wenzelm
parents: 63064
diff changeset
    74
    (function_config * ((binding * string option * mixfix) list * Specification.multi_specs_cmd)) parser
49965
ee25a04fa06a proper signatures;
wenzelm
parents: 46949
diff changeset
    75
end
ee25a04fa06a proper signatures;
wenzelm
parents: 46949
diff changeset
    76
ee25a04fa06a proper signatures;
wenzelm
parents: 46949
diff changeset
    77
structure Function_Common : FUNCTION_COMMON =
33099
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents:
diff changeset
    78
struct
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents:
diff changeset
    79
67634
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
    80
local open Function_Lib in
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
    81
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
    82
(* info *)
34230
b0d21ae2528e more official data record Function.info
krauss
parents: 33751
diff changeset
    83
67634
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
    84
type info =
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
    85
 {is_partial : bool,
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
    86
  defname : binding,
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
    87
    (*contains no logical entities: invariant under morphisms:*)
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
    88
  add_simps : (binding -> binding) -> string -> (binding -> binding) ->
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
    89
    Token.src list -> thm list -> local_theory -> thm list * local_theory,
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
    90
  fnames : binding list,
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
    91
  case_names : string list,
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
    92
  fs : term list,
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
    93
  R : term,
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
    94
  dom: term,
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
    95
  psimps: thm list,
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
    96
  pinducts: thm list,
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
    97
  simps : thm list option,
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
    98
  inducts : thm list option,
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
    99
  termination : thm,
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
   100
  totality : thm option,
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
   101
  cases : thm list,
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
   102
  pelims : thm list list,
81441
29e60ca6ec01 added field input_eqns to record the list of equations (the specification)
nipkow
parents: 74561
diff changeset
   103
  elims : thm list list option,
29e60ca6ec01 added field input_eqns to record the list of equations (the specification)
nipkow
parents: 74561
diff changeset
   104
  input_eqns: term list}
67634
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
   105
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
   106
fun transform_function_data phi ({add_simps, case_names, fnames, fs, R, dom, psimps, pinducts,
81441
29e60ca6ec01 added field input_eqns to record the list of equations (the specification)
nipkow
parents: 74561
diff changeset
   107
  simps, inducts, termination, totality, defname, is_partial, cases, pelims, elims, input_eqns} : info) =
67634
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
   108
    let
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
   109
      val term = Morphism.term phi
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
   110
      val thm = Morphism.thm phi
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
   111
      val fact = Morphism.fact phi
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
   112
    in
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
   113
      { add_simps = add_simps, case_names = case_names, fnames = fnames,
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
   114
        fs = map term fs, R = term R, dom = term dom, psimps = fact psimps,
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
   115
        pinducts = fact pinducts, simps = Option.map fact simps,
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
   116
        inducts = Option.map fact inducts, termination = thm termination,
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
   117
        totality = Option.map thm totality, defname = Morphism.binding phi defname,
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
   118
        is_partial = is_partial, cases = fact cases,
81441
29e60ca6ec01 added field input_eqns to record the list of equations (the specification)
nipkow
parents: 74561
diff changeset
   119
        pelims = map fact pelims, elims = Option.map (map fact) elims,
29e60ca6ec01 added field input_eqns to record the list of equations (the specification)
nipkow
parents: 74561
diff changeset
   120
        input_eqns = map term input_eqns }
67634
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
   121
    end
33099
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents:
diff changeset
   122
59159
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   123
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   124
(* profiling *)
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   125
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   126
val profile = Unsynchronized.ref false
33099
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents:
diff changeset
   127
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents:
diff changeset
   128
fun PROFILE msg = if !profile then timeap_msg msg else I
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents:
diff changeset
   129
67149
e61557884799 prefer control symbol antiquotations;
wenzelm
parents: 65387
diff changeset
   130
val acc_const_name = \<^const_name>\<open>Wellfounded.accp\<close>
33099
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents:
diff changeset
   131
fun mk_acc domT R =
59159
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   132
  Const (acc_const_name, (domT --> domT --> HOLogic.boolT) --> domT --> HOLogic.boolT) $ R
33099
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents:
diff changeset
   133
59159
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   134
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   135
(* analyzing function equations *)
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   136
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   137
fun split_def ctxt check_head geq =
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   138
  let
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   139
    fun input_error msg = cat_lines [msg, Syntax.string_of_term ctxt geq]
67149
e61557884799 prefer control symbol antiquotations;
wenzelm
parents: 65387
diff changeset
   140
    val qs = Term.strip_qnt_vars \<^const_name>\<open>Pure.all\<close> geq
e61557884799 prefer control symbol antiquotations;
wenzelm
parents: 65387
diff changeset
   141
    val imp = Term.strip_qnt_body \<^const_name>\<open>Pure.all\<close> geq
59159
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   142
    val (gs, eq) = Logic.strip_horn imp
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   143
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   144
    val (f_args, rhs) = HOLogic.dest_eq (HOLogic.dest_Trueprop eq)
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   145
      handle TERM _ => error (input_error "Not an equation")
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   146
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   147
    val (head, args) = strip_comb f_args
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   148
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   149
    val fname = fst (dest_Free head) handle TERM _ => ""
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   150
    val _ = check_head fname
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   151
  in
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   152
    (fname, qs, gs, args, rhs)
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   153
  end
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   154
63002
56cf1249ee20 removed pointless check (see Type_Infer.object_logic);
wenzelm
parents: 61112
diff changeset
   155
(*check for various errors in the input*)
59159
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   156
fun check_defs ctxt fixes eqs =
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   157
  let
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   158
    val fnames = map (fst o fst) fixes
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   159
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   160
    fun check geq =
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   161
      let
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   162
        fun input_error msg = error (cat_lines [msg, Syntax.string_of_term ctxt geq])
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   163
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   164
        fun check_head fname =
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   165
          member (op =) fnames fname orelse
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   166
          input_error ("Illegal equation head. Expected " ^ commas_quote fnames)
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   167
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   168
        val (fname, qs, gs, args, rhs) = split_def ctxt check_head geq
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   169
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   170
        val _ = length args > 0 orelse input_error "Function has no arguments:"
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   171
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   172
        fun add_bvs t is = add_loose_bnos (t, 0, is)
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   173
        val rvs = (subtract (op =) (fold add_bvs args []) (add_bvs rhs []))
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   174
                    |> map (fst o nth (rev qs))
33099
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents:
diff changeset
   175
59159
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   176
        val _ = null rvs orelse input_error
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   177
          ("Variable" ^ plural " " "s " rvs ^ commas_quote rvs ^
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   178
           " occur" ^ plural "s" "" rvs ^ " on right hand side only:")
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   179
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   180
        val _ = forall (not o Term.exists_subterm
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   181
          (fn Free (n, _) => member (op =) fnames n | _ => false)) (gs @ args)
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   182
          orelse input_error "Defined function may not occur in premises or arguments"
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   183
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   184
        val freeargs = map (fn t => subst_bounds (rev (map Free qs), t)) args
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   185
        val funvars =
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   186
          filter
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   187
            (fn q => exists (exists_subterm (fn (Free q') $ _ => q = q' | _ => false)) freeargs) qs
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   188
        val _ = null funvars orelse (warning (cat_lines
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   189
          ["Bound variable" ^ plural " " "s " funvars ^
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   190
          commas_quote (map fst funvars) ^ " occur" ^ plural "s" "" funvars ^
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   191
          " in function position.", "Misspelled constructor???"]); true)
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   192
      in
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   193
        (fname, length args)
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   194
      end
33099
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents:
diff changeset
   195
59159
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   196
    val grouped_args = AList.group (op =) (map check eqs)
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   197
    val _ = grouped_args
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   198
      |> map (fn (fname, ars) =>
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   199
        length (distinct (op =) ars) = 1 orelse
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   200
          error ("Function " ^ quote fname ^
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   201
            " has different numbers of arguments in different equations"))
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   202
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   203
    val not_defined = subtract (op =) (map fst grouped_args) fnames
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   204
    val _ = null not_defined
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   205
      orelse error ("No defining equations for function" ^
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   206
        plural " " "s " not_defined ^ commas_quote not_defined)
63002
56cf1249ee20 removed pointless check (see Type_Infer.object_logic);
wenzelm
parents: 61112
diff changeset
   207
  in () end
33099
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents:
diff changeset
   208
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents:
diff changeset
   209
59159
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   210
(* preprocessors *)
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   211
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   212
type fixes = ((string * typ) * mixfix) list
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   213
type 'a spec = (Attrib.binding * 'a list) list
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   214
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   215
datatype function_config = FunctionConfig of
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   216
 {sequential: bool,
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   217
  default: string option,
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   218
  domintros: bool,
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   219
  partials: bool}
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   220
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   221
type preproc = function_config -> Proof.context -> fixes -> term spec ->
63010
wenzelm
parents: 63005
diff changeset
   222
  term list * (thm list -> thm spec) * (thm list -> thm list list) * string list
59159
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   223
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   224
val fname_of = fst o dest_Free o fst o strip_comb o fst o HOLogic.dest_eq o
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   225
  HOLogic.dest_Trueprop o Logic.strip_imp_concl o snd o dest_all_all
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   226
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   227
fun mk_case_names i "" k = mk_case_names i (string_of_int (i + 1)) k
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   228
  | mk_case_names _ _ 0 = []
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   229
  | mk_case_names _ n 1 = [n]
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   230
  | mk_case_names _ n k = map (fn i => n ^ "_" ^ string_of_int i) (1 upto k)
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   231
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   232
fun empty_preproc check (_: function_config) (ctxt: Proof.context) (fixes: fixes) spec =
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   233
  let
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   234
    val (bnds, tss) = split_list spec
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   235
    val ts = flat tss
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   236
    val _ = check ctxt fixes ts
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   237
    val fnames = map (fst o fst) fixes
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   238
    val indices = map (fn eq => find_index (curry op = (fname_of eq)) fnames) ts
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   239
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   240
    fun sort xs = partition_list (fn i => fn (j,_) => i = j) 0 (length fnames - 1)
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   241
      (indices ~~ xs) |> map (map snd)
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   242
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   243
    (* using theorem names for case name currently disabled *)
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   244
    val cnames = map_index (fn (i, _) => mk_case_names i "" 1) bnds |> flat
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   245
  in
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   246
    (ts, curry op ~~ bnds o Library.unflat tss, sort, cnames)
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   247
  end
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   248
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   249
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   250
(* context data *)
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   251
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   252
structure Data = Generic_Data
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   253
(
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   254
  type T =
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   255
    thm list *
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   256
    (term * info) Item_Net.T *
60682
5a6cd2560549 have the installed termination prover take a 'quiet' flag
blanchet
parents: 59621
diff changeset
   257
    (bool -> Proof.context -> tactic) *
59159
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   258
    preproc
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   259
  val empty: T =
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   260
   ([],
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   261
    Item_Net.init (op aconv o apply2 fst) (single o fst),
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   262
    fn _ => error "Termination prover not configured",
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   263
    empty_preproc check_defs)
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   264
  fun merge
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   265
   ((termination_rules1, functions1, termination_prover1, preproc1),
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   266
    (termination_rules2, functions2, _, _)) : T =
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   267
   (Thm.merge_thms (termination_rules1, termination_rules2),
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   268
    Item_Net.merge (functions1, functions2),
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   269
    termination_prover1,
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   270
    preproc1)
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   271
)
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   272
59498
50b60f501b05 proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
wenzelm
parents: 59159
diff changeset
   273
fun termination_rule_tac ctxt = resolve_tac ctxt (#1 (Data.get (Context.Proof ctxt)))
50b60f501b05 proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
wenzelm
parents: 59159
diff changeset
   274
61112
e966c311e9a7 trim context for persistent storage;
wenzelm
parents: 60682
diff changeset
   275
val store_termination_rule = Data.map o @{apply 4(1)} o cons o Thm.trim_context
59159
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   276
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   277
val get_functions = #2 o Data.get o Context.Proof
67634
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
   278
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
   279
fun retrieve_function_data ctxt t =
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
   280
  Item_Net.retrieve (get_functions ctxt) t
67664
ad2b3e330c27 tuned signature;
wenzelm
parents: 67651
diff changeset
   281
  |> (map o apsnd) (transform_function_data (Morphism.transfer_morphism' ctxt));
67634
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
   282
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
   283
val add_function_data =
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
   284
  transform_function_data Morphism.trim_context_morphism #>
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
   285
  (fn info as {fs, termination, ...} =>
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
   286
    (Data.map o @{apply 4(2)}) (fold (fn f => Item_Net.update (f, info)) fs)
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
   287
    #> store_termination_rule termination)
59159
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   288
60682
5a6cd2560549 have the installed termination prover take a 'quiet' flag
blanchet
parents: 59621
diff changeset
   289
fun termination_prover_tac quiet ctxt = #3 (Data.get (Context.Proof ctxt)) quiet ctxt
59159
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   290
val set_termination_prover = Data.map o @{apply 4(3)} o K
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   291
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   292
val get_preproc = #4 o Data.get o Context.Proof
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   293
val set_preproc = Data.map o @{apply 4(4)} o K
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   294
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   295
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   296
(* function definition result data *)
33099
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents:
diff changeset
   297
34232
36a2a3029fd3 new year's resolution: reindented code in function package
krauss
parents: 34231
diff changeset
   298
datatype function_result = FunctionResult of
36a2a3029fd3 new year's resolution: reindented code in function package
krauss
parents: 34231
diff changeset
   299
 {fs: term list,
36a2a3029fd3 new year's resolution: reindented code in function package
krauss
parents: 34231
diff changeset
   300
  G: term,
36a2a3029fd3 new year's resolution: reindented code in function package
krauss
parents: 34231
diff changeset
   301
  R: term,
52384
80c00a851de5 export dom predicate in the info record
krauss
parents: 52383
diff changeset
   302
  dom: term,
34232
36a2a3029fd3 new year's resolution: reindented code in function package
krauss
parents: 34231
diff changeset
   303
  psimps : thm list,
36a2a3029fd3 new year's resolution: reindented code in function package
krauss
parents: 34231
diff changeset
   304
  simple_pinducts : thm list,
53603
59ef06cda7b9 generate elim rules for elimination of function equalities;
Manuel Eberl
parents: 52384
diff changeset
   305
  cases : thm list,
59ef06cda7b9 generate elim rules for elimination of function equalities;
Manuel Eberl
parents: 52384
diff changeset
   306
  pelims : thm list list,
34232
36a2a3029fd3 new year's resolution: reindented code in function package
krauss
parents: 34231
diff changeset
   307
  termination : thm,
36a2a3029fd3 new year's resolution: reindented code in function package
krauss
parents: 34231
diff changeset
   308
  domintros : thm list option}
33099
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents:
diff changeset
   309
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents:
diff changeset
   310
fun import_function_data t ctxt =
34232
36a2a3029fd3 new year's resolution: reindented code in function package
krauss
parents: 34231
diff changeset
   311
  let
59621
291934bac95e Thm.cterm_of and Thm.ctyp_of operate on local context;
wenzelm
parents: 59618
diff changeset
   312
    val ct = Thm.cterm_of ctxt t
67651
6dd41193a72a more explicit instantiate_morphism (without checks for typ / term component);
wenzelm
parents: 67634
diff changeset
   313
    fun inst_morph u =
6dd41193a72a more explicit instantiate_morphism (without checks for typ / term component);
wenzelm
parents: 67634
diff changeset
   314
      Morphism.instantiate_morphism (Thm.match (Thm.cterm_of ctxt u, ct))
6dd41193a72a more explicit instantiate_morphism (without checks for typ / term component);
wenzelm
parents: 67634
diff changeset
   315
    fun match (u, data) =
6dd41193a72a more explicit instantiate_morphism (without checks for typ / term component);
wenzelm
parents: 67634
diff changeset
   316
      SOME (transform_function_data (inst_morph u) data) handle Pattern.MATCH => NONE
34232
36a2a3029fd3 new year's resolution: reindented code in function package
krauss
parents: 34231
diff changeset
   317
  in
67634
9225bb0d1327 trim context of persistent data;
wenzelm
parents: 67149
diff changeset
   318
    get_first match (retrieve_function_data ctxt t)
71177
71467e35fc3c more structural integrity;
wenzelm
parents: 70326
diff changeset
   319
    |> Option.map (transform_function_data (Morphism.transfer_morphism' ctxt))
34232
36a2a3029fd3 new year's resolution: reindented code in function package
krauss
parents: 34231
diff changeset
   320
  end
33099
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents:
diff changeset
   321
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents:
diff changeset
   322
fun import_last_function ctxt =
59159
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   323
  (case Item_Net.content (get_functions ctxt) of
34232
36a2a3029fd3 new year's resolution: reindented code in function package
krauss
parents: 34231
diff changeset
   324
    [] => NONE
49966
cf4c03c019e5 removed dead code;
wenzelm
parents: 49965
diff changeset
   325
  | (t, _) :: _ =>
70326
wenzelm
parents: 70312
diff changeset
   326
      let val (t', ctxt') = yield_singleton (Variable.import_terms true) t ctxt
59159
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   327
      in import_function_data t' ctxt' end)
33099
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents:
diff changeset
   328
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents:
diff changeset
   329
59159
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   330
(* configuration management *)
33099
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents:
diff changeset
   331
59159
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   332
datatype function_opt =
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   333
    Sequential
33099
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents:
diff changeset
   334
  | Default of string
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents:
diff changeset
   335
  | DomIntros
33101
8846318b52d0 configuration flag "partials"
krauss
parents: 33099
diff changeset
   336
  | No_Partials
33099
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents:
diff changeset
   337
59159
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   338
fun apply_opt Sequential (FunctionConfig {sequential = _, default, domintros, partials}) =
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   339
      FunctionConfig
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   340
        {sequential = true, default = default, domintros = domintros, partials = partials}
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   341
  | apply_opt (Default d) (FunctionConfig {sequential, default = _, domintros, partials}) =
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   342
      FunctionConfig
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   343
        {sequential = sequential, default = SOME d, domintros = domintros, partials = partials}
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   344
  | apply_opt DomIntros (FunctionConfig {sequential, default, domintros = _, partials}) =
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   345
      FunctionConfig
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   346
        {sequential = sequential, default = default, domintros = true, partials = partials}
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   347
  | apply_opt No_Partials (FunctionConfig {sequential, default, domintros, partials = _}) =
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   348
      FunctionConfig
9312710451f5 just one data slot per program unit;
wenzelm
parents: 59058
diff changeset
   349
        {sequential = sequential, default = default, domintros = domintros, partials = false}
33099
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents:
diff changeset
   350
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents:
diff changeset
   351
val default_config =
41417
211dbd42f95d function (default) is legacy feature
krauss
parents: 41114
diff changeset
   352
  FunctionConfig { sequential=false, default=NONE,
41846
b368a7aee46a removed support for tail-recursion from function package (now implemented by partial_function)
krauss
parents: 41417
diff changeset
   353
    domintros=false, partials=true}
33099
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents:
diff changeset
   354
34232
36a2a3029fd3 new year's resolution: reindented code in function package
krauss
parents: 34231
diff changeset
   355
local
44357
5f5649ac8235 tuned Parse.group: delayed failure message;
wenzelm
parents: 42361
diff changeset
   356
  val option_parser = Parse.group (fn () => "option")
36960
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 36954
diff changeset
   357
    ((Parse.reserved "sequential" >> K Sequential)
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 36954
diff changeset
   358
     || ((Parse.reserved "default" |-- Parse.term) >> Default)
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 36954
diff changeset
   359
     || (Parse.reserved "domintros" >> K DomIntros)
41846
b368a7aee46a removed support for tail-recursion from function package (now implemented by partial_function)
krauss
parents: 41417
diff changeset
   360
     || (Parse.reserved "no_partials" >> K No_Partials))
33099
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents:
diff changeset
   361
34232
36a2a3029fd3 new year's resolution: reindented code in function package
krauss
parents: 34231
diff changeset
   362
  fun config_parser default =
67149
e61557884799 prefer control symbol antiquotations;
wenzelm
parents: 65387
diff changeset
   363
    (Scan.optional (\<^keyword>\<open>(\<close> |-- Parse.!!! (Parse.list1 option_parser) --| \<^keyword>\<open>)\<close>) [])
34232
36a2a3029fd3 new year's resolution: reindented code in function package
krauss
parents: 34231
diff changeset
   364
     >> (fn opts => fold apply_opt opts default)
33099
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents:
diff changeset
   365
in
34232
36a2a3029fd3 new year's resolution: reindented code in function package
krauss
parents: 34231
diff changeset
   366
  fun function_parser default_cfg =
63183
wenzelm
parents: 63064
diff changeset
   367
      config_parser default_cfg -- Parse_Spec.specification
33099
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents:
diff changeset
   368
end
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents:
diff changeset
   369
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents:
diff changeset
   370
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents:
diff changeset
   371
end
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents:
diff changeset
   372
end