src/HOL/Tools/Function/fundef_common.ML
author wenzelm
Thu, 02 Jul 2009 17:34:14 +0200
changeset 31902 862ae16a799d
parent 31775 2b04504fcb69
child 32603 e08fdd615333
permissions -rw-r--r--
renamed NamedThmsFun to Named_Thms; simplified/unified names of instances of Named_Thms;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
31775
2b04504fcb69 uniformly capitialized names for subdirectories
haftmann
parents: 30906
diff changeset
     1
(*  Title:      HOL/Tools/Function/fundef_common.ML
19564
d3e2f532459a First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff changeset
     2
    Author:     Alexander Krauss, TU Muenchen
d3e2f532459a First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff changeset
     3
d3e2f532459a First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff changeset
     4
A package for general recursive function definitions. 
23203
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
     5
Common definitions and other infrastructure.
19564
d3e2f532459a First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff changeset
     6
*)
d3e2f532459a First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff changeset
     7
d3e2f532459a First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff changeset
     8
structure FundefCommon =
d3e2f532459a First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff changeset
     9
struct
d3e2f532459a First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff changeset
    10
23215
20b5558a5419 local open FundefLib;
wenzelm
parents: 23206
diff changeset
    11
local open FundefLib in
20b5558a5419 local open FundefLib;
wenzelm
parents: 23206
diff changeset
    12
22498
62cdd4b3e96b made function syntax strict, requiring | to separate equations; cleanup
krauss
parents: 22279
diff changeset
    13
(* Profiling *)
21255
617fdb08abe9 added profiling code, improved handling of proof terms, generation of domain
krauss
parents: 21237
diff changeset
    14
val profile = ref false;
617fdb08abe9 added profiling code, improved handling of proof terms, generation of domain
krauss
parents: 21237
diff changeset
    15
617fdb08abe9 added profiling code, improved handling of proof terms, generation of domain
krauss
parents: 21237
diff changeset
    16
fun PROFILE msg = if !profile then timeap_msg msg else I
617fdb08abe9 added profiling code, improved handling of proof terms, generation of domain
krauss
parents: 21237
diff changeset
    17
22498
62cdd4b3e96b made function syntax strict, requiring | to separate equations; cleanup
krauss
parents: 22279
diff changeset
    18
26748
4d51ddd6aa5c Merged theories about wellfoundedness into one: Wellfounded.thy
krauss
parents: 26529
diff changeset
    19
val acc_const_name = @{const_name "accp"}
20523
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20289
diff changeset
    20
fun mk_acc domT R =
22733
0b14bb35be90 definition lookup via terms, not names. Methods "relation" and "lexicographic_order"
krauss
parents: 22623
diff changeset
    21
    Const (acc_const_name, (domT --> domT --> HOLogic.boolT) --> domT --> HOLogic.boolT) $ R 
19564
d3e2f532459a First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff changeset
    22
21319
cf814e36f788 replaced "auto_term" by the simpler method "relation", which does not try
krauss
parents: 21255
diff changeset
    23
val function_name = suffix "C"
cf814e36f788 replaced "auto_term" by the simpler method "relation", which does not try
krauss
parents: 21255
diff changeset
    24
val graph_name = suffix "_graph"
cf814e36f788 replaced "auto_term" by the simpler method "relation", which does not try
krauss
parents: 21255
diff changeset
    25
val rel_name = suffix "_rel"
cf814e36f788 replaced "auto_term" by the simpler method "relation", which does not try
krauss
parents: 21255
diff changeset
    26
val dom_name = suffix "_dom"
cf814e36f788 replaced "auto_term" by the simpler method "relation", which does not try
krauss
parents: 21255
diff changeset
    27
28287
c86fa4e0aedb termination prover for "fun" can be configured using context data.
krauss
parents: 28083
diff changeset
    28
(* Termination rules *)
c86fa4e0aedb termination prover for "fun" can be configured using context data.
krauss
parents: 28083
diff changeset
    29
c86fa4e0aedb termination prover for "fun" can be configured using context data.
krauss
parents: 28083
diff changeset
    30
structure TerminationRule = GenericDataFun
c86fa4e0aedb termination prover for "fun" can be configured using context data.
krauss
parents: 28083
diff changeset
    31
(
c86fa4e0aedb termination prover for "fun" can be configured using context data.
krauss
parents: 28083
diff changeset
    32
  type T = thm list
c86fa4e0aedb termination prover for "fun" can be configured using context data.
krauss
parents: 28083
diff changeset
    33
  val empty = []
c86fa4e0aedb termination prover for "fun" can be configured using context data.
krauss
parents: 28083
diff changeset
    34
  val extend = I
c86fa4e0aedb termination prover for "fun" can be configured using context data.
krauss
parents: 28083
diff changeset
    35
  fun merge _ = Thm.merge_thms
c86fa4e0aedb termination prover for "fun" can be configured using context data.
krauss
parents: 28083
diff changeset
    36
);
c86fa4e0aedb termination prover for "fun" can be configured using context data.
krauss
parents: 28083
diff changeset
    37
c86fa4e0aedb termination prover for "fun" can be configured using context data.
krauss
parents: 28083
diff changeset
    38
val get_termination_rules = TerminationRule.get
c86fa4e0aedb termination prover for "fun" can be configured using context data.
krauss
parents: 28083
diff changeset
    39
val store_termination_rule = TerminationRule.map o cons
c86fa4e0aedb termination prover for "fun" can be configured using context data.
krauss
parents: 28083
diff changeset
    40
val apply_termination_rule = resolve_tac o get_termination_rules o Context.Proof
c86fa4e0aedb termination prover for "fun" can be configured using context data.
krauss
parents: 28083
diff changeset
    41
c86fa4e0aedb termination prover for "fun" can be configured using context data.
krauss
parents: 28083
diff changeset
    42
c86fa4e0aedb termination prover for "fun" can be configured using context data.
krauss
parents: 28083
diff changeset
    43
(* Function definition result data *)
19564
d3e2f532459a First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff changeset
    44
19583
c5fa77b03442 function-package: Changed record usage to make sml/nj happy...
krauss
parents: 19564
diff changeset
    45
datatype fundef_result =
c5fa77b03442 function-package: Changed record usage to make sml/nj happy...
krauss
parents: 19564
diff changeset
    46
  FundefResult of
19564
d3e2f532459a First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff changeset
    47
     {
22733
0b14bb35be90 definition lookup via terms, not names. Methods "relation" and "lexicographic_order"
krauss
parents: 22623
diff changeset
    48
      fs: term list,
20523
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20289
diff changeset
    49
      G: term,
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20289
diff changeset
    50
      R: term,
19770
be5c23ebe1eb HOL/Tools/function_package: Added support for mutual recursive definitions.
krauss
parents: 19617
diff changeset
    51
20523
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20289
diff changeset
    52
      psimps : thm list, 
22166
0a50d4db234a * Preliminary implementation of tail recursion
krauss
parents: 21835
diff changeset
    53
      trsimps : thm list option, 
0a50d4db234a * Preliminary implementation of tail recursion
krauss
parents: 21835
diff changeset
    54
19770
be5c23ebe1eb HOL/Tools/function_package: Added support for mutual recursive definitions.
krauss
parents: 19617
diff changeset
    55
      simple_pinducts : thm list, 
be5c23ebe1eb HOL/Tools/function_package: Added support for mutual recursive definitions.
krauss
parents: 19617
diff changeset
    56
      cases : thm,
be5c23ebe1eb HOL/Tools/function_package: Added support for mutual recursive definitions.
krauss
parents: 19617
diff changeset
    57
      termination : thm,
22166
0a50d4db234a * Preliminary implementation of tail recursion
krauss
parents: 21835
diff changeset
    58
      domintros : thm list option
19770
be5c23ebe1eb HOL/Tools/function_package: Added support for mutual recursive definitions.
krauss
parents: 19617
diff changeset
    59
     }
be5c23ebe1eb HOL/Tools/function_package: Added support for mutual recursive definitions.
krauss
parents: 19617
diff changeset
    60
22733
0b14bb35be90 definition lookup via terms, not names. Methods "relation" and "lexicographic_order"
krauss
parents: 22623
diff changeset
    61
21255
617fdb08abe9 added profiling code, improved handling of proof terms, generation of domain
krauss
parents: 21237
diff changeset
    62
datatype fundef_context_data =
617fdb08abe9 added profiling code, improved handling of proof terms, generation of domain
krauss
parents: 21237
diff changeset
    63
  FundefCtxData of
617fdb08abe9 added profiling code, improved handling of proof terms, generation of domain
krauss
parents: 21237
diff changeset
    64
     {
22733
0b14bb35be90 definition lookup via terms, not names. Methods "relation" and "lexicographic_order"
krauss
parents: 22623
diff changeset
    65
      defname : string,
0b14bb35be90 definition lookup via terms, not names. Methods "relation" and "lexicographic_order"
krauss
parents: 22623
diff changeset
    66
23819
2040846d1bbe some interface cleanup
krauss
parents: 23766
diff changeset
    67
      (* contains no logical entities: invariant under morphisms *)
30790
350bb108406d bstring -> binding
krauss
parents: 30787
diff changeset
    68
      add_simps : (binding -> binding) -> string -> Attrib.src list -> thm list 
26529
03ad378ed5f0 Function package no longer overwrites theorems.
krauss
parents: 25558
diff changeset
    69
                  -> local_theory -> thm list * local_theory,
25222
78943ac46f6d fun/function: generate case names for induction rules
krauss
parents: 25201
diff changeset
    70
      case_names : string list,
19770
be5c23ebe1eb HOL/Tools/function_package: Added support for mutual recursive definitions.
krauss
parents: 19617
diff changeset
    71
22733
0b14bb35be90 definition lookup via terms, not names. Methods "relation" and "lexicographic_order"
krauss
parents: 22623
diff changeset
    72
      fs : term list,
21255
617fdb08abe9 added profiling code, improved handling of proof terms, generation of domain
krauss
parents: 21237
diff changeset
    73
      R : term,
617fdb08abe9 added profiling code, improved handling of proof terms, generation of domain
krauss
parents: 21237
diff changeset
    74
      
617fdb08abe9 added profiling code, improved handling of proof terms, generation of domain
krauss
parents: 21237
diff changeset
    75
      psimps: thm list,
617fdb08abe9 added profiling code, improved handling of proof terms, generation of domain
krauss
parents: 21237
diff changeset
    76
      pinducts: thm list,
617fdb08abe9 added profiling code, improved handling of proof terms, generation of domain
krauss
parents: 21237
diff changeset
    77
      termination: thm
617fdb08abe9 added profiling code, improved handling of proof terms, generation of domain
krauss
parents: 21237
diff changeset
    78
     }
617fdb08abe9 added profiling code, improved handling of proof terms, generation of domain
krauss
parents: 21237
diff changeset
    79
25222
78943ac46f6d fun/function: generate case names for induction rules
krauss
parents: 25201
diff changeset
    80
fun morph_fundef_data (FundefCtxData {add_simps, case_names, fs, R, 
78943ac46f6d fun/function: generate case names for induction rules
krauss
parents: 25201
diff changeset
    81
                                      psimps, pinducts, termination, defname}) phi =
22623
5fcee5b319a2 proper handling of morphisms
krauss
parents: 22498
diff changeset
    82
    let
22733
0b14bb35be90 definition lookup via terms, not names. Methods "relation" and "lexicographic_order"
krauss
parents: 22623
diff changeset
    83
      val term = Morphism.term phi val thm = Morphism.thm phi val fact = Morphism.fact phi
30223
24d975352879 renamed Binding.name_pos to Binding.make, renamed Binding.base_name to Binding.name_of, renamed Binding.map_base to Binding.map_name, added mandatory flag to Binding.qualify;
wenzelm
parents: 29922
diff changeset
    84
      val name = Binding.name_of o Morphism.binding phi o Binding.name
22623
5fcee5b319a2 proper handling of morphisms
krauss
parents: 22498
diff changeset
    85
    in
25222
78943ac46f6d fun/function: generate case names for induction rules
krauss
parents: 25201
diff changeset
    86
      FundefCtxData { add_simps = add_simps, case_names = case_names,
22733
0b14bb35be90 definition lookup via terms, not names. Methods "relation" and "lexicographic_order"
krauss
parents: 22623
diff changeset
    87
                      fs = map term fs, R = term R, psimps = fact psimps, 
0b14bb35be90 definition lookup via terms, not names. Methods "relation" and "lexicographic_order"
krauss
parents: 22623
diff changeset
    88
                      pinducts = fact pinducts, termination = thm termination,
0b14bb35be90 definition lookup via terms, not names. Methods "relation" and "lexicographic_order"
krauss
parents: 22623
diff changeset
    89
                      defname = name defname }
22623
5fcee5b319a2 proper handling of morphisms
krauss
parents: 22498
diff changeset
    90
    end
5fcee5b319a2 proper handling of morphisms
krauss
parents: 22498
diff changeset
    91
20523
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20289
diff changeset
    92
structure FundefData = GenericDataFun
22846
fb79144af9a3 simplified DataFun interfaces;
wenzelm
parents: 22760
diff changeset
    93
(
30560
0cc3b7f03ade adapted to general Item_Net;
wenzelm
parents: 30510
diff changeset
    94
  type T = (term * fundef_context_data) Item_Net.T;
0cc3b7f03ade adapted to general Item_Net;
wenzelm
parents: 30510
diff changeset
    95
  val empty = Item_Net.init
22760
6eafeffe801c repaired value restriction problem
haftmann
parents: 22733
diff changeset
    96
    (op aconv o pairself fst : (term * fundef_context_data) * (term * fundef_context_data) -> bool)
6eafeffe801c repaired value restriction problem
haftmann
parents: 22733
diff changeset
    97
    fst;
19564
d3e2f532459a First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff changeset
    98
  val copy = I;
d3e2f532459a First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff changeset
    99
  val extend = I;
30560
0cc3b7f03ade adapted to general Item_Net;
wenzelm
parents: 30510
diff changeset
   100
  fun merge _ (tab1, tab2) = Item_Net.merge (tab1, tab2)
22846
fb79144af9a3 simplified DataFun interfaces;
wenzelm
parents: 22760
diff changeset
   101
);
19564
d3e2f532459a First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff changeset
   102
30492
cb7e886e4b10 get data from plain Proof.context;
wenzelm
parents: 30486
diff changeset
   103
val get_fundef = FundefData.get o Context.Proof;
cb7e886e4b10 get data from plain Proof.context;
wenzelm
parents: 30486
diff changeset
   104
19564
d3e2f532459a First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff changeset
   105
22733
0b14bb35be90 definition lookup via terms, not names. Methods "relation" and "lexicographic_order"
krauss
parents: 22623
diff changeset
   106
(* Generally useful?? *)
0b14bb35be90 definition lookup via terms, not names. Methods "relation" and "lexicographic_order"
krauss
parents: 22623
diff changeset
   107
fun lift_morphism thy f = 
0b14bb35be90 definition lookup via terms, not names. Methods "relation" and "lexicographic_order"
krauss
parents: 22623
diff changeset
   108
    let 
0b14bb35be90 definition lookup via terms, not names. Methods "relation" and "lexicographic_order"
krauss
parents: 22623
diff changeset
   109
      val term = Drule.term_rule thy f
0b14bb35be90 definition lookup via terms, not names. Methods "relation" and "lexicographic_order"
krauss
parents: 22623
diff changeset
   110
    in
28883
0f5b1accfb94 improved error msg; tuned
krauss
parents: 28524
diff changeset
   111
      Morphism.thm_morphism f $> Morphism.term_morphism term 
0f5b1accfb94 improved error msg; tuned
krauss
parents: 28524
diff changeset
   112
       $> Morphism.typ_morphism (Logic.type_map term)
22733
0b14bb35be90 definition lookup via terms, not names. Methods "relation" and "lexicographic_order"
krauss
parents: 22623
diff changeset
   113
    end
0b14bb35be90 definition lookup via terms, not names. Methods "relation" and "lexicographic_order"
krauss
parents: 22623
diff changeset
   114
0b14bb35be90 definition lookup via terms, not names. Methods "relation" and "lexicographic_order"
krauss
parents: 22623
diff changeset
   115
fun import_fundef_data t ctxt =
0b14bb35be90 definition lookup via terms, not names. Methods "relation" and "lexicographic_order"
krauss
parents: 22623
diff changeset
   116
    let
30492
cb7e886e4b10 get data from plain Proof.context;
wenzelm
parents: 30486
diff changeset
   117
      val thy = ProofContext.theory_of ctxt
22733
0b14bb35be90 definition lookup via terms, not names. Methods "relation" and "lexicographic_order"
krauss
parents: 22623
diff changeset
   118
      val ct = cterm_of thy t
0b14bb35be90 definition lookup via terms, not names. Methods "relation" and "lexicographic_order"
krauss
parents: 22623
diff changeset
   119
      val inst_morph = lift_morphism thy o Thm.instantiate 
19564
d3e2f532459a First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff changeset
   120
25201
e6fe58b640ce print the defined constants when finished; tuned
krauss
parents: 25045
diff changeset
   121
      fun match (trm, data) = 
e6fe58b640ce print the defined constants when finished; tuned
krauss
parents: 25045
diff changeset
   122
          SOME (morph_fundef_data data (inst_morph (Thm.match (cterm_of thy trm, ct))))
22733
0b14bb35be90 definition lookup via terms, not names. Methods "relation" and "lexicographic_order"
krauss
parents: 22623
diff changeset
   123
          handle Pattern.MATCH => NONE
0b14bb35be90 definition lookup via terms, not names. Methods "relation" and "lexicographic_order"
krauss
parents: 22623
diff changeset
   124
    in 
30560
0cc3b7f03ade adapted to general Item_Net;
wenzelm
parents: 30510
diff changeset
   125
      get_first match (Item_Net.retrieve (get_fundef ctxt) t)
22733
0b14bb35be90 definition lookup via terms, not names. Methods "relation" and "lexicographic_order"
krauss
parents: 22623
diff changeset
   126
    end
19564
d3e2f532459a First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff changeset
   127
22733
0b14bb35be90 definition lookup via terms, not names. Methods "relation" and "lexicographic_order"
krauss
parents: 22623
diff changeset
   128
fun import_last_fundef ctxt =
30560
0cc3b7f03ade adapted to general Item_Net;
wenzelm
parents: 30510
diff changeset
   129
    case Item_Net.content (get_fundef ctxt) of
22733
0b14bb35be90 definition lookup via terms, not names. Methods "relation" and "lexicographic_order"
krauss
parents: 22623
diff changeset
   130
      [] => NONE
0b14bb35be90 definition lookup via terms, not names. Methods "relation" and "lexicographic_order"
krauss
parents: 22623
diff changeset
   131
    | (t, data) :: _ =>
0b14bb35be90 definition lookup via terms, not names. Methods "relation" and "lexicographic_order"
krauss
parents: 22623
diff changeset
   132
      let 
30492
cb7e886e4b10 get data from plain Proof.context;
wenzelm
parents: 30486
diff changeset
   133
        val ([t'], ctxt') = Variable.import_terms true [t] ctxt
22733
0b14bb35be90 definition lookup via terms, not names. Methods "relation" and "lexicographic_order"
krauss
parents: 22623
diff changeset
   134
      in
30492
cb7e886e4b10 get data from plain Proof.context;
wenzelm
parents: 30486
diff changeset
   135
        import_fundef_data t' ctxt'
22733
0b14bb35be90 definition lookup via terms, not names. Methods "relation" and "lexicographic_order"
krauss
parents: 22623
diff changeset
   136
      end
19564
d3e2f532459a First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff changeset
   137
30560
0cc3b7f03ade adapted to general Item_Net;
wenzelm
parents: 30510
diff changeset
   138
val all_fundef_data = Item_Net.content o get_fundef
21319
cf814e36f788 replaced "auto_term" by the simpler method "relation", which does not try
krauss
parents: 21255
diff changeset
   139
28287
c86fa4e0aedb termination prover for "fun" can be configured using context data.
krauss
parents: 28083
diff changeset
   140
fun add_fundef_data (data as FundefCtxData {fs, termination, ...}) =
30560
0cc3b7f03ade adapted to general Item_Net;
wenzelm
parents: 30510
diff changeset
   141
    FundefData.map (fold (fn f => Item_Net.insert (f, data)) fs)
28287
c86fa4e0aedb termination prover for "fun" can be configured using context data.
krauss
parents: 28083
diff changeset
   142
    #> store_termination_rule termination
c86fa4e0aedb termination prover for "fun" can be configured using context data.
krauss
parents: 28083
diff changeset
   143
c86fa4e0aedb termination prover for "fun" can be configured using context data.
krauss
parents: 28083
diff changeset
   144
c86fa4e0aedb termination prover for "fun" can be configured using context data.
krauss
parents: 28083
diff changeset
   145
(* Simp rules for termination proofs *)
c86fa4e0aedb termination prover for "fun" can be configured using context data.
krauss
parents: 28083
diff changeset
   146
31902
862ae16a799d renamed NamedThmsFun to Named_Thms;
wenzelm
parents: 31775
diff changeset
   147
structure Termination_Simps = Named_Thms
26989
9b2acb536228 uniform treatment of target, not as config;
wenzelm
parents: 26749
diff changeset
   148
(
26749
397a1aeede7d * New attribute "termination_simp": Simp rules for termination proofs
krauss
parents: 26748
diff changeset
   149
  val name = "termination_simp" 
397a1aeede7d * New attribute "termination_simp": Simp rules for termination proofs
krauss
parents: 26748
diff changeset
   150
  val description = "Simplification rule for termination proofs"
397a1aeede7d * New attribute "termination_simp": Simp rules for termination proofs
krauss
parents: 26748
diff changeset
   151
);
397a1aeede7d * New attribute "termination_simp": Simp rules for termination proofs
krauss
parents: 26748
diff changeset
   152
28287
c86fa4e0aedb termination prover for "fun" can be configured using context data.
krauss
parents: 28083
diff changeset
   153
c86fa4e0aedb termination prover for "fun" can be configured using context data.
krauss
parents: 28083
diff changeset
   154
(* Default Termination Prover *)
c86fa4e0aedb termination prover for "fun" can be configured using context data.
krauss
parents: 28083
diff changeset
   155
c86fa4e0aedb termination prover for "fun" can be configured using context data.
krauss
parents: 28083
diff changeset
   156
structure TerminationProver = GenericDataFun
22846
fb79144af9a3 simplified DataFun interfaces;
wenzelm
parents: 22760
diff changeset
   157
(
30510
4120fc59dd85 unified type Proof.method and pervasive METHOD combinators;
wenzelm
parents: 30492
diff changeset
   158
  type T = Proof.context -> Proof.method
28287
c86fa4e0aedb termination prover for "fun" can be configured using context data.
krauss
parents: 28083
diff changeset
   159
  val empty = (fn _ => error "Termination prover not configured")
22846
fb79144af9a3 simplified DataFun interfaces;
wenzelm
parents: 22760
diff changeset
   160
  val extend = I
28287
c86fa4e0aedb termination prover for "fun" can be configured using context data.
krauss
parents: 28083
diff changeset
   161
  fun merge _ (a,b) = b (* FIXME *)
22846
fb79144af9a3 simplified DataFun interfaces;
wenzelm
parents: 22760
diff changeset
   162
);
21319
cf814e36f788 replaced "auto_term" by the simpler method "relation", which does not try
krauss
parents: 21255
diff changeset
   163
28287
c86fa4e0aedb termination prover for "fun" can be configured using context data.
krauss
parents: 28083
diff changeset
   164
val set_termination_prover = TerminationProver.put
30492
cb7e886e4b10 get data from plain Proof.context;
wenzelm
parents: 30486
diff changeset
   165
val get_termination_prover = TerminationProver.get o Context.Proof
22733
0b14bb35be90 definition lookup via terms, not names. Methods "relation" and "lexicographic_order"
krauss
parents: 22623
diff changeset
   166
21319
cf814e36f788 replaced "auto_term" by the simpler method "relation", which does not try
krauss
parents: 21255
diff changeset
   167
20654
d80502f0d701 1. Function package accepts a parameter (default "some_term"), which specifies the functions
krauss
parents: 20523
diff changeset
   168
(* Configuration management *)
d80502f0d701 1. Function package accepts a parameter (default "some_term"), which specifies the functions
krauss
parents: 20523
diff changeset
   169
datatype fundef_opt 
d80502f0d701 1. Function package accepts a parameter (default "some_term"), which specifies the functions
krauss
parents: 20523
diff changeset
   170
  = Sequential
d80502f0d701 1. Function package accepts a parameter (default "some_term"), which specifies the functions
krauss
parents: 20523
diff changeset
   171
  | Default of string
21319
cf814e36f788 replaced "auto_term" by the simpler method "relation", which does not try
krauss
parents: 21255
diff changeset
   172
  | DomIntros
22166
0a50d4db234a * Preliminary implementation of tail recursion
krauss
parents: 21835
diff changeset
   173
  | Tailrec
20654
d80502f0d701 1. Function package accepts a parameter (default "some_term"), which specifies the functions
krauss
parents: 20523
diff changeset
   174
d80502f0d701 1. Function package accepts a parameter (default "some_term"), which specifies the functions
krauss
parents: 20523
diff changeset
   175
datatype fundef_config
d80502f0d701 1. Function package accepts a parameter (default "some_term"), which specifies the functions
krauss
parents: 20523
diff changeset
   176
  = FundefConfig of
d80502f0d701 1. Function package accepts a parameter (default "some_term"), which specifies the functions
krauss
parents: 20523
diff changeset
   177
   {
d80502f0d701 1. Function package accepts a parameter (default "some_term"), which specifies the functions
krauss
parents: 20523
diff changeset
   178
    sequential: bool,
d80502f0d701 1. Function package accepts a parameter (default "some_term"), which specifies the functions
krauss
parents: 20523
diff changeset
   179
    default: string,
22166
0a50d4db234a * Preliminary implementation of tail recursion
krauss
parents: 21835
diff changeset
   180
    domintros: bool,
0a50d4db234a * Preliminary implementation of tail recursion
krauss
parents: 21835
diff changeset
   181
    tailrec: bool
20654
d80502f0d701 1. Function package accepts a parameter (default "some_term"), which specifies the functions
krauss
parents: 20523
diff changeset
   182
   }
d80502f0d701 1. Function package accepts a parameter (default "some_term"), which specifies the functions
krauss
parents: 20523
diff changeset
   183
26989
9b2acb536228 uniform treatment of target, not as config;
wenzelm
parents: 26749
diff changeset
   184
fun apply_opt Sequential (FundefConfig {sequential, default, domintros,tailrec}) = 
9b2acb536228 uniform treatment of target, not as config;
wenzelm
parents: 26749
diff changeset
   185
    FundefConfig {sequential=true, default=default, domintros=domintros, tailrec=tailrec}
9b2acb536228 uniform treatment of target, not as config;
wenzelm
parents: 26749
diff changeset
   186
  | apply_opt (Default d) (FundefConfig {sequential, default, domintros,tailrec}) = 
9b2acb536228 uniform treatment of target, not as config;
wenzelm
parents: 26749
diff changeset
   187
    FundefConfig {sequential=sequential, default=d, domintros=domintros, tailrec=tailrec}
9b2acb536228 uniform treatment of target, not as config;
wenzelm
parents: 26749
diff changeset
   188
  | apply_opt DomIntros (FundefConfig {sequential, default, domintros,tailrec}) =
9b2acb536228 uniform treatment of target, not as config;
wenzelm
parents: 26749
diff changeset
   189
    FundefConfig {sequential=sequential, default=default, domintros=true,tailrec=tailrec}
9b2acb536228 uniform treatment of target, not as config;
wenzelm
parents: 26749
diff changeset
   190
  | apply_opt Tailrec (FundefConfig {sequential, default, domintros,tailrec}) =
9b2acb536228 uniform treatment of target, not as config;
wenzelm
parents: 26749
diff changeset
   191
    FundefConfig {sequential=sequential, default=default, domintros=domintros,tailrec=true}
20654
d80502f0d701 1. Function package accepts a parameter (default "some_term"), which specifies the functions
krauss
parents: 20523
diff changeset
   192
26989
9b2acb536228 uniform treatment of target, not as config;
wenzelm
parents: 26749
diff changeset
   193
val default_config =
28883
0f5b1accfb94 improved error msg; tuned
krauss
parents: 28524
diff changeset
   194
  FundefConfig { sequential=false, default="%x. undefined" (*FIXME dynamic scoping*), 
0f5b1accfb94 improved error msg; tuned
krauss
parents: 28524
diff changeset
   195
                 domintros=false, tailrec=false }
23819
2040846d1bbe some interface cleanup
krauss
parents: 23766
diff changeset
   196
2040846d1bbe some interface cleanup
krauss
parents: 23766
diff changeset
   197
28287
c86fa4e0aedb termination prover for "fun" can be configured using context data.
krauss
parents: 28083
diff changeset
   198
(* Analyzing function equations *)
23189
4574ab8f3b21 simplified interfaces, some restructuring
krauss
parents: 22903
diff changeset
   199
24170
33f055a0f3a1 more error handling
krauss
parents: 24168
diff changeset
   200
fun split_def ctxt geq =
23189
4574ab8f3b21 simplified interfaces, some restructuring
krauss
parents: 22903
diff changeset
   201
    let
24920
2a45e400fdad generic Syntax.pretty/string_of operations;
wenzelm
parents: 24171
diff changeset
   202
      fun input_error msg = cat_lines [msg, Syntax.string_of_term ctxt geq]
28287
c86fa4e0aedb termination prover for "fun" can be configured using context data.
krauss
parents: 28083
diff changeset
   203
      val qs = Term.strip_qnt_vars "all" geq
c86fa4e0aedb termination prover for "fun" can be configured using context data.
krauss
parents: 28083
diff changeset
   204
      val imp = Term.strip_qnt_body "all" geq
26529
03ad378ed5f0 Function package no longer overwrites theorems.
krauss
parents: 25558
diff changeset
   205
      val (gs, eq) = Logic.strip_horn imp
23189
4574ab8f3b21 simplified interfaces, some restructuring
krauss
parents: 22903
diff changeset
   206
4574ab8f3b21 simplified interfaces, some restructuring
krauss
parents: 22903
diff changeset
   207
      val (f_args, rhs) = HOLogic.dest_eq (HOLogic.dest_Trueprop eq)
24170
33f055a0f3a1 more error handling
krauss
parents: 24168
diff changeset
   208
          handle TERM _ => error (input_error "Not an equation")
23189
4574ab8f3b21 simplified interfaces, some restructuring
krauss
parents: 22903
diff changeset
   209
4574ab8f3b21 simplified interfaces, some restructuring
krauss
parents: 22903
diff changeset
   210
      val (head, args) = strip_comb f_args
4574ab8f3b21 simplified interfaces, some restructuring
krauss
parents: 22903
diff changeset
   211
4574ab8f3b21 simplified interfaces, some restructuring
krauss
parents: 22903
diff changeset
   212
      val fname = fst (dest_Free head)
24170
33f055a0f3a1 more error handling
krauss
parents: 24168
diff changeset
   213
          handle TERM _ => error (input_error "Head symbol must not be a bound variable")
23189
4574ab8f3b21 simplified interfaces, some restructuring
krauss
parents: 22903
diff changeset
   214
    in
4574ab8f3b21 simplified interfaces, some restructuring
krauss
parents: 22903
diff changeset
   215
      (fname, qs, gs, args, rhs)
4574ab8f3b21 simplified interfaces, some restructuring
krauss
parents: 22903
diff changeset
   216
    end
4574ab8f3b21 simplified interfaces, some restructuring
krauss
parents: 22903
diff changeset
   217
23203
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   218
(* Check for all sorts of errors in the input *)
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   219
fun check_defs ctxt fixes eqs =
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   220
    let
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   221
      val fnames = map (fst o fst) fixes
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   222
                                
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   223
      fun check geq = 
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   224
          let
28883
0f5b1accfb94 improved error msg; tuned
krauss
parents: 28524
diff changeset
   225
            fun input_error msg = error (cat_lines [msg, Syntax.string_of_term ctxt geq])
23203
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   226
                                  
24170
33f055a0f3a1 more error handling
krauss
parents: 24168
diff changeset
   227
            val fqgar as (fname, qs, gs, args, rhs) = split_def ctxt geq
23203
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   228
                                 
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   229
            val _ = fname mem fnames 
28883
0f5b1accfb94 improved error msg; tuned
krauss
parents: 28524
diff changeset
   230
                    orelse input_error 
0f5b1accfb94 improved error msg; tuned
krauss
parents: 28524
diff changeset
   231
                             ("Head symbol of left hand side must be " 
0f5b1accfb94 improved error msg; tuned
krauss
parents: 28524
diff changeset
   232
                              ^ plural "" "one out of " fnames ^ commas_quote fnames)
23203
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   233
                                            
30832
521f7d801da1 explicitly check that at least one argument is present to avoid low-level exception
krauss
parents: 30791
diff changeset
   234
            val _ = length args > 0 orelse input_error "Function has no arguments:"
521f7d801da1 explicitly check that at least one argument is present to avoid low-level exception
krauss
parents: 30791
diff changeset
   235
23203
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   236
            fun add_bvs t is = add_loose_bnos (t, 0, is)
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   237
            val rvs = (add_bvs rhs [] \\ fold add_bvs args [])
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   238
                        |> map (fst o nth (rev qs))
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   239
                      
28883
0f5b1accfb94 improved error msg; tuned
krauss
parents: 28524
diff changeset
   240
            val _ = null rvs orelse input_error 
0f5b1accfb94 improved error msg; tuned
krauss
parents: 28524
diff changeset
   241
                        ("Variable" ^ plural " " "s " rvs ^ commas_quote rvs
0f5b1accfb94 improved error msg; tuned
krauss
parents: 28524
diff changeset
   242
                         ^ " occur" ^ plural "s" "" rvs ^ " on right hand side only:")
23203
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   243
                                    
28883
0f5b1accfb94 improved error msg; tuned
krauss
parents: 28524
diff changeset
   244
            val _ = forall (not o Term.exists_subterm 
29922
60a304bc5a07 reject defined function in patterns with errmsg, e.g. f (f x) = x
krauss
parents: 29006
diff changeset
   245
                             (fn Free (n, _) => n mem fnames | _ => false)) (gs @ args)
60a304bc5a07 reject defined function in patterns with errmsg, e.g. f (f x) = x
krauss
parents: 29006
diff changeset
   246
                    orelse input_error "Defined function may not occur in premises or arguments"
24171
25381ce95316 Issue a warning, when "function" encounters variables occuring in function position,
krauss
parents: 24170
diff changeset
   247
25381ce95316 Issue a warning, when "function" encounters variables occuring in function position,
krauss
parents: 24170
diff changeset
   248
            val freeargs = map (fn t => subst_bounds (rev (map Free qs), t)) args
25381ce95316 Issue a warning, when "function" encounters variables occuring in function position,
krauss
parents: 24170
diff changeset
   249
            val funvars = filter (fn q => exists (exists_subterm (fn (Free q') $ _ => q = q' | _ => false)) freeargs) qs
25381ce95316 Issue a warning, when "function" encounters variables occuring in function position,
krauss
parents: 24170
diff changeset
   250
            val _ = null funvars
28883
0f5b1accfb94 improved error msg; tuned
krauss
parents: 28524
diff changeset
   251
                    orelse (warning (cat_lines 
0f5b1accfb94 improved error msg; tuned
krauss
parents: 28524
diff changeset
   252
                    ["Bound variable" ^ plural " " "s " funvars 
0f5b1accfb94 improved error msg; tuned
krauss
parents: 28524
diff changeset
   253
                     ^ commas_quote (map fst funvars) ^  
0f5b1accfb94 improved error msg; tuned
krauss
parents: 28524
diff changeset
   254
                     " occur" ^ plural "s" "" funvars ^ " in function position.",  
0f5b1accfb94 improved error msg; tuned
krauss
parents: 28524
diff changeset
   255
                     "Misspelled constructor???"]); true)
23203
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   256
          in
30906
3c7a76e79898 simplify computation and consistency checks of argument counts in the input
krauss
parents: 30832
diff changeset
   257
            (fname, length args)
23203
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   258
          end
30906
3c7a76e79898 simplify computation and consistency checks of argument counts in the input
krauss
parents: 30832
diff changeset
   259
3c7a76e79898 simplify computation and consistency checks of argument counts in the input
krauss
parents: 30832
diff changeset
   260
      val _ = AList.group (op =) (map check eqs)
3c7a76e79898 simplify computation and consistency checks of argument counts in the input
krauss
parents: 30832
diff changeset
   261
        |> map (fn (fname, ars) =>
3c7a76e79898 simplify computation and consistency checks of argument counts in the input
krauss
parents: 30832
diff changeset
   262
             length (distinct (op =) ars) = 1
3c7a76e79898 simplify computation and consistency checks of argument counts in the input
krauss
parents: 30832
diff changeset
   263
             orelse error ("Function " ^ quote fname ^
3c7a76e79898 simplify computation and consistency checks of argument counts in the input
krauss
parents: 30832
diff changeset
   264
                           " has different numbers of arguments in different equations"))
28884
7cef91288634 check for more common errors first
krauss
parents: 28883
diff changeset
   265
24170
33f055a0f3a1 more error handling
krauss
parents: 24168
diff changeset
   266
      fun check_sorts ((fname, fT), _) =
33f055a0f3a1 more error handling
krauss
parents: 24168
diff changeset
   267
          Sorts.of_sort (Sign.classes_of (ProofContext.theory_of ctxt)) (fT, HOLogic.typeS)
28883
0f5b1accfb94 improved error msg; tuned
krauss
parents: 28524
diff changeset
   268
          orelse error (cat_lines 
0f5b1accfb94 improved error msg; tuned
krauss
parents: 28524
diff changeset
   269
          ["Type of " ^ quote fname ^ " is not of sort " ^ quote "type" ^ ":",
0f5b1accfb94 improved error msg; tuned
krauss
parents: 28524
diff changeset
   270
           setmp show_sorts true (Syntax.string_of_typ ctxt) fT])
24170
33f055a0f3a1 more error handling
krauss
parents: 24168
diff changeset
   271
33f055a0f3a1 more error handling
krauss
parents: 24168
diff changeset
   272
      val _ = map check_sorts fixes
23203
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   273
    in
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   274
      ()
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   275
    end
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   276
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   277
(* Preprocessors *)
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   278
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   279
type fixes = ((string * typ) * mixfix) list
30790
350bb108406d bstring -> binding
krauss
parents: 30787
diff changeset
   280
type 'a spec = (Attrib.binding * 'a list) list
30787
5b7a5a05c7aa remove "otherwise" feature from function package which was never really documented or used
krauss
parents: 30560
diff changeset
   281
type preproc = fundef_config -> Proof.context -> fixes -> term spec 
25222
78943ac46f6d fun/function: generate case names for induction rules
krauss
parents: 25201
diff changeset
   282
               -> (term list * (thm list -> thm spec) * (thm list -> thm list list) * string list)
23819
2040846d1bbe some interface cleanup
krauss
parents: 23766
diff changeset
   283
28883
0f5b1accfb94 improved error msg; tuned
krauss
parents: 28524
diff changeset
   284
val fname_of = fst o dest_Free o fst o strip_comb o fst 
0f5b1accfb94 improved error msg; tuned
krauss
parents: 28524
diff changeset
   285
 o HOLogic.dest_eq o HOLogic.dest_Trueprop o Logic.strip_imp_concl o snd o dest_all_all
23203
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   286
25222
78943ac46f6d fun/function: generate case names for induction rules
krauss
parents: 25201
diff changeset
   287
fun mk_case_names i "" k = mk_case_names i (string_of_int (i + 1)) k
78943ac46f6d fun/function: generate case names for induction rules
krauss
parents: 25201
diff changeset
   288
  | mk_case_names _ n 0 = []
78943ac46f6d fun/function: generate case names for induction rules
krauss
parents: 25201
diff changeset
   289
  | mk_case_names _ n 1 = [n]
78943ac46f6d fun/function: generate case names for induction rules
krauss
parents: 25201
diff changeset
   290
  | mk_case_names _ n k = map (fn i => n ^ "_" ^ string_of_int i) (1 upto k)
78943ac46f6d fun/function: generate case names for induction rules
krauss
parents: 25201
diff changeset
   291
30787
5b7a5a05c7aa remove "otherwise" feature from function package which was never really documented or used
krauss
parents: 30560
diff changeset
   292
fun empty_preproc check _ ctxt fixes spec =
23203
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   293
    let 
30790
350bb108406d bstring -> binding
krauss
parents: 30787
diff changeset
   294
      val (bnds, tss) = split_list spec
23819
2040846d1bbe some interface cleanup
krauss
parents: 23766
diff changeset
   295
      val ts = flat tss
25222
78943ac46f6d fun/function: generate case names for induction rules
krauss
parents: 25201
diff changeset
   296
      val _ = check ctxt fixes ts
23819
2040846d1bbe some interface cleanup
krauss
parents: 23766
diff changeset
   297
      val fnames = map (fst o fst) fixes
2040846d1bbe some interface cleanup
krauss
parents: 23766
diff changeset
   298
      val indices = map (fn eq => find_index (curry op = (fname_of eq)) fnames) ts
2040846d1bbe some interface cleanup
krauss
parents: 23766
diff changeset
   299
28883
0f5b1accfb94 improved error msg; tuned
krauss
parents: 28524
diff changeset
   300
      fun sort xs = partition_list (fn i => fn (j,_) => i = j) 0 (length fnames - 1) 
0f5b1accfb94 improved error msg; tuned
krauss
parents: 28524
diff changeset
   301
                                   (indices ~~ xs)
23819
2040846d1bbe some interface cleanup
krauss
parents: 23766
diff changeset
   302
                        |> map (map snd)
25222
78943ac46f6d fun/function: generate case names for induction rules
krauss
parents: 25201
diff changeset
   303
25361
1aa441e48496 function package: using the names of the equations as case names turned out to be impractical => disabled
krauss
parents: 25222
diff changeset
   304
      (* using theorem names for case name currently disabled *)
30790
350bb108406d bstring -> binding
krauss
parents: 30787
diff changeset
   305
      val cnames = map_index (fn (i, _) => mk_case_names i "" 1) bnds |> flat
23203
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   306
    in
30790
350bb108406d bstring -> binding
krauss
parents: 30787
diff changeset
   307
      (ts, curry op ~~ bnds o Library.unflat tss, sort, cnames)
23203
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   308
    end
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   309
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   310
structure Preprocessor = GenericDataFun
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   311
(
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   312
  type T = preproc
23206
209e32e7c91e made SML/NJ happy;
wenzelm
parents: 23203
diff changeset
   313
  val empty : T = empty_preproc check_defs
23203
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   314
  val extend = I
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   315
  fun merge _ (a, _) = a
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   316
);
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   317
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   318
val get_preproc = Preprocessor.get o Context.Proof
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   319
val set_preproc = Preprocessor.map o K
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   320
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   321
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   322
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   323
local 
25558
5c317e8f5673 dropped void space
haftmann
parents: 25361
diff changeset
   324
  structure P = OuterParse and K = OuterKeyword
23203
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   325
28883
0f5b1accfb94 improved error msg; tuned
krauss
parents: 28524
diff changeset
   326
  val option_parser = 
0f5b1accfb94 improved error msg; tuned
krauss
parents: 28524
diff changeset
   327
      P.group "option" ((P.reserved "sequential" >> K Sequential)
0f5b1accfb94 improved error msg; tuned
krauss
parents: 28524
diff changeset
   328
                    || ((P.reserved "default" |-- P.term) >> Default)
0f5b1accfb94 improved error msg; tuned
krauss
parents: 28524
diff changeset
   329
                    || (P.reserved "domintros" >> K DomIntros)
0f5b1accfb94 improved error msg; tuned
krauss
parents: 28524
diff changeset
   330
                    || (P.reserved "tailrec" >> K Tailrec))
23203
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   331
28883
0f5b1accfb94 improved error msg; tuned
krauss
parents: 28524
diff changeset
   332
  fun config_parser default = 
0f5b1accfb94 improved error msg; tuned
krauss
parents: 28524
diff changeset
   333
      (Scan.optional (P.$$$ "(" |-- P.!!! (P.list1 option_parser) --| P.$$$ ")") [])
0f5b1accfb94 improved error msg; tuned
krauss
parents: 28524
diff changeset
   334
        >> (fn opts => fold apply_opt opts default)
23203
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   335
in
28883
0f5b1accfb94 improved error msg; tuned
krauss
parents: 28524
diff changeset
   336
  fun fundef_parser default_cfg = 
30791
02aa92682e88 use standard parsers provided by SpecParse
krauss
parents: 30790
diff changeset
   337
      config_parser default_cfg -- P.fixes -- SpecParse.where_alt_specs
23203
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   338
end
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   339
a5026e73cfcf "function (sequential)" and "fun" now handle incomplete patterns silently by adding "undefined" cases.
krauss
parents: 23189
diff changeset
   340
23215
20b5558a5419 local open FundefLib;
wenzelm
parents: 23206
diff changeset
   341
end
19564
d3e2f532459a First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff changeset
   342
end
d3e2f532459a First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff changeset
   343