X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Fcomponents%2Facic_procedural%2FproceduralOptimizer.ml;h=c5a27efc44942bbd8e7b028a99791779e9be9a47;hb=6daa2cc113783aaba53d82c47fe7107988d76e11;hp=f1840cf7c95c75cf37877712fdfa70fdb66caa34;hpb=987627a48b2a3c2345d1af2c2a6b1ab78aa90b58;p=helm.git diff --git a/helm/software/components/acic_procedural/proceduralOptimizer.ml b/helm/software/components/acic_procedural/proceduralOptimizer.ml index f1840cf7c..c5a27efc4 100644 --- a/helm/software/components/acic_procedural/proceduralOptimizer.ml +++ b/helm/software/components/acic_procedural/proceduralOptimizer.ml @@ -81,7 +81,7 @@ let rec add_abst k = function | t -> C.Lambda (C.Anonymous, C.Implicit None, S.lift 1 t) let rec opt_letin g st es c name v w t = - let name = H.mk_fresh_name c name in + let name = H.mk_fresh_name true c name in let entry = Some (name, C.Def (v, w)) in let g st t = if DTI.does_not_occur 1 t then @@ -99,7 +99,9 @@ let rec opt_letin g st es c name v w t = | v when H.is_proof c v && H.is_atomic v -> let x = S.subst v t in opt_proof g (info st "Optimizer: remove 5") true c x - | v -> +(* | v when t = C.Rel 1 -> + g (info st "Optimizer: remove 6") v +*) | v -> g st (C.LetIn (name, v, w, t)) in if es then opt_term g st es c v else g st v @@ -107,7 +109,7 @@ let rec opt_letin g st es c name v w t = if es then opt_proof g st es (entry :: c) t else g st t and opt_lambda g st es c name w t = - let name = H.mk_fresh_name c name in + let name = H.mk_fresh_name true c name in let entry = Some (name, C.Decl w) in let g st t = g st (C.Lambda (name, w, t)) in if es then opt_proof g st es (entry :: c) t else g st t @@ -185,7 +187,15 @@ and opt_mutcase_critical g st es c uri tyno outty arg cases = let ps, sort_disp = H.get_ind_parameters c arg in let lps, rps = HEL.split_nth lpsno ps in let rpsno = List.length rps in + if rpsno = 0 && sort_disp = 0 then +(* FG: the transformation is not possible, we fall back into the plain case *) + opt_mutcase_plain g st es c uri tyno outty arg cases + else let predicate = clear_absts rpsno (1 - sort_disp) outty in + if H.occurs c ~what:(C.Rel 0) ~where:predicate then +(* FG: the transformation is not possible, we fall back into the plain case *) + opt_mutcase_plain g st es c uri tyno outty arg cases + else let is_recursive t = I.S.mem tyno (I.get_mutinds_of_uri uri t) in @@ -205,12 +215,23 @@ and opt_mutcase_critical g st es c uri tyno outty arg cases = in let lifted_cases = List.map2 map2 cases constructors in let args = eliminator :: lps @ predicate :: lifted_cases @ rps @ [arg] in - let x = H.refine c (C.Appl args) in - opt_proof g (info st "Optimizer: remove 3") es c x + try + let x = H.refine c (C.Appl args) in + opt_proof g (info st "Optimizer: remove 3") es c x + with e -> +(* FG: the transformation is not possible, we fall back into the plain case *) + let st = info st ("Optimizer: refine_error: " ^ Printexc.to_string e) in + opt_mutcase_plain g st es c uri tyno outty arg cases and opt_mutcase_plain g st es c uri tyno outty arg cases = - let g st v ts = g st (C.MutCase (uri, tyno, outty, v, ts)) in - g st arg cases + let g st v = + let g (st, ts) = g st (C.MutCase (uri, tyno, outty, v, ts)) in + let map h v (st, vs) = + let h st vv = h (st, vv :: vs) in opt_proof h st es c v + in + if es then H.list_fold_right_cps g map cases (st, []) else g (st, cases) + in + if es then opt_proof g st es c arg else g st arg and opt_mutcase g = if !critical then opt_mutcase_critical g else opt_mutcase_plain g @@ -247,7 +268,16 @@ let wrap g st c bo = let optimize_obj = function | C.Constant (name, Some bo, ty, pars, attrs) -> + let count_nodes = I.count_nodes ~meta:false 0 in let st, c = {info = ""; dummy = ()}, [] in + L.time_stamp ("PO: OPTIMIZING " ^ name); + let nodes = Printf.sprintf "Initial nodes: %u" (count_nodes bo) in + if !debug then begin + Printf.eprintf "BEGIN: %s\n" name; + Printf.eprintf "Initial : %s\n" (Pp.ppterm bo); + prerr_string "Ut.pp_term : "; + Ut.pp_term prerr_string [] c bo; prerr_newline () + end; let bo, ty = H.cic_bc c bo, H.cic_bc c ty in let g st bo = if !debug then begin @@ -256,14 +286,11 @@ let optimize_obj = function Ut.pp_term prerr_string [] c bo; prerr_newline () end; (* let _ = H.get_type "opt" [] (C.Cast (bo, ty)) in *) - let nodes = Printf.sprintf "Optimized nodes: %u" (I.count_nodes 0 bo) in + let nodes = Printf.sprintf "Optimized nodes: %u" (count_nodes bo) in let st = info st nodes in L.time_stamp ("PO: DONE " ^ name); C.Constant (name, Some bo, ty, pars, attrs), st.info in - L.time_stamp ("PO: OPTIMIZING " ^ name); - if !debug then Printf.eprintf "BEGIN: %s\n" name; - let nodes = Printf.sprintf "Initial nodes: %u" (I.count_nodes 0 bo) in wrap g (info st nodes) c bo | obj -> obj, ""