| author | wenzelm |
| Wed, 15 Jul 2020 12:30:25 +0200 | |
| changeset 72036 | e48a5b6b7554 |
| parent 67149 | e61557884799 |
| permissions | -rw-r--r-- |
| 31775 | 1 |
(* Title: HOL/Tools/Function/measure_functions.ML |
|
26875
e18574413bc4
Measure functions can now be declared via special rules, allowing for a
krauss
parents:
diff
changeset
|
2 |
Author: Alexander Krauss, TU Muenchen |
|
e18574413bc4
Measure functions can now be declared via special rules, allowing for a
krauss
parents:
diff
changeset
|
3 |
|
| 31902 | 4 |
Measure functions, generated heuristically. |
|
26875
e18574413bc4
Measure functions can now be declared via special rules, allowing for a
krauss
parents:
diff
changeset
|
5 |
*) |
|
e18574413bc4
Measure functions can now be declared via special rules, allowing for a
krauss
parents:
diff
changeset
|
6 |
|
|
e18574413bc4
Measure functions can now be declared via special rules, allowing for a
krauss
parents:
diff
changeset
|
7 |
signature MEASURE_FUNCTIONS = |
|
e18574413bc4
Measure functions can now be declared via special rules, allowing for a
krauss
parents:
diff
changeset
|
8 |
sig |
|
e18574413bc4
Measure functions can now be declared via special rules, allowing for a
krauss
parents:
diff
changeset
|
9 |
val get_measure_functions : Proof.context -> typ -> term list |
|
e18574413bc4
Measure functions can now be declared via special rules, allowing for a
krauss
parents:
diff
changeset
|
10 |
end |
|
e18574413bc4
Measure functions can now be declared via special rules, allowing for a
krauss
parents:
diff
changeset
|
11 |
|
| 57959 | 12 |
structure Measure_Functions : MEASURE_FUNCTIONS = |
|
34232
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
32603
diff
changeset
|
13 |
struct |
|
26875
e18574413bc4
Measure functions can now be declared via special rules, allowing for a
krauss
parents:
diff
changeset
|
14 |
|
|
e18574413bc4
Measure functions can now be declared via special rules, allowing for a
krauss
parents:
diff
changeset
|
15 |
(** User-declared size functions **) |
|
e18574413bc4
Measure functions can now be declared via special rules, allowing for a
krauss
parents:
diff
changeset
|
16 |
|
|
34232
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
32603
diff
changeset
|
17 |
fun mk_is_measure t = |
| 67149 | 18 |
Const (\<^const_name>\<open>is_measure\<close>, fastype_of t --> HOLogic.boolT) $ t |
|
26875
e18574413bc4
Measure functions can now be declared via special rules, allowing for a
krauss
parents:
diff
changeset
|
19 |
|
|
e18574413bc4
Measure functions can now be declared via special rules, allowing for a
krauss
parents:
diff
changeset
|
20 |
fun find_measures ctxt T = |
| 67149 | 21 |
DEPTH_SOLVE (resolve_tac ctxt (rev (Named_Theorems.get ctxt \<^named_theorems>\<open>measure_function\<close>)) 1) |
|
34232
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
32603
diff
changeset
|
22 |
(HOLogic.mk_Trueprop (mk_is_measure (Var (("f",0), T --> HOLogic.natT)))
|
|
59621
291934bac95e
Thm.cterm_of and Thm.ctyp_of operate on local context;
wenzelm
parents:
59582
diff
changeset
|
23 |
|> Thm.cterm_of ctxt |> Goal.init) |
| 59582 | 24 |
|> Seq.map (Thm.prop_of #> (fn _ $ (_ $ (_ $ f)) => f)) |
|
26875
e18574413bc4
Measure functions can now be declared via special rules, allowing for a
krauss
parents:
diff
changeset
|
25 |
|> Seq.list_of |
|
e18574413bc4
Measure functions can now be declared via special rules, allowing for a
krauss
parents:
diff
changeset
|
26 |
|
|
e18574413bc4
Measure functions can now be declared via special rules, allowing for a
krauss
parents:
diff
changeset
|
27 |
|
|
e18574413bc4
Measure functions can now be declared via special rules, allowing for a
krauss
parents:
diff
changeset
|
28 |
(** Generating Measure Functions **) |
|
e18574413bc4
Measure functions can now be declared via special rules, allowing for a
krauss
parents:
diff
changeset
|
29 |
|
|
e18574413bc4
Measure functions can now be declared via special rules, allowing for a
krauss
parents:
diff
changeset
|
30 |
fun constant_0 T = Abs ("x", T, HOLogic.zero)
|
|
e18574413bc4
Measure functions can now be declared via special rules, allowing for a
krauss
parents:
diff
changeset
|
31 |
fun constant_1 T = Abs ("x", T, HOLogic.Suc_zero)
|
|
e18574413bc4
Measure functions can now be declared via special rules, allowing for a
krauss
parents:
diff
changeset
|
32 |
|
| 67149 | 33 |
fun mk_funorder_funs (Type (\<^type_name>\<open>Sum_Type.sum\<close>, [fT, sT])) = |
| 55968 | 34 |
map (fn m => Sum_Tree.mk_sumcase fT sT HOLogic.natT m (constant_0 sT)) (mk_funorder_funs fT) |
35 |
@ map (fn m => Sum_Tree.mk_sumcase fT sT HOLogic.natT (constant_0 fT) m) (mk_funorder_funs sT) |
|
|
26875
e18574413bc4
Measure functions can now be declared via special rules, allowing for a
krauss
parents:
diff
changeset
|
36 |
| mk_funorder_funs T = [ constant_1 T ] |
|
e18574413bc4
Measure functions can now be declared via special rules, allowing for a
krauss
parents:
diff
changeset
|
37 |
|
| 67149 | 38 |
fun mk_ext_base_funs ctxt (Type (\<^type_name>\<open>Sum_Type.sum\<close>, [fT, sT])) = |
| 55968 | 39 |
map_product (Sum_Tree.mk_sumcase fT sT HOLogic.natT) |
|
34232
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
32603
diff
changeset
|
40 |
(mk_ext_base_funs ctxt fT) (mk_ext_base_funs ctxt sT) |
|
26875
e18574413bc4
Measure functions can now be declared via special rules, allowing for a
krauss
parents:
diff
changeset
|
41 |
| mk_ext_base_funs ctxt T = find_measures ctxt T |
|
e18574413bc4
Measure functions can now be declared via special rules, allowing for a
krauss
parents:
diff
changeset
|
42 |
|
| 67149 | 43 |
fun mk_all_measure_funs ctxt (T as Type (\<^type_name>\<open>Sum_Type.sum\<close>, _)) = |
|
26875
e18574413bc4
Measure functions can now be declared via special rules, allowing for a
krauss
parents:
diff
changeset
|
44 |
mk_ext_base_funs ctxt T @ mk_funorder_funs T |
|
e18574413bc4
Measure functions can now be declared via special rules, allowing for a
krauss
parents:
diff
changeset
|
45 |
| mk_all_measure_funs ctxt T = find_measures ctxt T |
|
e18574413bc4
Measure functions can now be declared via special rules, allowing for a
krauss
parents:
diff
changeset
|
46 |
|
|
e18574413bc4
Measure functions can now be declared via special rules, allowing for a
krauss
parents:
diff
changeset
|
47 |
val get_measure_functions = mk_all_measure_funs |
|
e18574413bc4
Measure functions can now be declared via special rules, allowing for a
krauss
parents:
diff
changeset
|
48 |
|
|
e18574413bc4
Measure functions can now be declared via special rules, allowing for a
krauss
parents:
diff
changeset
|
49 |
end |