]> matita.cs.unibo.it Git - helm.git/commitdiff
New strategy for let-in unfolding (aka zeta reduction): a reference to a
authorClaudio Sacerdoti Coen <claudio.sacerdoticoen@unibo.it>
Mon, 5 Sep 2005 14:27:39 +0000 (14:27 +0000)
committerClaudio Sacerdoti Coen <claudio.sacerdoticoen@unibo.it>
Mon, 5 Sep 2005 14:27:39 +0000 (14:27 +0000)
let-bound variable is expanded if and only if the simplified form of its definiendum (applied to the actual arguments) is different from the
non-simplified form.

helm/ocaml/tactics/proofEngineReduction.ml

index d04acd181ba2c7c621b00ec2f479f2089aaafebe..087d327757babbe020e167c8babd40821bdaf3b5 100644 (file)
@@ -583,8 +583,11 @@ 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  *)
+(*     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   *)
 (*     of the recursive simplification. Otherwise, if the Fix can not be     *)
@@ -610,7 +613,14 @@ 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,_)) ->
-             try_delta_expansion context l t (S.lift n bo)
+             let lifted_bo = S.lift n bo in
+             let applied_lifted_bo =
+              if l = [] then lifted_bo else C.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
          | None -> raise RelToHiddenHypothesis
         with
          Failure _ -> assert false)
@@ -714,7 +724,7 @@ let simpl context =
                 reduceaux context tl body'
          | t -> t
        in
-        (match decofix (reduceaux context [] term) with
+        (match decofix (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) =