src/HOL/Tools/Function/measure_functions.ML
author wenzelm
Fri, 28 Oct 2011 23:41:16 +0200
changeset 46165 3c5d3d286055
parent 43232 23f352990944
child 57310 94242fa87638
permissions -rw-r--r--
tuned Named_Thms: proper binding;
haftmann@31771
     1
(*  Title:       HOL/Tools/Function/measure_functions.ML
krauss@26875
     2
    Author:      Alexander Krauss, TU Muenchen
krauss@26875
     3
wenzelm@31913
     4
Measure functions, generated heuristically.
krauss@26875
     5
*)
krauss@26875
     6
krauss@26875
     7
signature MEASURE_FUNCTIONS =
krauss@26875
     8
sig
krauss@26875
     9
krauss@26875
    10
  val get_measure_functions : Proof.context -> typ -> term list
krauss@34232
    11
  val setup : theory -> theory
krauss@26875
    12
krauss@26875
    13
end
krauss@26875
    14
krauss@34232
    15
structure MeasureFunctions : MEASURE_FUNCTIONS =
krauss@34232
    16
struct
krauss@26875
    17
krauss@26875
    18
(** User-declared size functions **)
wenzelm@31913
    19
structure Measure_Heuristic_Rules = Named_Thms
wenzelm@31913
    20
(
wenzelm@46165
    21
  val name = @{binding measure_function}
krauss@34232
    22
  val description =
wenzelm@39039
    23
    "rules that guide the heuristic generation of measure functions"
krauss@26875
    24
);
krauss@26875
    25
krauss@34232
    26
fun mk_is_measure t =
krauss@34232
    27
  Const (@{const_name is_measure}, fastype_of t --> HOLogic.boolT) $ t
krauss@26875
    28
krauss@26875
    29
fun find_measures ctxt T =
krauss@34232
    30
  DEPTH_SOLVE (resolve_tac (Measure_Heuristic_Rules.get ctxt) 1)
krauss@34232
    31
    (HOLogic.mk_Trueprop (mk_is_measure (Var (("f",0), T --> HOLogic.natT)))
wenzelm@43232
    32
     |> cterm_of (Proof_Context.theory_of ctxt) |> Goal.init)
krauss@26875
    33
  |> Seq.map (prop_of #> (fn _ $ (_ $ (_ $ f)) => f))
krauss@26875
    34
  |> Seq.list_of
krauss@26875
    35
krauss@26875
    36
krauss@26875
    37
(** Generating Measure Functions **)
krauss@26875
    38
krauss@26875
    39
fun constant_0 T = Abs ("x", T, HOLogic.zero)
krauss@26875
    40
fun constant_1 T = Abs ("x", T, HOLogic.Suc_zero)
krauss@26875
    41
haftmann@37678
    42
fun mk_funorder_funs (Type (@{type_name Sum_Type.sum}, [fT, sT])) =
krauss@34232
    43
  map (fn m => SumTree.mk_sumcase fT sT HOLogic.natT m (constant_0 sT)) (mk_funorder_funs fT)
krauss@34232
    44
  @ map (fn m => SumTree.mk_sumcase fT sT HOLogic.natT (constant_0 fT) m) (mk_funorder_funs sT)
krauss@26875
    45
  | mk_funorder_funs T = [ constant_1 T ]
krauss@26875
    46
haftmann@37678
    47
fun mk_ext_base_funs ctxt (Type (@{type_name Sum_Type.sum}, [fT, sT])) =
krauss@34232
    48
    map_product (SumTree.mk_sumcase fT sT HOLogic.natT)
krauss@34232
    49
      (mk_ext_base_funs ctxt fT) (mk_ext_base_funs ctxt sT)
krauss@26875
    50
  | mk_ext_base_funs ctxt T = find_measures ctxt T
krauss@26875
    51
haftmann@37678
    52
fun mk_all_measure_funs ctxt (T as Type (@{type_name Sum_Type.sum}, _)) =
krauss@26875
    53
    mk_ext_base_funs ctxt T @ mk_funorder_funs T
krauss@26875
    54
  | mk_all_measure_funs ctxt T = find_measures ctxt T
krauss@26875
    55
krauss@26875
    56
val get_measure_functions = mk_all_measure_funs
krauss@26875
    57
wenzelm@31913
    58
val setup = Measure_Heuristic_Rules.setup
krauss@26875
    59
krauss@26875
    60
end