]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/ocaml/tactics/proofEngineHelpers.ml
More debug_print made lazy.
[helm.git] / helm / ocaml / tactics / proofEngineHelpers.ml
index 5c9b1f7a0ef46e7ddded1ea53911c7d5852b93b0..51405f5fdfa7269f58c3b780b16484eb7b67e85d 100644 (file)
@@ -309,12 +309,10 @@ let select_in_term ~metasenv ~context ~ugraph ~term ~pattern:(wanted,where) =
             [] -> [],metasenv,ugraph,[]
           | (context',where)::tl ->
              let subst,metasenv,ugraph,tl' = find_in_roots tl in
-             let context'_len = List.length context' in
              let subst,metasenv,ugraph,found =
-              let wanted =
-               CicSubstitution.lift (context'_len - context_len) wanted
-              in
-               find_subterms ~subst ~metasenv ~ugraph ~wanted ~context where
+              let wanted, metasenv, ugraph = wanted context' metasenv ugraph in
+               find_subterms ~subst ~metasenv ~ugraph ~wanted ~context:context'
+                where
              in
               subst,metasenv,ugraph,found @ tl'
         in
@@ -494,30 +492,12 @@ exception Fail of string
             | None ->
                subst,metasenv,ugraph,((Some (`Decl []))::res),(entry::context)
             | Some pat ->
-               try
-                let what =
-                 match what with
-                    None -> None
-                  | Some what ->
-                     let what,subst',metasenv' =
-                      CicMetaSubst.delift_rels [] metasenv
-                       (context_len - List.length context) what
-                     in
-                      assert (subst' = []);
-                      assert (metasenv' = metasenv);
-                      Some what in
                 let subst,metasenv,ugraph,terms =
                  select_in_term ~metasenv ~context ~ugraph ~term
                   ~pattern:(what,pat)
                 in
                  subst,metasenv,ugraph,((Some (`Decl terms))::res),
-                  (entry::context)
-               with
-                CicMetaSubst.DeliftingARelWouldCaptureAFreeVariable ->
-                 raise
-                  (Fail
-                    ("The term the user wants to convert is not closed " ^
-                     "in the context of the position of the substitution.")))
+                  (entry::context))
         | Some (name,Cic.Def (bo, ty)) ->
             (match find_pattern_for name with
             | None ->
@@ -525,18 +505,6 @@ exception Fail of string
                 subst,metasenv,ugraph,((Some (`Def ([],selected_ty)))::res),
                  (entry::context)
             | Some pat -> 
-               try
-                let what =
-                 match what with
-                    None -> None
-                  | Some what ->
-                     let what,subst',metasenv' =
-                      CicMetaSubst.delift_rels [] metasenv
-                       (context_len - List.length context) what
-                     in
-                      assert (subst' = []);
-                      assert (metasenv' = metasenv);
-                      Some what in
                 let subst,metasenv,ugraph,terms_bo =
                  select_in_term ~metasenv ~context ~ugraph ~term:bo
                   ~pattern:(what,pat) in
@@ -551,13 +519,7 @@ exception Fail of string
                       subst,metasenv,ugraph,Some res
                 in
                  subst,metasenv,ugraph,((Some (`Def (terms_bo,terms_ty)))::res),
-                  (entry::context)
-               with
-                CicMetaSubst.DeliftingARelWouldCaptureAFreeVariable ->
-                 raise
-                  (Fail
-                    ("The term the user wants to convert is not closed " ^
-                     "in the context of the position of the substitution.")))
+                  (entry::context))
       ) context (subst,metasenv,ugraph,[],[]))
     in
      subst,metasenv,ugraph,res
@@ -646,17 +608,18 @@ let locate_in_conjecture ?(equality=fun _ -> (==)) what (_,context,ty) =
  in
   res @ locate_in_term what ~where:ty context
 
-(* saturate_term newmeta metasenv context ty                                  *)
-(* Given a type [ty] (a backbone), it returns its head and a new metasenv in  *)
-(* which there is new a META for each hypothesis, a list of arguments for the *)
-(* new applications and the index of the last new META introduced. The nth    *)
-(* argument in the list of arguments is just the nth new META.                *)
-let saturate_term newmeta metasenv context ty =
+(* saturate_term newmeta metasenv context ty goal_arity                       *)
+(* Given a type [ty] (a backbone), it returns its suffix of length            *)
+(* [goal_arity] head and a new metasenv in which there is new a META for each *)
+(* hypothesis, a list of arguments for the new applications and the index of  *)
+(* the last new META introduced. The nth argument in the list of arguments is *)
+(* just the nth new META.                                                     *)
+let saturate_term newmeta metasenv context ty goal_arity =
  let module C = Cic in
  let module S = CicSubstitution in
+ assert (goal_arity >= 0);
   let rec aux newmeta ty =
-   let ty' = ty in
-   match ty' with
+   match ty with
       C.Cast (he,_) -> aux newmeta he
 (* CSC: patch to generate ?1 : ?2 : Type in place of ?1 : Type to simulate ?1 :< Type
       (* If the expected type is a Type, then also Set is OK ==>
@@ -681,22 +644,31 @@ let saturate_term newmeta metasenv context ty =
          CicMkImplicit.identity_relocation_list_for_metavariable context
        in
         let newargument = C.Meta (newmeta,irl) in
-         let (res,newmetasenv,arguments,lastmeta) =
+         let res,newmetasenv,arguments,lastmeta,prod_no =
           aux (newmeta + 1) (S.subst newargument t)
          in
-         let s' = CicReduction.normalize ~delta:false context s in
-          res,(newmeta,context,s')::newmetasenv,newargument::arguments,lastmeta
-          (** NORMALIZE RATIONALE 
-           * we normalize the target only NOW since we may be in this case:
-           * A1 -> A2 -> T where T = (\lambda x.A3 -> P) k  
-           * and we want a mesasenv with ?1:A1 and ?2:A2 and not
-           * ?1, ?2, ?3 (that is the one we whould get if we start from the
-           * beta-normalized A1 -> A2 -> A3 -> P **)
-    | t -> (CicReduction.normalize ~delta:false context t),[],[],newmeta
+          if prod_no + 1 = goal_arity then
+           let head = CicReduction.normalize ~delta:false context ty in
+            head,[],[],lastmeta,goal_arity + 1
+          else
+           (** NORMALIZE RATIONALE 
+            * we normalize the target only NOW since we may be in this case:
+            * A1 -> A2 -> T where T = (\lambda x.A3 -> P) k  
+            * and we want a mesasenv with ?1:A1 and ?2:A2 and not
+            * ?1, ?2, ?3 (that is the one we whould get if we start from the
+            * beta-normalized A1 -> A2 -> A3 -> P **)
+           let s' = CicReduction.normalize ~delta:false context s in
+            res,(newmeta,context,s')::newmetasenv,newargument::arguments,
+             lastmeta,prod_no + 1
+    | t ->
+       let head = CicReduction.normalize ~delta:false context t in
+        match CicReduction.whd context head with
+           C.Prod _ as head' -> aux newmeta head'
+         | _ -> head,[],[],newmeta,0
   in
    (* WARNING: here we are using the invariant that above the most *)
    (* recente new_meta() there are no used metas.                  *)
-   let (res,newmetasenv,arguments,lastmeta) = aux newmeta ty in
+   let res,newmetasenv,arguments,lastmeta,_ = aux newmeta ty in
     res,metasenv @ newmetasenv,arguments,lastmeta
 
 let lookup_type metasenv context hyp =