diff options
author | Pierre Boutillier <pierre.boutillier@pps.univ-paris-diderot.fr> | 2014-12-12 15:09:31 +0100 |
---|---|---|
committer | Pierre Boutillier <pierre.boutillier@pps.univ-paris-diderot.fr> | 2014-12-12 16:45:15 +0100 |
commit | ecffc17548bada990da2c222c178ce76efc17e58 (patch) | |
tree | a8dae18e6c0f2ff4a3dd84133c184bb02a7f9c5e /proofs | |
parent | 724797b1f0e7051a52f30ff0cc432db2cc9345ec (diff) |
An option SimplIsCbn
Diffstat (limited to 'proofs')
-rw-r--r-- | proofs/redexpr.ml | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/proofs/redexpr.ml b/proofs/redexpr.ml index c07541335..fad2af005 100644 --- a/proofs/redexpr.ml +++ b/proofs/redexpr.ml @@ -34,6 +34,24 @@ let cbv_native env sigma c = let evars = Nativenorm.evars_of_evar_map sigma in Nativenorm.native_norm env evars c ctyp +let whd_cbn flags env sigma t = + let (state,_) = + (whd_state_gen true flags env sigma (t,Reductionops.Stack.empty)) + in Reductionops.Stack.zip ~refold:true state + +let strong_cbn flags = + strong (whd_cbn flags) + +let simplIsCbn = ref (false) +let _ = Goptions.declare_bool_option { + Goptions.optsync = true; Goptions.optdepr = false; + Goptions.optname = + "Plug the simpl tactic to the new cbn mechanism"; + Goptions.optkey = ["SimplIsCbn"]; + Goptions.optread = (fun () -> !simplIsCbn); + Goptions.optwrite = (fun a -> simplIsCbn:=a); +} + let set_strategy_one ref l = let k = match ref with @@ -195,13 +213,16 @@ let reduction_of_red_expr env = if internal then (e_red try_red_product,DEFAULTcast) else (e_red red_product,DEFAULTcast) | Hnf -> (e_red hnf_constr,DEFAULTcast) - | Simpl (_f,o) -> - (contextualize (if head_style then whd_simpl else simpl) simpl o,DEFAULTcast) + | Simpl (f,o) -> + let whd_am = if !simplIsCbn then whd_cbn (make_flag f) else whd_simpl in + let am = if !simplIsCbn then strong_cbn (make_flag f) else simpl in + let () = + if not (!simplIsCbn || List.is_empty f.rConst) then + Pp.msg_warning (Pp.strbrk "The legacy simpl does not deal with delta flags.") in + (contextualize (if head_style then whd_am else am) am o,DEFAULTcast) | Cbv f -> (e_red (cbv_norm_flags (make_flag f)),DEFAULTcast) | Cbn f -> - let f = strong (fun env evd x -> Stack.zip ~refold:true - (fst (whd_state_gen true (make_flag f) env evd (x, Stack.empty)))) in - (e_red f, DEFAULTcast) + (e_red (strong_cbn (make_flag f)), DEFAULTcast) | Lazy f -> (e_red (clos_norm_flags (make_flag f)),DEFAULTcast) | Unfold ubinds -> (e_red (unfoldn (List.map out_with_occurrences ubinds)),DEFAULTcast) | Fold cl -> (e_red (fold_commands cl),DEFAULTcast) |