| author | immler | 
| Fri, 20 May 2016 22:01:39 +0200 | |
| changeset 63103 | 2394b0db133f | 
| parent 62958 | b41c1cb5e251 | 
| child 63161 | 2660ba498798 | 
| permissions | -rw-r--r-- | 
| 32657 | 1 | (* Title: HOL/Code_Evaluation.thy | 
| 28228 | 2 | Author: Florian Haftmann, TU Muenchen | 
| 3 | *) | |
| 4 | ||
| 60758 | 5 | section \<open>Term evaluation using the generic code generator\<close> | 
| 28228 | 6 | |
| 32657 | 7 | theory Code_Evaluation | 
| 51126 
df86080de4cb
reform of predicate compiler / quickcheck theories:
 haftmann parents: 
51112diff
changeset | 8 | imports Typerep Limited_Sequence | 
| 56925 | 9 | keywords "value" :: diag | 
| 28228 | 10 | begin | 
| 11 | ||
| 60758 | 12 | subsection \<open>Term representation\<close> | 
| 28228 | 13 | |
| 61799 | 14 | subsubsection \<open>Terms and class \<open>term_of\<close>\<close> | 
| 28228 | 15 | |
| 58350 
919149921e46
added 'extraction' plugins -- this might help 'HOL-Proofs'
 blanchet parents: 
58334diff
changeset | 16 | datatype (plugins only: code extraction) "term" = dummy_term | 
| 28228 | 17 | |
| 31205 
98370b26c2ce
String.literal replaces message_string, code_numeral replaces (code_)index
 haftmann parents: 
31203diff
changeset | 18 | definition Const :: "String.literal \<Rightarrow> typerep \<Rightarrow> term" where | 
| 28228 | 19 | "Const _ _ = dummy_term" | 
| 20 | ||
| 28661 | 21 | definition App :: "term \<Rightarrow> term \<Rightarrow> term" where | 
| 28228 | 22 | "App _ _ = dummy_term" | 
| 23 | ||
| 40638 
6b137c96df07
adding dummy definition for Code_Evaluation.Abs and hiding constants App less strict
 bulwahn parents: 
39567diff
changeset | 24 | definition Abs :: "String.literal \<Rightarrow> typerep \<Rightarrow> term \<Rightarrow> term" where | 
| 
6b137c96df07
adding dummy definition for Code_Evaluation.Abs and hiding constants App less strict
 bulwahn parents: 
39567diff
changeset | 25 | "Abs _ _ _ = dummy_term" | 
| 
6b137c96df07
adding dummy definition for Code_Evaluation.Abs and hiding constants App less strict
 bulwahn parents: 
39567diff
changeset | 26 | |
| 42979 
5b9e16259341
extending terms of Code_Evaluation by Free to allow partial terms
 bulwahn parents: 
40884diff
changeset | 27 | definition Free :: "String.literal \<Rightarrow> typerep \<Rightarrow> term" where | 
| 
5b9e16259341
extending terms of Code_Evaluation by Free to allow partial terms
 bulwahn parents: 
40884diff
changeset | 28 | "Free _ _ = dummy_term" | 
| 
5b9e16259341
extending terms of Code_Evaluation by Free to allow partial terms
 bulwahn parents: 
40884diff
changeset | 29 | |
| 
5b9e16259341
extending terms of Code_Evaluation by Free to allow partial terms
 bulwahn parents: 
40884diff
changeset | 30 | code_datatype Const App Abs Free | 
| 28228 | 31 | |
| 28335 | 32 | class term_of = typerep + | 
| 31031 | 33 | fixes term_of :: "'a \<Rightarrow> term" | 
| 28228 | 34 | |
| 35 | lemma term_of_anything: "term_of x \<equiv> t" | |
| 36 | by (rule eq_reflection) (cases "term_of x", cases t, simp) | |
| 37 | ||
| 31191 | 38 | definition valapp :: "('a \<Rightarrow> 'b) \<times> (unit \<Rightarrow> term)
 | 
| 31178 | 39 | \<Rightarrow> 'a \<times> (unit \<Rightarrow> term) \<Rightarrow> 'b \<times> (unit \<Rightarrow> term)" where | 
| 31191 | 40 | "valapp f x = (fst f (fst x), \<lambda>u. App (snd f ()) (snd x ()))" | 
| 31178 | 41 | |
| 32069 
6d28bbd33e2c
prefer code_inline over code_unfold; use code_unfold_post where appropriate
 haftmann parents: 
31998diff
changeset | 42 | lemma valapp_code [code, code_unfold]: | 
| 31191 | 43 | "valapp (f, tf) (x, tx) = (f x, \<lambda>u. App (tf ()) (tx ()))" | 
| 44 | by (simp only: valapp_def fst_conv snd_conv) | |
| 31178 | 45 | |
| 28228 | 46 | |
| 60758 | 47 | subsubsection \<open>Syntax\<close> | 
| 31178 | 48 | |
| 31191 | 49 | definition termify :: "'a \<Rightarrow> term" where | 
| 50 | [code del]: "termify x = dummy_term" | |
| 51 | ||
| 52 | abbreviation valtermify :: "'a \<Rightarrow> 'a \<times> (unit \<Rightarrow> term)" where | |
| 53 | "valtermify x \<equiv> (x, \<lambda>u. termify x)" | |
| 31178 | 54 | |
| 55 | locale term_syntax | |
| 56 | begin | |
| 57 | ||
| 31191 | 58 | notation App (infixl "<\<cdot>>" 70) | 
| 59 |   and valapp (infixl "{\<cdot>}" 70)
 | |
| 31178 | 60 | |
| 61 | end | |
| 62 | ||
| 63 | interpretation term_syntax . | |
| 64 | ||
| 31191 | 65 | no_notation App (infixl "<\<cdot>>" 70) | 
| 66 |   and valapp (infixl "{\<cdot>}" 70)
 | |
| 67 | ||
| 68 | ||
| 60758 | 69 | subsection \<open>Tools setup and evaluation\<close> | 
| 39564 | 70 | |
| 39567 
5ee997fbe5cc
dynamic_eval_conv static_eval_conv: certification of previously unreliably reconstructed evaluated term
 haftmann parents: 
39564diff
changeset | 71 | lemma eq_eq_TrueD: | 
| 62958 
b41c1cb5e251
Type_Infer.object_logic controls improvement of type inference result;
 wenzelm parents: 
62597diff
changeset | 72 |   fixes x y :: "'a::{}"
 | 
| 39567 
5ee997fbe5cc
dynamic_eval_conv static_eval_conv: certification of previously unreliably reconstructed evaluated term
 haftmann parents: 
39564diff
changeset | 73 | assumes "(x \<equiv> y) \<equiv> Trueprop True" | 
| 
5ee997fbe5cc
dynamic_eval_conv static_eval_conv: certification of previously unreliably reconstructed evaluated term
 haftmann parents: 
39564diff
changeset | 74 | shows "x \<equiv> y" | 
| 
5ee997fbe5cc
dynamic_eval_conv static_eval_conv: certification of previously unreliably reconstructed evaluated term
 haftmann parents: 
39564diff
changeset | 75 | using assms by simp | 
| 
5ee997fbe5cc
dynamic_eval_conv static_eval_conv: certification of previously unreliably reconstructed evaluated term
 haftmann parents: 
39564diff
changeset | 76 | |
| 56928 
1e50fddbe1f5
dropped term_of obfuscation -- not really required;
 haftmann parents: 
56927diff
changeset | 77 | code_printing | 
| 
1e50fddbe1f5
dropped term_of obfuscation -- not really required;
 haftmann parents: 
56927diff
changeset | 78 | type_constructor "term" \<rightharpoonup> (Eval) "Term.term" | 
| 
1e50fddbe1f5
dropped term_of obfuscation -- not really required;
 haftmann parents: 
56927diff
changeset | 79 | | constant Const \<rightharpoonup> (Eval) "Term.Const/ ((_), (_))" | 
| 
1e50fddbe1f5
dropped term_of obfuscation -- not really required;
 haftmann parents: 
56927diff
changeset | 80 | | constant App \<rightharpoonup> (Eval) "Term.$/ ((_), (_))" | 
| 
1e50fddbe1f5
dropped term_of obfuscation -- not really required;
 haftmann parents: 
56927diff
changeset | 81 | | constant Abs \<rightharpoonup> (Eval) "Term.Abs/ ((_), (_), (_))" | 
| 
1e50fddbe1f5
dropped term_of obfuscation -- not really required;
 haftmann parents: 
56927diff
changeset | 82 | | constant Free \<rightharpoonup> (Eval) "Term.Free/ ((_), (_))" | 
| 
1e50fddbe1f5
dropped term_of obfuscation -- not really required;
 haftmann parents: 
56927diff
changeset | 83 | |
| 48891 | 84 | ML_file "Tools/code_evaluation.ML" | 
| 39564 | 85 | |
| 86 | code_reserved Eval Code_Evaluation | |
| 87 | ||
| 56928 
1e50fddbe1f5
dropped term_of obfuscation -- not really required;
 haftmann parents: 
56927diff
changeset | 88 | ML_file "~~/src/HOL/Tools/value.ML" | 
| 
1e50fddbe1f5
dropped term_of obfuscation -- not really required;
 haftmann parents: 
56927diff
changeset | 89 | |
| 39564 | 90 | |
| 61799 | 91 | subsection \<open>\<open>term_of\<close> instances\<close> | 
| 39564 | 92 | |
| 93 | instantiation "fun" :: (typerep, typerep) term_of | |
| 94 | begin | |
| 95 | ||
| 96 | definition | |
| 61076 | 97 | "term_of (f :: 'a \<Rightarrow> 'b) = | 
| 56241 | 98 | Const (STR ''Pure.dummy_pattern'') | 
| 99 |       (Typerep.Typerep (STR ''fun'') [Typerep.typerep TYPE('a), Typerep.typerep TYPE('b)])"
 | |
| 39564 | 100 | |
| 101 | instance .. | |
| 102 | ||
| 103 | end | |
| 104 | ||
| 58334 | 105 | declare [[code drop: rec_term case_term "HOL.equal :: term \<Rightarrow> _" | 
| 56926 | 106 | "term_of :: typerep \<Rightarrow> _" "term_of :: term \<Rightarrow> _" "term_of :: String.literal \<Rightarrow> _" | 
| 107 | "term_of :: _ Predicate.pred \<Rightarrow> term" "term_of :: _ Predicate.seq \<Rightarrow> term"]] | |
| 39564 | 108 | |
| 62597 | 109 | definition case_char :: "'a \<Rightarrow> (num \<Rightarrow> 'a) \<Rightarrow> char \<Rightarrow> 'a" | 
| 110 | where "case_char f g c = (if c = 0 then f else g (num_of_nat (nat_of_char c)))" | |
| 111 | ||
| 112 | lemma term_of_char [unfolded typerep_fun_def typerep_char_def typerep_num_def, code]: | |
| 113 | "term_of = | |
| 114 | case_char (Const (STR ''Groups.zero_class.zero'') (TYPEREP(char))) | |
| 115 | (\<lambda>k. App (Const (STR ''String.Char'') (TYPEREP(num \<Rightarrow> char))) (term_of k))" | |
| 116 | by (rule ext) (rule term_of_anything [THEN meta_eq_to_obj_eq]) | |
| 39564 | 117 | |
| 59484 
a130ae7a9398
slightly more standard code setup for String.literal, with explicit special case in predicate compiler
 haftmann parents: 
58889diff
changeset | 118 | lemma term_of_string [code]: | 
| 
a130ae7a9398
slightly more standard code setup for String.literal, with explicit special case in predicate compiler
 haftmann parents: 
58889diff
changeset | 119 | "term_of s = App (Const (STR ''STR'') | 
| 
a130ae7a9398
slightly more standard code setup for String.literal, with explicit special case in predicate compiler
 haftmann parents: 
58889diff
changeset | 120 | (Typerep.Typerep (STR ''fun'') [Typerep.Typerep (STR ''list'') [Typerep.Typerep (STR ''char'') []], | 
| 
a130ae7a9398
slightly more standard code setup for String.literal, with explicit special case in predicate compiler
 haftmann parents: 
58889diff
changeset | 121 | Typerep.Typerep (STR ''String.literal'') []])) (term_of (String.explode s))" | 
| 
a130ae7a9398
slightly more standard code setup for String.literal, with explicit special case in predicate compiler
 haftmann parents: 
58889diff
changeset | 122 | by (subst term_of_anything) rule | 
| 
a130ae7a9398
slightly more standard code setup for String.literal, with explicit special case in predicate compiler
 haftmann parents: 
58889diff
changeset | 123 | |
| 52435 
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
 haftmann parents: 
52286diff
changeset | 124 | code_printing | 
| 61076 | 125 | constant "term_of :: integer \<Rightarrow> term" \<rightharpoonup> (Eval) "HOLogic.mk'_number/ HOLogic.code'_integerT" | 
| 126 | | constant "term_of :: String.literal \<Rightarrow> term" \<rightharpoonup> (Eval) "HOLogic.mk'_literal" | |
| 39564 | 127 | |
| 58036 
f23045003476
add code equation for term_of on integer
 Andreas Lochbihler parents: 
56928diff
changeset | 128 | declare [[code drop: "term_of :: integer \<Rightarrow> _"]] | 
| 
f23045003476
add code equation for term_of on integer
 Andreas Lochbihler parents: 
56928diff
changeset | 129 | |
| 
f23045003476
add code equation for term_of on integer
 Andreas Lochbihler parents: 
56928diff
changeset | 130 | lemma term_of_integer [unfolded typerep_fun_def typerep_num_def typerep_integer_def, code]: | 
| 58038 
f8e6197668c9
correct code equation for term_of on integer
 Andreas Lochbihler parents: 
58036diff
changeset | 131 | "term_of (i :: integer) = | 
| 
f8e6197668c9
correct code equation for term_of on integer
 Andreas Lochbihler parents: 
58036diff
changeset | 132 | (if i > 0 then | 
| 
f8e6197668c9
correct code equation for term_of on integer
 Andreas Lochbihler parents: 
58036diff
changeset | 133 | App (Const (STR ''Num.numeral_class.numeral'') (TYPEREP(num \<Rightarrow> integer))) | 
| 
f8e6197668c9
correct code equation for term_of on integer
 Andreas Lochbihler parents: 
58036diff
changeset | 134 | (term_of (num_of_integer i)) | 
| 
f8e6197668c9
correct code equation for term_of on integer
 Andreas Lochbihler parents: 
58036diff
changeset | 135 | else if i = 0 then Const (STR ''Groups.zero_class.zero'') TYPEREP(integer) | 
| 
f8e6197668c9
correct code equation for term_of on integer
 Andreas Lochbihler parents: 
58036diff
changeset | 136 | else | 
| 
f8e6197668c9
correct code equation for term_of on integer
 Andreas Lochbihler parents: 
58036diff
changeset | 137 | App (Const (STR ''Groups.uminus_class.uminus'') TYPEREP(integer \<Rightarrow> integer)) | 
| 
f8e6197668c9
correct code equation for term_of on integer
 Andreas Lochbihler parents: 
58036diff
changeset | 138 | (term_of (- i)))" | 
| 62597 | 139 | by (rule term_of_anything [THEN meta_eq_to_obj_eq]) | 
| 58036 
f23045003476
add code equation for term_of on integer
 Andreas Lochbihler parents: 
56928diff
changeset | 140 | |
| 39564 | 141 | code_reserved Eval HOLogic | 
| 142 | ||
| 143 | ||
| 60758 | 144 | subsection \<open>Generic reification\<close> | 
| 31178 | 145 | |
| 56928 
1e50fddbe1f5
dropped term_of obfuscation -- not really required;
 haftmann parents: 
56927diff
changeset | 146 | ML_file "~~/src/HOL/Tools/reification.ML" | 
| 31178 | 147 | |
| 148 | ||
| 60758 | 149 | subsection \<open>Diagnostic\<close> | 
| 39387 
6608c4838ff9
replaced ML_Context.evaluate by ML_Context.value -- using context data instead of bare metal references; tuned structures
 haftmann parents: 
39274diff
changeset | 150 | |
| 
6608c4838ff9
replaced ML_Context.evaluate by ML_Context.value -- using context data instead of bare metal references; tuned structures
 haftmann parents: 
39274diff
changeset | 151 | definition tracing :: "String.literal \<Rightarrow> 'a \<Rightarrow> 'a" where | 
| 
6608c4838ff9
replaced ML_Context.evaluate by ML_Context.value -- using context data instead of bare metal references; tuned structures
 haftmann parents: 
39274diff
changeset | 152 | [code del]: "tracing s x = x" | 
| 
6608c4838ff9
replaced ML_Context.evaluate by ML_Context.value -- using context data instead of bare metal references; tuned structures
 haftmann parents: 
39274diff
changeset | 153 | |
| 52435 
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
 haftmann parents: 
52286diff
changeset | 154 | code_printing | 
| 
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
 haftmann parents: 
52286diff
changeset | 155 | constant "tracing :: String.literal => 'a => 'a" \<rightharpoonup> (Eval) "Code'_Evaluation.tracing" | 
| 33473 
3b275a0bf18c
adding tracing function for evaluated code; annotated compilation in the predicate compiler
 bulwahn parents: 
32740diff
changeset | 156 | |
| 31178 | 157 | |
| 40638 
6b137c96df07
adding dummy definition for Code_Evaluation.Abs and hiding constants App less strict
 bulwahn parents: 
39567diff
changeset | 158 | hide_const dummy_term valapp | 
| 51144 | 159 | hide_const (open) Const App Abs Free termify valtermify term_of tracing | 
| 28228 | 160 | |
| 161 | end | |
| 51143 
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
 haftmann parents: 
51126diff
changeset | 162 |