| author | wenzelm | 
| Fri, 14 Mar 2025 23:03:58 +0100 | |
| changeset 82276 | d22e9c5b5dc6 | 
| parent 81706 | 7beb0cf38292 | 
| child 82900 | bd3685e5f883 | 
| 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 | |
| 66013 | 16 | datatype (plugins only: 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 | |
| 72607 | 55 | bundle term_syntax | 
| 31178 | 56 | begin | 
| 81100 | 57 | notation App (infixl \<open><\<cdot>>\<close> 70) and valapp (infixl \<open>{\<cdot>}\<close> 70)
 | 
| 31178 | 58 | end | 
| 59 | ||
| 31191 | 60 | |
| 60758 | 61 | subsection \<open>Tools setup and evaluation\<close> | 
| 39564 | 62 | |
| 63161 
2660ba498798
delegate inclusion of required dictionaries to user-space instead of half-working magic
 haftmann parents: 
62958diff
changeset | 63 | context | 
| 
2660ba498798
delegate inclusion of required dictionaries to user-space instead of half-working magic
 haftmann parents: 
62958diff
changeset | 64 | begin | 
| 
2660ba498798
delegate inclusion of required dictionaries to user-space instead of half-working magic
 haftmann parents: 
62958diff
changeset | 65 | |
| 
2660ba498798
delegate inclusion of required dictionaries to user-space instead of half-working magic
 haftmann parents: 
62958diff
changeset | 66 | qualified definition TERM_OF :: "'a::term_of itself" | 
| 
2660ba498798
delegate inclusion of required dictionaries to user-space instead of half-working magic
 haftmann parents: 
62958diff
changeset | 67 | where | 
| 
2660ba498798
delegate inclusion of required dictionaries to user-space instead of half-working magic
 haftmann parents: 
62958diff
changeset | 68 |   "TERM_OF = snd (Code_Evaluation.term_of :: 'a \<Rightarrow> _, TYPE('a))"
 | 
| 
2660ba498798
delegate inclusion of required dictionaries to user-space instead of half-working magic
 haftmann parents: 
62958diff
changeset | 69 | |
| 
2660ba498798
delegate inclusion of required dictionaries to user-space instead of half-working magic
 haftmann parents: 
62958diff
changeset | 70 | qualified definition TERM_OF_EQUAL :: "'a::term_of itself" | 
| 
2660ba498798
delegate inclusion of required dictionaries to user-space instead of half-working magic
 haftmann parents: 
62958diff
changeset | 71 | where | 
| 
2660ba498798
delegate inclusion of required dictionaries to user-space instead of half-working magic
 haftmann parents: 
62958diff
changeset | 72 |   "TERM_OF_EQUAL = snd (\<lambda>(a::'a). (Code_Evaluation.term_of a, HOL.eq a), TYPE('a))"
 | 
| 
2660ba498798
delegate inclusion of required dictionaries to user-space instead of half-working magic
 haftmann parents: 
62958diff
changeset | 73 | |
| 
2660ba498798
delegate inclusion of required dictionaries to user-space instead of half-working magic
 haftmann parents: 
62958diff
changeset | 74 | end | 
| 
2660ba498798
delegate inclusion of required dictionaries to user-space instead of half-working magic
 haftmann parents: 
62958diff
changeset | 75 | |
| 39567 
5ee997fbe5cc
dynamic_eval_conv static_eval_conv: certification of previously unreliably reconstructed evaluated term
 haftmann parents: 
39564diff
changeset | 76 | lemma eq_eq_TrueD: | 
| 62958 
b41c1cb5e251
Type_Infer.object_logic controls improvement of type inference result;
 wenzelm parents: 
62597diff
changeset | 77 |   fixes x y :: "'a::{}"
 | 
| 39567 
5ee997fbe5cc
dynamic_eval_conv static_eval_conv: certification of previously unreliably reconstructed evaluated term
 haftmann parents: 
39564diff
changeset | 78 | 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 | 79 | shows "x \<equiv> y" | 
| 
5ee997fbe5cc
dynamic_eval_conv static_eval_conv: certification of previously unreliably reconstructed evaluated term
 haftmann parents: 
39564diff
changeset | 80 | using assms by simp | 
| 
5ee997fbe5cc
dynamic_eval_conv static_eval_conv: certification of previously unreliably reconstructed evaluated term
 haftmann parents: 
39564diff
changeset | 81 | |
| 56928 
1e50fddbe1f5
dropped term_of obfuscation -- not really required;
 haftmann parents: 
56927diff
changeset | 82 | code_printing | 
| 
1e50fddbe1f5
dropped term_of obfuscation -- not really required;
 haftmann parents: 
56927diff
changeset | 83 | type_constructor "term" \<rightharpoonup> (Eval) "Term.term" | 
| 
1e50fddbe1f5
dropped term_of obfuscation -- not really required;
 haftmann parents: 
56927diff
changeset | 84 | | constant Const \<rightharpoonup> (Eval) "Term.Const/ ((_), (_))" | 
| 
1e50fddbe1f5
dropped term_of obfuscation -- not really required;
 haftmann parents: 
56927diff
changeset | 85 | | constant App \<rightharpoonup> (Eval) "Term.$/ ((_), (_))" | 
| 
1e50fddbe1f5
dropped term_of obfuscation -- not really required;
 haftmann parents: 
56927diff
changeset | 86 | | constant Abs \<rightharpoonup> (Eval) "Term.Abs/ ((_), (_), (_))" | 
| 
1e50fddbe1f5
dropped term_of obfuscation -- not really required;
 haftmann parents: 
56927diff
changeset | 87 | | constant Free \<rightharpoonup> (Eval) "Term.Free/ ((_), (_))" | 
| 
1e50fddbe1f5
dropped term_of obfuscation -- not really required;
 haftmann parents: 
56927diff
changeset | 88 | |
| 69605 | 89 | ML_file \<open>Tools/code_evaluation.ML\<close> | 
| 39564 | 90 | |
| 81706 | 91 | code_reserved | 
| 92 | (Eval) Code_Evaluation | |
| 39564 | 93 | |
| 69605 | 94 | ML_file \<open>~~/src/HOL/Tools/value_command.ML\<close> | 
| 56928 
1e50fddbe1f5
dropped term_of obfuscation -- not really required;
 haftmann parents: 
56927diff
changeset | 95 | |
| 39564 | 96 | |
| 68028 | 97 | subsection \<open>Dedicated \<open>term_of\<close> instances\<close> | 
| 39564 | 98 | |
| 99 | instantiation "fun" :: (typerep, typerep) term_of | |
| 100 | begin | |
| 101 | ||
| 102 | definition | |
| 61076 | 103 | "term_of (f :: 'a \<Rightarrow> 'b) = | 
| 56241 | 104 | Const (STR ''Pure.dummy_pattern'') | 
| 105 |       (Typerep.Typerep (STR ''fun'') [Typerep.typerep TYPE('a), Typerep.typerep TYPE('b)])"
 | |
| 39564 | 106 | |
| 107 | instance .. | |
| 108 | ||
| 109 | end | |
| 110 | ||
| 66013 | 111 | declare [[code drop: rec_term case_term | 
| 56926 | 112 | "term_of :: typerep \<Rightarrow> _" "term_of :: term \<Rightarrow> _" "term_of :: String.literal \<Rightarrow> _" | 
| 113 | "term_of :: _ Predicate.pred \<Rightarrow> term" "term_of :: _ Predicate.seq \<Rightarrow> term"]] | |
| 39564 | 114 | |
| 52435 
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
 haftmann parents: 
52286diff
changeset | 115 | code_printing | 
| 61076 | 116 | constant "term_of :: integer \<Rightarrow> term" \<rightharpoonup> (Eval) "HOLogic.mk'_number/ HOLogic.code'_integerT" | 
| 117 | | constant "term_of :: String.literal \<Rightarrow> term" \<rightharpoonup> (Eval) "HOLogic.mk'_literal" | |
| 39564 | 118 | |
| 58036 
f23045003476
add code equation for term_of on integer
 Andreas Lochbihler parents: 
56928diff
changeset | 119 | declare [[code drop: "term_of :: integer \<Rightarrow> _"]] | 
| 
f23045003476
add code equation for term_of on integer
 Andreas Lochbihler parents: 
56928diff
changeset | 120 | |
| 
f23045003476
add code equation for term_of on integer
 Andreas Lochbihler parents: 
56928diff
changeset | 121 | 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 | 122 | "term_of (i :: integer) = | 
| 
f8e6197668c9
correct code equation for term_of on integer
 Andreas Lochbihler parents: 
58036diff
changeset | 123 | (if i > 0 then | 
| 
f8e6197668c9
correct code equation for term_of on integer
 Andreas Lochbihler parents: 
58036diff
changeset | 124 | 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 | 125 | (term_of (num_of_integer i)) | 
| 
f8e6197668c9
correct code equation for term_of on integer
 Andreas Lochbihler parents: 
58036diff
changeset | 126 | 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 | 127 | else | 
| 
f8e6197668c9
correct code equation for term_of on integer
 Andreas Lochbihler parents: 
58036diff
changeset | 128 | 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 | 129 | (term_of (- i)))" | 
| 62597 | 130 | 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 | 131 | |
| 81706 | 132 | code_reserved | 
| 133 | (Eval) HOLogic | |
| 39564 | 134 | |
| 135 | ||
| 60758 | 136 | subsection \<open>Generic reification\<close> | 
| 31178 | 137 | |
| 69605 | 138 | ML_file \<open>~~/src/HOL/Tools/reification.ML\<close> | 
| 31178 | 139 | |
| 140 | ||
| 60758 | 141 | 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 | 142 | |
| 
6608c4838ff9
replaced ML_Context.evaluate by ML_Context.value -- using context data instead of bare metal references; tuned structures
 haftmann parents: 
39274diff
changeset | 143 | 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 | 144 | [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 | 145 | |
| 52435 
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
 haftmann parents: 
52286diff
changeset | 146 | code_printing | 
| 
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
 haftmann parents: 
52286diff
changeset | 147 | 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 | 148 | |
| 31178 | 149 | |
| 40638 
6b137c96df07
adding dummy definition for Code_Evaluation.Abs and hiding constants App less strict
 bulwahn parents: 
39567diff
changeset | 150 | hide_const dummy_term valapp | 
| 51144 | 151 | hide_const (open) Const App Abs Free termify valtermify term_of tracing | 
| 28228 | 152 | |
| 153 | end |