X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Focaml%2Ftactics%2FproofEngineReduction.ml;h=0a1f13a78ffd0d04072c223fbdcdda06c39f4068;hb=afa05d30f20de12e031c3e5c3e5c33c19c42a7d8;hp=cced961c0fa54b838d25940805971554818d5540;hpb=d3314de1ff7affc9c82b8b4b63453a36ce2bcf64;p=helm.git diff --git a/helm/ocaml/tactics/proofEngineReduction.ml b/helm/ocaml/tactics/proofEngineReduction.ml index cced961c0..0a1f13a78 100644 --- a/helm/ocaml/tactics/proofEngineReduction.ml +++ b/helm/ocaml/tactics/proofEngineReduction.ml @@ -206,7 +206,7 @@ let replace_lifting ~equality ~what ~with_what ~where = List.map (function (uri,t) -> uri,substaux k what t) exp_named_subst in C.Var (uri,exp_named_subst') - | C.Meta (i, l) as t -> + | C.Meta (i, l) -> let l' = List.map (function @@ -298,14 +298,14 @@ let replace_lifting_csc nnn ~equality ~what ~with_what ~where = S.lift (k-1) (find_image t) with Not_found -> match t with - C.Rel n as t -> + C.Rel n -> if n < k then C.Rel n else C.Rel (n + nnn) | C.Var (uri,exp_named_subst) -> let exp_named_subst' = List.map (function (uri,t) -> uri,substaux k t) exp_named_subst in C.Var (uri,exp_named_subst') - | C.Meta (i, l) as t -> + | C.Meta (i, l) -> let l' = List.map (function @@ -450,7 +450,7 @@ let reduce context = in let t' = C.MutInd (uri,i,exp_named_subst') in if l = [] then t' else C.Appl (t'::l) - | C.MutConstruct (uri,i,j,exp_named_subst) as t -> + | C.MutConstruct (uri,i,j,exp_named_subst) -> let exp_named_subst' = reduceaux_exp_named_subst context l exp_named_subst in @@ -459,10 +459,7 @@ let reduce context = | C.MutCase (mutind,i,outtype,term,pl) -> let decofix = function - C.CoFix (i,fl) as t -> - let tys = - List.map (function (name,ty,_) -> Some (C.Name name, C.Decl ty)) fl - in + C.CoFix (i,fl) -> let (_,_,body) = List.nth fl i in let body' = let counter = ref (List.length fl) in @@ -473,9 +470,6 @@ let reduce context = in reduceaux context [] body' | C.Appl (C.CoFix (i,fl) :: tl) -> - let tys = - List.map (function (name,ty,_) -> Some (C.Name name, C.Decl ty)) fl - in let (_,_,body) = List.nth fl i in let body' = let counter = ref (List.length fl) in @@ -583,32 +577,23 @@ exception AlreadySimplified;; (* Takes a well-typed term and *) (* 1) Performs beta-iota-zeta reduction until delta reduction is needed *) -(* Zeta-reduction is performed if and only if the simplified form of its *) -(* definiendum (applied to the actual arguments) is different from the *) -(* non-simplified form. *) (* 2) Attempts delta-reduction. If the residual is a Fix lambda-abstracted *) (* w.r.t. zero or more variables and if the Fix can be reductaed, than it*) (* is reduced, the delta-reduction is succesfull and the whole algorithm *) -(* is applied again to the new redex; Step 3) is applied to the result *) +(* is applied again to the new redex; Step 3.1) is applied to the result *) (* of the recursive simplification. Otherwise, if the Fix can not be *) (* reduced, than the delta-reductions fails and the delta-redex is *) (* not reduced. Otherwise, if the delta-residual is not the *) -(* lambda-abstraction of a Fix, then it is reduced and the result is *) -(* directly returned, without performing step 3). *) -(* 3) Folds the application of the constant to the arguments that did not *) +(* lambda-abstraction of a Fix, then it performs step 3.2). *) +(* 3.1) Folds the application of the constant to the arguments that did not *) (* change in every iteration, i.e. to the actual arguments for the *) (* lambda-abstractions that precede the Fix. *) +(* 3.2) Computes the head beta-zeta normal form of the term. Then it tries *) +(* reductions. If the reduction cannot be performed, it returns the *) +(* original term (not the head beta-zeta normal form of the definiendum) *) (*CSC: It does not perform simplification in a Case *) let simpl context = - let mk_appl t l = - if l = [] then - t - else - match t with - | Cic.Appl l' -> Cic.Appl (l'@l) - | _ -> Cic.Appl (t::l) - in (* reduceaux is equal to the reduceaux locally defined inside *) (* reduce, but for the const case. *) (**** Step 1 ****) @@ -621,13 +606,7 @@ let simpl context = match List.nth context (n-1) with Some (_,C.Decl _) -> if l = [] then t else C.Appl (t::l) | Some (_,C.Def (bo,_)) -> - let lifted_bo = S.lift n bo in - let applied_lifted_bo = mk_appl lifted_bo l in - let simplified = try_delta_expansion context l t lifted_bo in - if simplified = applied_lifted_bo then - if l = [] then t else C.Appl (t::l) - else - simplified + try_delta_expansion context l t (S.lift n bo) | None -> raise RelToHiddenHypothesis with Failure _ -> assert false) @@ -704,9 +683,7 @@ let simpl context = | C.MutCase (mutind,i,outtype,term,pl) -> let decofix = function - C.CoFix (i,fl) as t -> - let tys = - List.map (function (name,ty,_) -> Some (C.Name name, C.Decl ty)) fl in + C.CoFix (i,fl) -> let (_,_,body) = List.nth fl i in let body' = let counter = ref (List.length fl) in @@ -728,7 +705,7 @@ let simpl context = body in let tl' = List.map (reduceaux context []) tl in - reduceaux context tl body' + reduceaux context tl' body' | t -> t in (match decofix (CicReduction.whd context term) with @@ -825,7 +802,7 @@ let simpl context = let res,constant_args = let rec aux rev_constant_args l = function - C.Lambda (name,s,t) as t' -> + C.Lambda (name,s,t) -> begin match l with [] -> raise WrongShape @@ -836,11 +813,7 @@ let simpl context = end | C.LetIn (_,s,t) -> aux rev_constant_args l (S.subst s t) - | C.Fix (i,fl) as t -> - let tys = - List.map (function (name,_,ty,_) -> - Some (C.Name name, C.Decl ty)) fl - in + | C.Fix (i,fl) -> let (_,recindex,_,body) = List.nth fl i in let recparam = try @@ -868,7 +841,7 @@ let simpl context = in aux [] l body in - (**** Step 3 ****) + (**** Step 3.1 ****) let term_to_fold, delta_expanded_term_to_fold = match constant_args with [] -> term,body @@ -880,9 +853,28 @@ let simpl context = replace (=) [simplified_term_to_fold] [term_to_fold] res with WrongShape -> - (* The constant does not unfold to a Fix lambda-abstracted *) - (* w.r.t. zero or more variables. We just perform reduction.*) - reduceaux context l body + (**** Step 3.2 ****) + let rec aux l = + function + C.Lambda (name,s,t) -> + (match l with + [] -> raise AlreadySimplified + | he::tl -> + (* when name is Anonimous the substitution should *) + (* be superfluous *) + aux tl (S.subst he t)) + | C.LetIn (_,s,t) -> aux l (S.subst s t) + | t -> + let simplified = reduceaux context l t in + if t = simplified then + raise AlreadySimplified + else + simplified + in + (try aux l body + with + AlreadySimplified -> + if l = [] then term else C.Appl (term::l)) | AlreadySimplified -> (* If we performed delta-reduction, we would find a Fix *) (* not applied to a constructor. So, we refuse to perform *) @@ -893,7 +885,8 @@ let simpl context = ;; let unfold ?what context where = - let first_is_the_expandable_head_of_second t1 t2 = + let contextlen = List.length context in + let first_is_the_expandable_head_of_second context' t1 t2 = match t1,t2 with Cic.Const (uri,_), Cic.Const (uri',_) | Cic.Var (uri,_), Cic.Var (uri',_) @@ -901,17 +894,21 @@ let unfold ?what context where = | Cic.Var (uri,_), Cic.Appl (Cic.Var (uri',_)::_) -> UriManager.eq uri uri' | Cic.Const _, _ | Cic.Var _, _ -> false + | Cic.Rel n, Cic.Rel m + | Cic.Rel n, Cic.Appl (Cic.Rel m::_) -> + n + (List.length context' - contextlen) = m + | Cic.Rel _, _ -> false | _,_ -> raise (ProofEngineTypes.Fail - "The term to unfold is neither a constant nor a variable") + (lazy "The term to unfold is not a constant, a variable or a bound variable ")) in let appl he tl = if tl = [] then he else Cic.Appl (he::tl) in let cannot_delta_expand t = raise (ProofEngineTypes.Fail - ("The term " ^ CicPp.ppterm t ^ " cannot be delta-expanded")) in + (lazy ("The term " ^ CicPp.ppterm t ^ " cannot be delta-expanded"))) in let rec hd_delta_beta context tl = function Cic.Rel n as t -> @@ -962,7 +959,7 @@ let unfold ?what context where = if res = [] then raise (ProofEngineTypes.Fail - ("Term "^ CicPp.ppterm what ^ " not found in " ^ CicPp.ppterm where)) + (lazy ("Term "^ CicPp.ppterm what ^ " not found in " ^ CicPp.ppterm where))) else res in