equal
deleted
inserted
replaced
28 val empty = empty_ss; |
28 val empty = empty_ss; |
29 val extend = I; |
29 val extend = I; |
30 val merge = merge_ss; |
30 val merge = merge_ss; |
31 ); |
31 ); |
32 |
32 |
33 fun map_ss f thy = Simpset.map (simpset_map (Proof_Context.init_global thy) f) thy; |
33 fun map_ss f thy = |
|
34 Simpset.map (simpset_map (Proof_Context.init_global thy) f) thy; |
34 |
35 |
35 fun simpset_default ctxt some_ss = the_default (Simpset.get (Proof_Context.theory_of ctxt)) some_ss; |
36 fun simpset_default ctxt some_ss = |
|
37 the_default (Simpset.get (Proof_Context.theory_of ctxt)) some_ss; |
36 |
38 |
37 |
39 |
38 (* diagnostic *) |
40 (* diagnostic *) |
39 |
41 |
40 val trace = Attrib.setup_config_bool @{binding "code_simp_trace"} (K false); |
42 val trace = Attrib.setup_config_bool @{binding "code_simp_trace"} (K false); |
58 |> fold Simplifier.add_simp (map (fst o snd) inst_params) |
60 |> fold Simplifier.add_simp (map (fst o snd) inst_params) |
59 | add_stmt _ ss = ss; |
61 | add_stmt _ ss = ss; |
60 |
62 |
61 val add_program = Code_Symbol.Graph.fold (add_stmt o fst o snd); |
63 val add_program = Code_Symbol.Graph.fold (add_stmt o fst o snd); |
62 |
64 |
63 fun simpset_program ctxt some_ss program = |
65 val simpset_program = |
64 simpset_map ctxt (add_program program) (simpset_default ctxt some_ss); |
66 Code_Preproc.timed "building simpset" #ctxt |
|
67 (fn { ctxt, some_ss, program } => simpset_map ctxt (add_program program) (simpset_default ctxt some_ss)); |
65 |
68 |
66 fun rewrite_modulo ctxt some_ss program = |
69 fun rewrite_modulo ctxt some_ss program = |
67 let |
70 let |
68 val ss = simpset_program ctxt some_ss program; |
71 val ss = simpset_program |
69 in fn ctxt => Simplifier.full_rewrite (ctxt |> put_simpset ss |> set_trace) end; |
72 { ctxt = ctxt, some_ss = some_ss, program = program }; |
|
73 in fn ctxt => |
|
74 Code_Preproc.timed_conv "simplifying" |
|
75 Simplifier.full_rewrite (ctxt |> put_simpset ss |> set_trace) |
|
76 end; |
70 |
77 |
71 fun conclude_tac ctxt some_ss = |
78 fun conclude_tac ctxt some_ss = |
72 let |
79 let |
73 val ss = simpset_default ctxt some_ss |
80 val ss = simpset_default ctxt some_ss |
74 in fn ctxt => Simplifier.full_simp_tac (ctxt |> put_simpset ss) end; |
81 in fn ctxt => Simplifier.full_simp_tac (ctxt |> put_simpset ss) end; |
93 |
100 |
94 (* evaluation with static code context *) |
101 (* evaluation with static code context *) |
95 |
102 |
96 fun static_conv { ctxt, simpset, consts } = |
103 fun static_conv { ctxt, simpset, consts } = |
97 Code_Thingol.static_conv_isa { ctxt = ctxt, consts = consts } |
104 Code_Thingol.static_conv_isa { ctxt = ctxt, consts = consts } |
98 (fn program => K o rewrite_modulo ctxt simpset program); |
105 (fn program => let |
|
106 val conv = rewrite_modulo ctxt simpset program |
|
107 in fn ctxt => fn _ => conv ctxt end); |
99 |
108 |
100 fun static_tac { ctxt, simpset, consts } = |
109 fun static_tac { ctxt, simpset, consts } = |
101 let |
110 let |
102 val conv = static_conv { ctxt = ctxt, simpset = simpset, consts = consts }; |
111 val conv = static_conv { ctxt = ctxt, simpset = simpset, consts = consts }; |
103 val tac = conclude_tac ctxt simpset; |
112 val tac = conclude_tac ctxt simpset; |