From: Claudio Sacerdoti Coen Date: Wed, 8 Mar 2006 14:47:37 +0000 (+0000) Subject: Reduction trick added to simplify (greatly speeding up some examples X-Git-Tag: 0.4.95@7852~1614 X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=commitdiff_plain;h=b52068a8a5d0af94ad09c93ae63aed3424fbb924;p=helm.git Reduction trick added to simplify (greatly speeding up some examples in library/algebra. For instance, a simplification that used to be performed in more than 4h now takes less than 1s). The idea is simply to avoid delta-reduction of a constant applied to arguments that are not "active" (i.e. they cannot create a redex when substituted in the body of the constant). --- diff --git a/components/tactics/proofEngineReduction.ml b/components/tactics/proofEngineReduction.ml index db25ae575..1db075c70 100644 --- a/components/tactics/proofEngineReduction.ml +++ b/components/tactics/proofEngineReduction.ml @@ -595,12 +595,24 @@ exception AlreadySimplified;; (*CSC: It does not perform simplification in a Case *) let simpl context = + let module C = Cic in + let module S = CicSubstitution in + (* a simplified term is active if it can create a redex when used as an *) + (* actual parameter *) + let rec is_active = + function + C.Lambda _ + | C.MutConstruct _ + | C.Appl (C.MutConstruct _::_) + | C.CoFix _ -> true + | C.Cast (bo,_) -> is_active bo + | C.LetIn _ -> assert false + | _ -> false + in (* reduceaux is equal to the reduceaux locally defined inside *) (* reduce, but for the const case. *) (**** Step 1 ****) let rec reduceaux context l = - let module C = Cic in - let module S = CicSubstitution in function C.Rel n as t -> (* we never perform delta expansion automatically *) @@ -653,9 +665,13 @@ let simpl context = (let o,_ = CicEnvironment.get_obj CicUniv.empty_ugraph uri in match o with C.Constant (_,Some body,_,_,_) -> - try_delta_expansion context l - (C.Const (uri,exp_named_subst')) - (CicSubstitution.subst_vars exp_named_subst' body) + if List.exists is_active l then + try_delta_expansion context l + (C.Const (uri,exp_named_subst')) + (CicSubstitution.subst_vars exp_named_subst' body) + else + let t' = C.Const (uri,exp_named_subst') in + if l = [] then t' else C.Appl (t'::l) | C.Constant (_,None,_,_,_) -> let t' = C.Const (uri,exp_named_subst') in if l = [] then t' else C.Appl (t'::l)