X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=components%2Ftactics%2FproofEngineReduction.ml;h=1db075c70d96455a80c15ab49865eb3a02cde7be;hb=1a65db059b643422fc8eded4f4e03b512071515b;hp=1502b600f3c6122b4f37f0918bfe7aeb0e2f2384;hpb=0f06e39d49460377dfa214b3d471b71cb9111f48;p=helm.git diff --git a/components/tactics/proofEngineReduction.ml b/components/tactics/proofEngineReduction.ml index 1502b600f..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) @@ -701,7 +717,7 @@ let simpl context = reduceaux context tl' body' | t -> t in - (match decofix (CicReduction.whd context term) with + (match decofix (reduceaux context [] term) (*(CicReduction.whd context term)*) with C.MutConstruct (_,_,j,_) -> reduceaux context l (List.nth pl (j-1)) | C.Appl (C.MutConstruct (_,_,j,_) :: tl) -> let (arity, r) = @@ -814,7 +830,7 @@ let simpl context = with _ -> raise AlreadySimplified in - (match CicReduction.whd context recparam with + (match reduceaux context [] recparam (*CicReduction.whd context recparam*) with C.MutConstruct _ | C.Appl ((C.MutConstruct _)::_) -> let body' =