| author | nipkow | 
| Fri, 28 Feb 2014 18:09:37 +0100 | |
| changeset 55807 | fd31d0e70eb8 | 
| parent 54740 | 91f54d386680 | 
| child 56245 | 84fc7dfa3cd4 | 
| permissions | -rw-r--r-- | 
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
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 | 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 | |
| 34230 | 7 | signature FUNCTION_DATA = | 
| 8 | sig | |
| 9 | ||
| 10 | type info = | |
| 11 |  {is_partial : bool,
 | |
| 12 | defname : string, | |
| 13 | (* contains no logical entities: invariant under morphisms: *) | |
| 14 | add_simps : (binding -> binding) -> string -> (binding -> binding) -> | |
| 15 | Attrib.src list -> thm list -> local_theory -> thm list * local_theory, | |
| 53603 
59ef06cda7b9
generate elim rules for elimination of function equalities;
 Manuel Eberl parents: 
52384diff
changeset | 16 | fnames : string list, | 
| 34230 | 17 | case_names : string list, | 
| 18 | fs : term list, | |
| 19 | R : term, | |
| 52384 | 20 | dom: term, | 
| 34230 | 21 | psimps: thm list, | 
| 22 | pinducts: thm list, | |
| 34231 | 23 | simps : thm list option, | 
| 24 | inducts : thm list option, | |
| 52383 | 25 | termination : thm, | 
| 53603 
59ef06cda7b9
generate elim rules for elimination of function equalities;
 Manuel Eberl parents: 
52384diff
changeset | 26 | cases : thm list, | 
| 
59ef06cda7b9
generate elim rules for elimination of function equalities;
 Manuel Eberl parents: 
52384diff
changeset | 27 | pelims: thm list list, | 
| 
59ef06cda7b9
generate elim rules for elimination of function equalities;
 Manuel Eberl parents: 
52384diff
changeset | 28 | elims: thm list list option} | 
| 34230 | 29 | |
| 30 | end | |
| 31 | ||
| 32 | structure Function_Data : FUNCTION_DATA = | |
| 33 | struct | |
| 34 | ||
| 35 | type info = | |
| 36 |  {is_partial : bool,
 | |
| 37 | defname : string, | |
| 38 | (* contains no logical entities: invariant under morphisms: *) | |
| 39 | add_simps : (binding -> binding) -> string -> (binding -> binding) -> | |
| 40 | Attrib.src list -> thm list -> local_theory -> thm list * local_theory, | |
| 53603 
59ef06cda7b9
generate elim rules for elimination of function equalities;
 Manuel Eberl parents: 
52384diff
changeset | 41 | fnames : string list, | 
| 34230 | 42 | case_names : string list, | 
| 43 | fs : term list, | |
| 44 | R : term, | |
| 52384 | 45 | dom: term, | 
| 34230 | 46 | psimps: thm list, | 
| 47 | pinducts: thm list, | |
| 34231 | 48 | simps : thm list option, | 
| 49 | inducts : thm list option, | |
| 52383 | 50 | termination : thm, | 
| 53603 
59ef06cda7b9
generate elim rules for elimination of function equalities;
 Manuel Eberl parents: 
52384diff
changeset | 51 | cases : thm list, | 
| 
59ef06cda7b9
generate elim rules for elimination of function equalities;
 Manuel Eberl parents: 
52384diff
changeset | 52 | pelims : thm list list, | 
| 
59ef06cda7b9
generate elim rules for elimination of function equalities;
 Manuel Eberl parents: 
52384diff
changeset | 53 | elims : thm list list option} | 
| 34230 | 54 | |
| 55 | end | |
| 56 | ||
| 49965 | 57 | signature FUNCTION_COMMON = | 
| 58 | sig | |
| 59 | include FUNCTION_DATA | |
| 60 | val profile : bool Unsynchronized.ref | |
| 61 |   val PROFILE : string -> ('a -> 'b) -> 'a -> 'b
 | |
| 62 | val mk_acc : typ -> term -> term | |
| 63 | val function_name : string -> string | |
| 64 | val graph_name : string -> string | |
| 65 | val rel_name : string -> string | |
| 66 | val dom_name : string -> string | |
| 67 | val apply_termination_rule : Proof.context -> int -> tactic | |
| 68 | datatype function_result = FunctionResult of | |
| 69 |    {fs: term list,
 | |
| 70 | G: term, | |
| 71 | R: term, | |
| 52384 | 72 | dom: term, | 
| 49965 | 73 | psimps : thm list, | 
| 74 | simple_pinducts : thm list, | |
| 53603 
59ef06cda7b9
generate elim rules for elimination of function equalities;
 Manuel Eberl parents: 
52384diff
changeset | 75 | cases : thm list, | 
| 
59ef06cda7b9
generate elim rules for elimination of function equalities;
 Manuel Eberl parents: 
52384diff
changeset | 76 | pelims : thm list list, | 
| 49965 | 77 | termination : thm, | 
| 78 | domintros : thm list option} | |
| 79 | val transform_function_data : info -> morphism -> info | |
| 80 | val get_function : Proof.context -> (term * info) Item_Net.T | |
| 81 | val import_function_data : term -> Proof.context -> info option | |
| 82 | val import_last_function : Proof.context -> info option | |
| 83 | val add_function_data : info -> Context.generic -> Context.generic | |
| 84 | structure Termination_Simps: NAMED_THMS | |
| 85 | val set_termination_prover : (Proof.context -> tactic) -> Context.generic -> Context.generic | |
| 86 | val get_termination_prover : Proof.context -> tactic | |
| 49979 
4de92b4aa74a
added function store_termination_rule to the signature, as it is used in Nominal2
 Christian Urban <urbanc@in.tum.de> parents: 
49966diff
changeset | 87 | val store_termination_rule : thm -> Context.generic -> Context.generic | 
| 49965 | 88 | datatype function_config = FunctionConfig of | 
| 89 |    {sequential: bool,
 | |
| 90 | default: string option, | |
| 91 | domintros: bool, | |
| 92 | partials: bool} | |
| 93 | val default_config : function_config | |
| 94 | val split_def : Proof.context -> (string -> 'a) -> term -> | |
| 95 | string * (string * typ) list * term list * term list * term | |
| 96 | val check_defs : Proof.context -> ((string * typ) * 'a) list -> term list -> unit | |
| 97 | type fixes = ((string * typ) * mixfix) list | |
| 98 | type 'a spec = (Attrib.binding * 'a list) list | |
| 99 | type preproc = function_config -> Proof.context -> fixes -> term spec -> | |
| 100 | (term list * (thm list -> thm spec) * (thm list -> thm list list) * string list) | |
| 101 | val fname_of : term -> string | |
| 102 | val mk_case_names : int -> string -> int -> string list | |
| 103 | val empty_preproc : (Proof.context -> ((string * typ) * mixfix) list -> term list -> 'c) -> preproc | |
| 104 | val get_preproc: Proof.context -> preproc | |
| 105 | val set_preproc: preproc -> Context.generic -> Context.generic | |
| 106 | val function_parser : function_config -> | |
| 107 | ((function_config * (binding * string option * mixfix) list) * (Attrib.binding * string) list) parser | |
| 108 | end | |
| 109 | ||
| 110 | structure Function_Common : FUNCTION_COMMON = | |
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 111 | struct | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 112 | |
| 34230 | 113 | open Function_Data | 
| 114 | ||
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 115 | local open Function_Lib in | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 116 | |
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 117 | (* Profiling *) | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 118 | val profile = Unsynchronized.ref false; | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 119 | |
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 120 | 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 | 121 | |
| 54295 | 122 | val acc_const_name = @{const_name Wellfounded.accp}
 | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 123 | fun mk_acc domT R = | 
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 124 | 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 | 125 | |
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 126 | val function_name = suffix "C" | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 127 | val graph_name = suffix "_graph" | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 128 | val rel_name = suffix "_rel" | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 129 | val dom_name = suffix "_dom" | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 130 | |
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 131 | (* Termination rules *) | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 132 | |
| 46042 | 133 | (* FIXME just one data slot (record) per program unit *) | 
| 33519 | 134 | structure TerminationRule = Generic_Data | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 135 | ( | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 136 | type T = thm list | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 137 | val empty = [] | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 138 | val extend = I | 
| 33519 | 139 | val merge = Thm.merge_thms | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 140 | ); | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 141 | |
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 142 | val get_termination_rules = TerminationRule.get | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 143 | val store_termination_rule = TerminationRule.map o cons | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 144 | val apply_termination_rule = resolve_tac o get_termination_rules o Context.Proof | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 145 | |
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 146 | |
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 147 | (* Function definition result data *) | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 148 | |
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 149 | datatype function_result = FunctionResult of | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 150 |  {fs: term list,
 | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 151 | G: term, | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 152 | R: term, | 
| 52384 | 153 | dom: term, | 
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 154 | psimps : thm list, | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 155 | simple_pinducts : thm list, | 
| 53603 
59ef06cda7b9
generate elim rules for elimination of function equalities;
 Manuel Eberl parents: 
52384diff
changeset | 156 | cases : thm list, | 
| 
59ef06cda7b9
generate elim rules for elimination of function equalities;
 Manuel Eberl parents: 
52384diff
changeset | 157 | pelims : thm list list, | 
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 158 | termination : thm, | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 159 | domintros : thm list option} | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 160 | |
| 53603 
59ef06cda7b9
generate elim rules for elimination of function equalities;
 Manuel Eberl parents: 
52384diff
changeset | 161 | fun transform_function_data ({add_simps, case_names, fnames, fs, R, dom, psimps, pinducts,
 | 
| 
59ef06cda7b9
generate elim rules for elimination of function equalities;
 Manuel Eberl parents: 
52384diff
changeset | 162 | simps, inducts, termination, defname, is_partial, cases, pelims, elims} : info) phi = | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 163 | let | 
| 45290 | 164 | val term = Morphism.term phi | 
| 165 | val thm = Morphism.thm phi | |
| 166 | val fact = Morphism.fact phi | |
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 167 | val name = Binding.name_of o Morphism.binding phi o Binding.name | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 168 | in | 
| 53603 
59ef06cda7b9
generate elim rules for elimination of function equalities;
 Manuel Eberl parents: 
52384diff
changeset | 169 |       { add_simps = add_simps, case_names = case_names, fnames = fnames,
 | 
| 52384 | 170 | fs = map term fs, R = term R, dom = term dom, psimps = fact psimps, | 
| 34231 | 171 | pinducts = fact pinducts, simps = Option.map fact simps, | 
| 172 | inducts = Option.map fact inducts, termination = thm termination, | |
| 53603 
59ef06cda7b9
generate elim rules for elimination of function equalities;
 Manuel Eberl parents: 
52384diff
changeset | 173 | defname = name defname, is_partial=is_partial, cases = fact cases, | 
| 
59ef06cda7b9
generate elim rules for elimination of function equalities;
 Manuel Eberl parents: 
52384diff
changeset | 174 | elims = Option.map (map fact) elims, pelims = map fact pelims } | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 175 | end | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 176 | |
| 46042 | 177 | (* FIXME just one data slot (record) per program unit *) | 
| 33519 | 178 | structure FunctionData = Generic_Data | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 179 | ( | 
| 34230 | 180 | type T = (term * info) Item_Net.T; | 
| 33373 | 181 | val empty : T = Item_Net.init (op aconv o pairself fst) (single o fst); | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 182 | val extend = I; | 
| 33519 | 183 | fun merge tabs : T = Item_Net.merge tabs; | 
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 184 | ) | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 185 | |
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 186 | val get_function = FunctionData.get o Context.Proof; | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 187 | |
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 188 | fun lift_morphism thy f = | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 189 | let | 
| 46496 
b8920f3fd259
discontinued Drule.term_rule, which tends to cause confusion due to builtin cterm_of (NB: the standard morphisms already provide a separate term component);
 wenzelm parents: 
46042diff
changeset | 190 | fun term t = Thm.term_of (Drule.cterm_rule f (Thm.cterm_of thy t)) | 
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 191 | in | 
| 54740 | 192 | Morphism.morphism "lift_morphism" | 
| 193 |       {binding = [],
 | |
| 194 | typ = [Logic.type_map term], | |
| 195 | term = [term], | |
| 196 | fact = [map f]} | |
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 197 | end | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 198 | |
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 199 | fun import_function_data t ctxt = | 
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 200 | let | 
| 42361 | 201 | val thy = Proof_Context.theory_of ctxt | 
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 202 | val ct = cterm_of thy t | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 203 | val inst_morph = lift_morphism thy o Thm.instantiate | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 204 | |
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 205 | fun match (trm, data) = | 
| 45290 | 206 | SOME (transform_function_data data (inst_morph (Thm.match (cterm_of thy trm, ct)))) | 
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 207 | handle Pattern.MATCH => NONE | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 208 | in | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 209 | get_first match (Item_Net.retrieve (get_function ctxt) t) | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 210 | end | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 211 | |
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 212 | fun import_last_function ctxt = | 
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 213 | case Item_Net.content (get_function ctxt) of | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 214 | [] => NONE | 
| 49966 | 215 | | (t, _) :: _ => | 
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 216 | let | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 217 | val ([t'], ctxt') = Variable.import_terms true [t] ctxt | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 218 | in | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 219 | import_function_data t' ctxt' | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 220 | end | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 221 | |
| 34230 | 222 | fun add_function_data (data : info as {fs, termination, ...}) =
 | 
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 223 | FunctionData.map (fold (fn f => Item_Net.update (f, data)) fs) | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 224 | #> store_termination_rule termination | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 225 | |
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 226 | |
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 227 | (* Simp rules for termination proofs *) | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 228 | |
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 229 | structure Termination_Simps = Named_Thms | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 230 | ( | 
| 45294 | 231 |   val name = @{binding termination_simp}
 | 
| 38764 
e6a18808873c
more uniform descriptions, which end up in the collective output of 'print_attributes' for example;
 wenzelm parents: 
38761diff
changeset | 232 | val description = "simplification rules for termination proofs" | 
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 233 | ) | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 234 | |
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 235 | |
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 236 | (* Default Termination Prover *) | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 237 | |
| 46042 | 238 | (* FIXME just one data slot (record) per program unit *) | 
| 33519 | 239 | structure TerminationProver = Generic_Data | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 240 | ( | 
| 36521 | 241 | type T = Proof.context -> tactic | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 242 | val empty = (fn _ => error "Termination prover not configured") | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 243 | val extend = I | 
| 38761 | 244 | fun merge (a, _) = a | 
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 245 | ) | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 246 | |
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 247 | val set_termination_prover = TerminationProver.put | 
| 49965 | 248 | fun get_termination_prover ctxt = TerminationProver.get (Context.Proof ctxt) ctxt | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 249 | |
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 250 | |
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 251 | (* Configuration management *) | 
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 252 | datatype function_opt | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 253 | = Sequential | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 254 | | Default of string | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 255 | | DomIntros | 
| 33101 | 256 | | No_Partials | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 257 | |
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 258 | datatype function_config = FunctionConfig of | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 259 |  {sequential: bool,
 | 
| 41417 | 260 | default: string option, | 
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 261 | domintros: bool, | 
| 41846 
b368a7aee46a
removed support for tail-recursion from function package (now implemented by partial_function)
 krauss parents: 
41417diff
changeset | 262 | partials: bool} | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 263 | |
| 41846 
b368a7aee46a
removed support for tail-recursion from function package (now implemented by partial_function)
 krauss parents: 
41417diff
changeset | 264 | fun apply_opt Sequential (FunctionConfig {sequential, default, domintros, partials}) =
 | 
| 
b368a7aee46a
removed support for tail-recursion from function package (now implemented by partial_function)
 krauss parents: 
41417diff
changeset | 265 |     FunctionConfig {sequential=true, default=default, domintros=domintros, partials=partials}
 | 
| 
b368a7aee46a
removed support for tail-recursion from function package (now implemented by partial_function)
 krauss parents: 
41417diff
changeset | 266 |   | apply_opt (Default d) (FunctionConfig {sequential, default, domintros, partials}) =
 | 
| 
b368a7aee46a
removed support for tail-recursion from function package (now implemented by partial_function)
 krauss parents: 
41417diff
changeset | 267 |     FunctionConfig {sequential=sequential, default=SOME d, domintros=domintros, partials=partials}
 | 
| 
b368a7aee46a
removed support for tail-recursion from function package (now implemented by partial_function)
 krauss parents: 
41417diff
changeset | 268 |   | apply_opt DomIntros (FunctionConfig {sequential, default, domintros, partials}) =
 | 
| 
b368a7aee46a
removed support for tail-recursion from function package (now implemented by partial_function)
 krauss parents: 
41417diff
changeset | 269 |     FunctionConfig {sequential=sequential, default=default, domintros=true, partials=partials}
 | 
| 
b368a7aee46a
removed support for tail-recursion from function package (now implemented by partial_function)
 krauss parents: 
41417diff
changeset | 270 |   | apply_opt No_Partials (FunctionConfig {sequential, default, domintros, partials}) =
 | 
| 
b368a7aee46a
removed support for tail-recursion from function package (now implemented by partial_function)
 krauss parents: 
41417diff
changeset | 271 |     FunctionConfig {sequential=sequential, default=default, domintros=domintros, partials=false}
 | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 272 | |
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 273 | val default_config = | 
| 41417 | 274 |   FunctionConfig { sequential=false, default=NONE,
 | 
| 41846 
b368a7aee46a
removed support for tail-recursion from function package (now implemented by partial_function)
 krauss parents: 
41417diff
changeset | 275 | domintros=false, partials=true} | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 276 | |
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 277 | |
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 278 | (* Analyzing function equations *) | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 279 | |
| 39276 
2ad95934521f
improved error message for common mistake (fun f where "g x = ...")
 krauss parents: 
39134diff
changeset | 280 | fun split_def ctxt check_head geq = | 
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 281 | let | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 282 | fun input_error msg = cat_lines [msg, Syntax.string_of_term ctxt geq] | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 283 | val qs = Term.strip_qnt_vars "all" geq | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 284 | val imp = Term.strip_qnt_body "all" geq | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 285 | val (gs, eq) = Logic.strip_horn imp | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 286 | |
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 287 | val (f_args, rhs) = HOLogic.dest_eq (HOLogic.dest_Trueprop eq) | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 288 | handle TERM _ => error (input_error "Not an equation") | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 289 | |
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 290 | val (head, args) = strip_comb f_args | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 291 | |
| 39276 
2ad95934521f
improved error message for common mistake (fun f where "g x = ...")
 krauss parents: 
39134diff
changeset | 292 | val fname = fst (dest_Free head) handle TERM _ => "" | 
| 
2ad95934521f
improved error message for common mistake (fun f where "g x = ...")
 krauss parents: 
39134diff
changeset | 293 | val _ = check_head fname | 
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 294 | in | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 295 | (fname, qs, gs, args, rhs) | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 296 | end | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 297 | |
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 298 | (* Check for all sorts of errors in the input *) | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 299 | fun check_defs ctxt fixes eqs = | 
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 300 | let | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 301 | val fnames = map (fst o fst) fixes | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 302 | |
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 303 | fun check geq = | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 304 | let | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 305 | fun input_error msg = error (cat_lines [msg, Syntax.string_of_term ctxt geq]) | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 306 | |
| 39276 
2ad95934521f
improved error message for common mistake (fun f where "g x = ...")
 krauss parents: 
39134diff
changeset | 307 | fun check_head fname = | 
| 
2ad95934521f
improved error message for common mistake (fun f where "g x = ...")
 krauss parents: 
39134diff
changeset | 308 | member (op =) fnames fname orelse | 
| 
2ad95934521f
improved error message for common mistake (fun f where "g x = ...")
 krauss parents: 
39134diff
changeset | 309 |           input_error ("Illegal equation head. Expected " ^ commas_quote fnames)
 | 
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 310 | |
| 39276 
2ad95934521f
improved error message for common mistake (fun f where "g x = ...")
 krauss parents: 
39134diff
changeset | 311 | val (fname, qs, gs, args, rhs) = split_def ctxt check_head geq | 
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 312 | |
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 313 | val _ = length args > 0 orelse input_error "Function has no arguments:" | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 314 | |
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 315 | fun add_bvs t is = add_loose_bnos (t, 0, is) | 
| 42081 | 316 | val rvs = (subtract (op =) (fold add_bvs args []) (add_bvs rhs [])) | 
| 317 | |> map (fst o nth (rev qs)) | |
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 318 | |
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 319 | val _ = null rvs orelse input_error | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 320 |           ("Variable" ^ plural " " "s " rvs ^ commas_quote rvs ^
 | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 321 | " occur" ^ plural "s" "" rvs ^ " on right hand side only:") | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 322 | |
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 323 | val _ = forall (not o Term.exists_subterm | 
| 36692 
54b64d4ad524
farewell to old-style mem infixes -- type inference in situations with mem_int and mem_string should provide enough information to resolve the type of (op =)
 haftmann parents: 
36521diff
changeset | 324 | (fn Free (n, _) => member (op =) fnames n | _ => false)) (gs @ args) | 
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 325 | orelse input_error "Defined function may not occur in premises or arguments" | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 326 | |
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 327 | val freeargs = map (fn t => subst_bounds (rev (map Free qs), t)) args | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 328 | val funvars = filter (fn q => exists (exists_subterm (fn (Free q') $ _ => q = q' | _ => false)) freeargs) qs | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 329 | val _ = null funvars orelse (warning (cat_lines | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 330 | ["Bound variable" ^ plural " " "s " funvars ^ | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 331 | commas_quote (map fst funvars) ^ " occur" ^ plural "s" "" funvars ^ | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 332 | " in function position.", "Misspelled constructor???"]); true) | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 333 | in | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 334 | (fname, length args) | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 335 | end | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 336 | |
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 337 | val grouped_args = AList.group (op =) (map check eqs) | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 338 | val _ = grouped_args | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 339 | |> map (fn (fname, ars) => | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 340 | length (distinct (op =) ars) = 1 | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 341 |         orelse error ("Function " ^ quote fname ^
 | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 342 | " has different numbers of arguments in different equations")) | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 343 | |
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 344 | val not_defined = subtract (op =) (map fst grouped_args) fnames | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 345 | val _ = null not_defined | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 346 |       orelse error ("No defining equations for function" ^
 | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 347 | plural " " "s " not_defined ^ commas_quote not_defined) | 
| 33751 
7ead0ccf6cbd
check if equations are present for all functions to avoid low-level exception later
 krauss parents: 
33519diff
changeset | 348 | |
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 349 | fun check_sorts ((fname, fT), _) = | 
| 42361 | 350 | Sorts.of_sort (Sign.classes_of (Proof_Context.theory_of ctxt)) (fT, HOLogic.typeS) | 
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 351 | orelse error (cat_lines | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 352 | ["Type of " ^ quote fname ^ " is not of sort " ^ quote "type" ^ ":", | 
| 39134 
917b4b6ba3d2
turned show_sorts/show_types into proper configuration options;
 wenzelm parents: 
38764diff
changeset | 353 | Syntax.string_of_typ (Config.put show_sorts true ctxt) fT]) | 
| 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: 
34231diff
changeset | 355 | val _ = map check_sorts fixes | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 356 | in | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 357 | () | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 358 | end | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 359 | |
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 360 | (* Preprocessors *) | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 361 | |
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 362 | type fixes = ((string * typ) * mixfix) list | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 363 | type 'a spec = (Attrib.binding * 'a list) list | 
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 364 | type preproc = function_config -> Proof.context -> fixes -> term spec -> | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 365 | (term list * (thm list -> thm spec) * (thm list -> thm list list) * string list) | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 366 | |
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 367 | val fname_of = fst o dest_Free o fst o strip_comb o fst o HOLogic.dest_eq o | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 368 | HOLogic.dest_Trueprop o Logic.strip_imp_concl o snd o dest_all_all | 
| 33099 
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 | fun mk_case_names i "" k = mk_case_names i (string_of_int (i + 1)) k | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 371 | | mk_case_names _ n 0 = [] | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 372 | | mk_case_names _ n 1 = [n] | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 373 | | mk_case_names _ n k = map (fn i => n ^ "_" ^ string_of_int i) (1 upto k) | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 374 | |
| 49965 | 375 | fun empty_preproc check (_: function_config) (ctxt: Proof.context) (fixes: fixes) spec = | 
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 376 | let | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 377 | val (bnds, tss) = split_list spec | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 378 | val ts = flat tss | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 379 | val _ = check ctxt fixes ts | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 380 | val fnames = map (fst o fst) fixes | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 381 | val indices = map (fn eq => find_index (curry op = (fname_of eq)) fnames) ts | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 382 | |
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 383 | fun sort xs = partition_list (fn i => fn (j,_) => i = j) 0 (length fnames - 1) | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 384 | (indices ~~ xs) |> map (map snd) | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 385 | |
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 386 | (* using theorem names for case name currently disabled *) | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 387 | val cnames = map_index (fn (i, _) => mk_case_names i "" 1) bnds |> flat | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 388 | in | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 389 | (ts, curry op ~~ bnds o Library.unflat tss, sort, cnames) | 
| 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 390 | end | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 391 | |
| 46042 | 392 | (* FIXME just one data slot (record) per program unit *) | 
| 33519 | 393 | structure Preprocessor = Generic_Data | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 394 | ( | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 395 | type T = preproc | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 396 | val empty : T = empty_preproc check_defs | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 397 | val extend = I | 
| 33519 | 398 | fun merge (a, _) = a | 
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 399 | ) | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 400 | |
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 401 | val get_preproc = Preprocessor.get o Context.Proof | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 402 | val set_preproc = Preprocessor.map o K | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 403 | |
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 404 | |
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 405 | |
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 406 | local | 
| 44357 | 407 | val option_parser = Parse.group (fn () => "option") | 
| 36960 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36954diff
changeset | 408 | ((Parse.reserved "sequential" >> K Sequential) | 
| 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36954diff
changeset | 409 | || ((Parse.reserved "default" |-- Parse.term) >> Default) | 
| 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36954diff
changeset | 410 | || (Parse.reserved "domintros" >> K DomIntros) | 
| 41846 
b368a7aee46a
removed support for tail-recursion from function package (now implemented by partial_function)
 krauss parents: 
41417diff
changeset | 411 | || (Parse.reserved "no_partials" >> K No_Partials)) | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 412 | |
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 413 | fun config_parser default = | 
| 46949 | 414 |     (Scan.optional (@{keyword "("} |-- Parse.!!! (Parse.list1 option_parser) --| @{keyword ")"}) [])
 | 
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 415 | >> (fn opts => fold apply_opt opts default) | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 416 | in | 
| 34232 
36a2a3029fd3
new year's resolution: reindented code in function package
 krauss parents: 
34231diff
changeset | 417 | fun function_parser default_cfg = | 
| 36960 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36954diff
changeset | 418 | config_parser default_cfg -- Parse.fixes -- Parse_Spec.where_alt_specs | 
| 33099 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 419 | end | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 420 | |
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 421 | |
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 422 | end | 
| 
b8cdd3d73022
function package: more standard names for structures and files
 krauss parents: diff
changeset | 423 | end |