src/HOL/Tools/Function/fun.ML
author wenzelm
Tue, 17 Nov 2009 14:51:57 +0100
changeset 33726 0878aecbf119
parent 33671 4b0f2599ed48
child 33855 cd8acf137c9c
permissions -rw-r--r--
eliminated slightly odd name space grouping -- now managed by Isar toplevel;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
33098
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
     1
(*  Title:      HOL/Tools/Function/fun.ML
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
     2
    Author:     Alexander Krauss, TU Muenchen
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
     3
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
     4
Sequential mode for function definitions
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
     5
Command "fun" for fully automated function definitions
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
     6
*)
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
     7
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
     8
signature FUNCTION_FUN =
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
     9
sig
33099
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents: 33098
diff changeset
    10
    val add_fun : Function_Common.function_config ->
33098
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    11
      (binding * typ option * mixfix) list -> (Attrib.binding * term) list ->
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    12
      bool -> local_theory -> Proof.context
33099
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents: 33098
diff changeset
    13
    val add_fun_cmd : Function_Common.function_config ->
33098
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    14
      (binding * string option * mixfix) list -> (Attrib.binding * string) list ->
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    15
      bool -> local_theory -> Proof.context
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    16
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    17
    val setup : theory -> theory
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    18
end
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    19
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    20
structure Function_Fun : FUNCTION_FUN =
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    21
struct
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    22
33099
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents: 33098
diff changeset
    23
open Function_Lib
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents: 33098
diff changeset
    24
open Function_Common
33098
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    25
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    26
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    27
fun check_pats ctxt geq =
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    28
    let 
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    29
      fun err str = error (cat_lines ["Malformed definition:",
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    30
                                      str ^ " not allowed in sequential mode.",
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    31
                                      Syntax.string_of_term ctxt geq])
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    32
      val thy = ProofContext.theory_of ctxt
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    33
                
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    34
      fun check_constr_pattern (Bound _) = ()
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    35
        | check_constr_pattern t =
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    36
          let
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    37
            val (hd, args) = strip_comb t
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    38
          in
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    39
            (((case Datatype.info_of_constr thy (dest_Const hd) of
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    40
                 SOME _ => ()
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    41
               | NONE => err "Non-constructor pattern")
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    42
              handle TERM ("dest_Const", _) => err "Non-constructor patterns");
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    43
             map check_constr_pattern args; 
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    44
             ())
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    45
          end
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    46
          
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    47
      val (fname, qs, gs, args, rhs) = split_def ctxt geq 
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    48
                                       
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    49
      val _ = if not (null gs) then err "Conditional equations" else ()
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    50
      val _ = map check_constr_pattern args
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    51
                  
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    52
                  (* just count occurrences to check linearity *)
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    53
      val _ = if fold (fold_aterms (fn Bound _ => Integer.add 1 | _ => I)) args 0 > length qs
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    54
              then err "Nonlinear patterns" else ()
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    55
    in
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    56
      ()
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    57
    end
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    58
    
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    59
val by_pat_completeness_auto =
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    60
    Proof.global_future_terminal_proof
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    61
      (Method.Basic Pat_Completeness.pat_completeness,
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    62
       SOME (Method.Source_i (Args.src (("HOL.auto", []), Position.none))))
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    63
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    64
fun termination_by method int =
33099
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents: 33098
diff changeset
    65
    Function.termination_proof NONE
33098
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    66
    #> Proof.global_future_terminal_proof (Method.Basic method, NONE) int
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    67
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    68
fun mk_catchall fixes arity_of =
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    69
    let
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    70
      fun mk_eqn ((fname, fT), _) =
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    71
          let 
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    72
            val n = arity_of fname
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    73
            val (argTs, rT) = chop n (binder_types fT)
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    74
                                   |> apsnd (fn Ts => Ts ---> body_type fT) 
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    75
                              
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    76
            val qs = map Free (Name.invent_list [] "a" n ~~ argTs)
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    77
          in
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    78
            HOLogic.mk_eq(list_comb (Free (fname, fT), qs),
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    79
                          Const ("HOL.undefined", rT))
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    80
              |> HOLogic.mk_Trueprop
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    81
              |> fold_rev Logic.all qs
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    82
          end
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    83
    in
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    84
      map mk_eqn fixes
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    85
    end
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    86
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    87
fun add_catchall ctxt fixes spec =
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    88
  let val fqgars = map (split_def ctxt) spec
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    89
      val arity_of = map (fn (fname,_,_,args,_) => (fname, length args)) fqgars
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    90
                     |> AList.lookup (op =) #> the
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    91
  in
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    92
    spec @ mk_catchall fixes arity_of
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    93
  end
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    94
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    95
fun warn_if_redundant ctxt origs tss =
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    96
    let
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    97
        fun msg t = "Ignoring redundant equation: " ^ quote (Syntax.string_of_term ctxt t)
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    98
                    
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
    99
        val (tss', _) = chop (length origs) tss
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   100
        fun check (t, []) = (warning (msg t); [])
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   101
          | check (t, s) = s
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   102
    in
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   103
        (map check (origs ~~ tss'); tss)
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   104
    end
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   105
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   106
33099
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents: 33098
diff changeset
   107
fun sequential_preproc (config as FunctionConfig {sequential, ...}) ctxt fixes spec =
33098
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   108
      if sequential then
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   109
        let
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   110
          val (bnds, eqss) = split_list spec
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   111
                            
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   112
          val eqs = map the_single eqss
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   113
                    
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   114
          val feqs = eqs
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   115
                      |> tap (check_defs ctxt fixes) (* Standard checks *)
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   116
                      |> tap (map (check_pats ctxt))    (* More checks for sequential mode *)
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   117
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   118
          val compleqs = add_catchall ctxt fixes feqs   (* Completion *)
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   119
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   120
          val spliteqs = warn_if_redundant ctxt feqs
33099
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents: 33098
diff changeset
   121
                           (Function_Split.split_all_equations ctxt compleqs)
33098
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   122
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   123
          fun restore_spec thms =
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   124
              bnds ~~ Library.take (length bnds, Library.unflat spliteqs thms)
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   125
              
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   126
          val spliteqs' = flat (Library.take (length bnds, spliteqs))
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   127
          val fnames = map (fst o fst) fixes
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   128
          val indices = map (fn eq => find_index (curry op = (fname_of eq)) fnames) spliteqs'
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   129
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   130
          fun sort xs = partition_list (fn i => fn (j,_) => i = j) 0 (length fnames - 1) (indices ~~ xs)
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   131
                                       |> map (map snd)
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   132
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   133
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   134
          val bnds' = bnds @ replicate (length spliteqs - length bnds) Attrib.empty_binding
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   135
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   136
          (* using theorem names for case name currently disabled *)
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   137
          val case_names = map_index (fn (i, (_, es)) => mk_case_names i "" (length es)) 
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   138
                                     (bnds' ~~ spliteqs)
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   139
                           |> flat
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   140
        in
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   141
          (flat spliteqs, restore_spec, sort, case_names)
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   142
        end
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   143
      else
33099
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents: 33098
diff changeset
   144
        Function_Common.empty_preproc check_defs config ctxt fixes spec
33098
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   145
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   146
val setup =
33099
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents: 33098
diff changeset
   147
  Context.theory_map (Function_Common.set_preproc sequential_preproc)
33098
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   148
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   149
33099
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents: 33098
diff changeset
   150
val fun_config = FunctionConfig { sequential=true, default="%x. undefined" (*FIXME dynamic scoping*), 
33101
8846318b52d0 configuration flag "partials"
krauss
parents: 33099
diff changeset
   151
  domintros=false, partials=false, tailrec=false }
33098
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   152
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   153
fun gen_fun add config fixes statements int lthy =
33726
0878aecbf119 eliminated slightly odd name space grouping -- now managed by Isar toplevel;
wenzelm
parents: 33671
diff changeset
   154
  lthy
0878aecbf119 eliminated slightly odd name space grouping -- now managed by Isar toplevel;
wenzelm
parents: 33671
diff changeset
   155
    |> add fixes statements config
0878aecbf119 eliminated slightly odd name space grouping -- now managed by Isar toplevel;
wenzelm
parents: 33671
diff changeset
   156
    |> by_pat_completeness_auto int
0878aecbf119 eliminated slightly odd name space grouping -- now managed by Isar toplevel;
wenzelm
parents: 33671
diff changeset
   157
    |> Local_Theory.restore
0878aecbf119 eliminated slightly odd name space grouping -- now managed by Isar toplevel;
wenzelm
parents: 33671
diff changeset
   158
    |> termination_by (Function_Common.get_termination_prover lthy) int
33098
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   159
33099
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents: 33098
diff changeset
   160
val add_fun = gen_fun Function.add_function
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents: 33098
diff changeset
   161
val add_fun_cmd = gen_fun Function.add_function_cmd
33098
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   162
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   163
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   164
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   165
local structure P = OuterParse and K = OuterKeyword in
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   166
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   167
val _ =
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   168
  OuterSyntax.local_theory' "fun" "define general recursive functions (short version)" K.thy_decl
33099
b8cdd3d73022 function package: more standard names for structures and files
krauss
parents: 33098
diff changeset
   169
  (function_parser fun_config
33098
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   170
     >> (fn ((config, fixes), statements) => add_fun_cmd config fixes statements));
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   171
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   172
end
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   173
3e9ae9032273 renamed FundefDatatype -> Function_Fun
krauss
parents:
diff changeset
   174
end