src/Tools/Code/code_simp.ML
changeset 63164 72aaf69328fc
parent 63160 80a91e0e236e
child 69593 3dda49e08b9d
equal deleted inserted replaced
63163:b561284a4214 63164:72aaf69328fc
    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;