| author | blanchet | 
| Mon, 04 Apr 2016 09:45:04 +0200 | |
| changeset 62842 | db9f95ca2a8f | 
| parent 59633 | a372513af1e2 | 
| child 63156 | 3cb84e4469a7 | 
| permissions | -rw-r--r-- | 
| 37744 | 1 | (* Title: Tools/Code/code_simp.ML | 
| 37442 | 2 | Author: Florian Haftmann, TU Muenchen | 
| 3 | ||
| 4 | Connecting the simplifier and the code generator. | |
| 5 | *) | |
| 6 | ||
| 7 | signature CODE_SIMP = | |
| 8 | sig | |
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
48072diff
changeset | 9 | val map_ss: (Proof.context -> Proof.context) -> theory -> theory | 
| 55757 | 10 | val dynamic_conv: Proof.context -> conv | 
| 11 | val dynamic_tac: Proof.context -> int -> tactic | |
| 12 | val dynamic_value: Proof.context -> term -> term | |
| 56973 
62da80041afd
syntactic means to prevent accidental mixup of static and dynamic context
 haftmann parents: 
56969diff
changeset | 13 |   val static_conv: { ctxt: Proof.context, simpset: simpset option, consts: string list }
 | 
| 
62da80041afd
syntactic means to prevent accidental mixup of static and dynamic context
 haftmann parents: 
56969diff
changeset | 14 | -> Proof.context -> conv | 
| 
62da80041afd
syntactic means to prevent accidental mixup of static and dynamic context
 haftmann parents: 
56969diff
changeset | 15 |   val static_tac: { ctxt: Proof.context, simpset: simpset option, consts: string list }
 | 
| 
62da80041afd
syntactic means to prevent accidental mixup of static and dynamic context
 haftmann parents: 
56969diff
changeset | 16 | -> Proof.context -> int -> tactic | 
| 53147 | 17 | val trace: bool Config.T | 
| 37442 | 18 | end; | 
| 19 | ||
| 20 | structure Code_Simp : CODE_SIMP = | |
| 21 | struct | |
| 22 | ||
| 23 | (* dedicated simpset *) | |
| 24 | ||
| 38759 
37a9092de102
simplification/standardization of some theory data;
 wenzelm parents: 
38671diff
changeset | 25 | structure Simpset = Theory_Data | 
| 
37a9092de102
simplification/standardization of some theory data;
 wenzelm parents: 
38671diff
changeset | 26 | ( | 
| 37442 | 27 | type T = simpset; | 
| 28 | val empty = empty_ss; | |
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
48072diff
changeset | 29 | val extend = I; | 
| 37442 | 30 | val merge = merge_ss; | 
| 31 | ); | |
| 32 | ||
| 51717 
9e7d1c139569
simplifier uses proper Proof.context instead of historic type simpset;
 wenzelm parents: 
48072diff
changeset | 33 | fun map_ss f thy = Simpset.map (simpset_map (Proof_Context.init_global thy) f) thy; | 
| 37442 | 34 | |
| 55757 | 35 | fun simpset_default ctxt some_ss = the_default (Simpset.get (Proof_Context.theory_of ctxt)) some_ss; | 
| 54929 
f1ded3cea58d
proper context for simplifier invocations in code generation stack
 haftmann parents: 
54928diff
changeset | 36 | |
| 37442 | 37 | |
| 54928 | 38 | (* diagnostic *) | 
| 53147 | 39 | |
| 40 | val trace = Attrib.setup_config_bool @{binding "code_simp_trace"} (K false);
 | |
| 41 | ||
| 42 | fun set_trace ctxt = | |
| 43 | let | |
| 44 | val global = Config.get ctxt trace; | |
| 45 | in | |
| 46 | ctxt |> Config.map Simplifier.simp_trace (fn b => b orelse global) | |
| 47 | end; | |
| 48 | ||
| 49 | ||
| 55757 | 50 | (* build simpset context and conversion from program *) | 
| 37442 | 51 | |
| 55147 
bce3dbc11f95
prefer explicit code symbol type over ad-hoc name mangling
 haftmann parents: 
54929diff
changeset | 52 | fun add_stmt (Code_Thingol.Fun ((_, eqs), some_cong)) ss = | 
| 52736 
317663b422bb
more correct context for dynamic invocations of static code conversions etc.
 haftmann parents: 
51717diff
changeset | 53 | ss | 
| 
317663b422bb
more correct context for dynamic invocations of static code conversions etc.
 haftmann parents: 
51717diff
changeset | 54 | |> fold Simplifier.add_simp ((map_filter (fst o snd)) eqs) | 
| 45620 
f2a587696afb
modernized some old-style infix operations, which were left over from the time of ML proof scripts;
 wenzelm parents: 
43619diff
changeset | 55 | |> fold Simplifier.add_cong (the_list some_cong) | 
| 48072 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
47576diff
changeset | 56 |   | add_stmt (Code_Thingol.Classinst { inst_params, ... }) ss =
 | 
| 52736 
317663b422bb
more correct context for dynamic invocations of static code conversions etc.
 haftmann parents: 
51717diff
changeset | 57 | ss | 
| 
317663b422bb
more correct context for dynamic invocations of static code conversions etc.
 haftmann parents: 
51717diff
changeset | 58 | |> fold Simplifier.add_simp (map (fst o snd) inst_params) | 
| 37442 | 59 | | add_stmt _ ss = ss; | 
| 60 | ||
| 55147 
bce3dbc11f95
prefer explicit code symbol type over ad-hoc name mangling
 haftmann parents: 
54929diff
changeset | 61 | val add_program = Code_Symbol.Graph.fold (add_stmt o fst o snd); | 
| 37442 | 62 | |
| 55757 | 63 | fun simpset_program ctxt some_ss program = | 
| 64 | simpset_map ctxt (add_program program) (simpset_default ctxt some_ss); | |
| 37461 | 65 | |
| 55757 | 66 | fun rewrite_modulo ctxt some_ss program = | 
| 67 | let | |
| 68 | val ss = simpset_program ctxt some_ss program; | |
| 69 | in fn ctxt => Simplifier.full_rewrite (ctxt |> put_simpset ss |> set_trace) end; | |
| 52736 
317663b422bb
more correct context for dynamic invocations of static code conversions etc.
 haftmann parents: 
51717diff
changeset | 70 | |
| 55757 | 71 | fun conclude_tac ctxt some_ss = | 
| 72 | let | |
| 73 | val ss = simpset_default ctxt some_ss | |
| 74 | in fn ctxt => Simplifier.full_simp_tac (ctxt |> put_simpset ss) end; | |
| 37442 | 75 | |
| 76 | ||
| 39486 | 77 | (* evaluation with dynamic code context *) | 
| 37442 | 78 | |
| 55757 | 79 | fun dynamic_conv ctxt = Code_Thingol.dynamic_conv ctxt | 
| 56969 
7491932da574
dropped obsolete hand-waving adjustion of type variables: safely done in preprocessor
 haftmann parents: 
56924diff
changeset | 80 | (fn program => fn _ => fn _ => rewrite_modulo ctxt NONE program ctxt); | 
| 37442 | 81 | |
| 55757 | 82 | fun dynamic_tac ctxt = CONVERSION (dynamic_conv ctxt) | 
| 83 | THEN' conclude_tac ctxt NONE ctxt; | |
| 37442 | 84 | |
| 55757 | 85 | fun dynamic_value ctxt = | 
| 59633 | 86 | snd o Logic.dest_equals o Thm.prop_of o dynamic_conv ctxt o Thm.cterm_of ctxt; | 
| 37444 | 87 | |
| 59323 | 88 | val _ = Theory.setup | 
| 89 |   (Method.setup @{binding code_simp}
 | |
| 55757 | 90 | (Scan.succeed (SIMPLE_METHOD' o (CHANGED_PROP oo dynamic_tac))) | 
| 59323 | 91 | "simplification with code equations"); | 
| 37442 | 92 | |
| 93 | ||
| 39486 | 94 | (* evaluation with static code context *) | 
| 37442 | 95 | |
| 56973 
62da80041afd
syntactic means to prevent accidental mixup of static and dynamic context
 haftmann parents: 
56969diff
changeset | 96 | fun static_conv { ctxt, simpset, consts } =
 | 
| 
62da80041afd
syntactic means to prevent accidental mixup of static and dynamic context
 haftmann parents: 
56969diff
changeset | 97 |   Code_Thingol.static_conv_simple { ctxt = ctxt, consts = consts }
 | 
| 
62da80041afd
syntactic means to prevent accidental mixup of static and dynamic context
 haftmann parents: 
56969diff
changeset | 98 | (K oo rewrite_modulo ctxt simpset); | 
| 37442 | 99 | |
| 56973 
62da80041afd
syntactic means to prevent accidental mixup of static and dynamic context
 haftmann parents: 
56969diff
changeset | 100 | fun static_tac { ctxt, simpset, consts } =
 | 
| 52736 
317663b422bb
more correct context for dynamic invocations of static code conversions etc.
 haftmann parents: 
51717diff
changeset | 101 | let | 
| 56973 
62da80041afd
syntactic means to prevent accidental mixup of static and dynamic context
 haftmann parents: 
56969diff
changeset | 102 |     val conv = static_conv { ctxt = ctxt, simpset = simpset, consts = consts };
 | 
| 
62da80041afd
syntactic means to prevent accidental mixup of static and dynamic context
 haftmann parents: 
56969diff
changeset | 103 | val tac = conclude_tac ctxt simpset; | 
| 55757 | 104 | in fn ctxt' => CONVERSION (conv ctxt') THEN' (tac ctxt') end; | 
| 37442 | 105 | |
| 106 | end; |