| author | wenzelm | 
| Wed, 31 Oct 2018 15:50:45 +0100 | |
| changeset 69215 | ab94035ba6ea | 
| 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  |