]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/ocaml/cic_unification/cicMkImplicit.ml
bumped version (tag soon)
[helm.git] / helm / ocaml / cic_unification / cicMkImplicit.ml
index 6944a4fc210dfe1a68d016dcf513e5f4d9a86d09..f433fb19b92ead3a19e0913b82f6dd108b73d9f2 100644 (file)
@@ -3,7 +3,7 @@
 (* returns the identity relocation list, which is the list [1 ; ... ; n] *)
 (* where n = List.length [canonical_context]                             *)
 (*CSC: ma mi basta la lunghezza del contesto canonico!!!*)
-let identity_relocation_list_for_metavariable canonical_context =
+let identity_relocation_list_for_metavariable ?(start = 1) canonical_context =
  let canonical_context_length = List.length canonical_context in
   let rec aux =
    function
@@ -11,7 +11,7 @@ let identity_relocation_list_for_metavariable canonical_context =
     | (n,None::tl) -> None::(aux ((n+1),tl))
     | (n,_::tl) -> (Some (Cic.Rel n))::(aux ((n+1),tl))
   in
-   aux (1,canonical_context)
+   aux (start,canonical_context)
 
 (* Returns the first meta whose number is above the *)
 (* number of the higher meta.                       *)
@@ -28,11 +28,21 @@ let new_meta metasenv =
 let mk_implicit metasenv context =
   let newmeta = new_meta metasenv in
   let irl = identity_relocation_list_for_metavariable context in
-  ([ newmeta, context, Cic.Sort Cic.Type ;
-    newmeta + 1, context, Cic.Meta (newmeta, irl);
+  ([ newmeta, [], Cic.Sort Cic.Type ;
+    newmeta + 1, context, Cic.Meta (newmeta, []);
     newmeta + 2, context, Cic.Meta (newmeta + 1,irl) ] @ metasenv,
    newmeta + 2)
 
+let mk_implicit_type metasenv context =
+  let newmeta = new_meta metasenv in
+  ([ newmeta, [], Cic.Sort Cic.Type ;
+    newmeta + 1, context, Cic.Meta (newmeta, []) ] @metasenv,
+   newmeta + 1)
+
+let mk_implicit_sort metasenv =
+  let newmeta = new_meta metasenv in
+  ([ newmeta, [], Cic.Sort Cic.Type] @ metasenv, newmeta)
+
 let n_fresh_metas metasenv context n = 
   if n = 0 then metasenv, []
   else 
@@ -61,17 +71,6 @@ let fresh_subst metasenv context uris =
           (uri,Cic.Meta(newmeta+2,irl))::l in
     aux newmeta uris
 
-let mk_implicit' metasenv context =
-  let (metasenv, index) = mk_implicit metasenv context in
-  (metasenv, index - 1, index)
-
-let mk_implicit_type metasenv context =
-  let newmeta = new_meta metasenv in
-  let irl = identity_relocation_list_for_metavariable context in
-  ([ newmeta, context, Cic.Sort Cic.Type ;
-    newmeta + 1, context, Cic.Meta (newmeta, irl) ] @metasenv,
-   newmeta + 1)
-
 let expand_implicits metasenv context term =
   let rec aux metasenv context = function
     | (Cic.Rel _) as t -> metasenv, t
@@ -91,10 +90,17 @@ let expand_implicits metasenv context term =
     | Cic.Meta (n,l) -> 
         let metasenv', l' = do_local_context metasenv context l in
         metasenv', Cic.Meta (n, l')
-    | Cic.Implicit ->
-        let (metasenv', type_index, _) = mk_implicit' metasenv context in
+    | Cic.Implicit (Some `Type) ->
+        let (metasenv', idx) = mk_implicit_type metasenv context in
+        let irl = identity_relocation_list_for_metavariable context in
+        metasenv', Cic.Meta (idx, irl)
+    | Cic.Implicit (Some `Closed) ->
+        let (metasenv', idx) = mk_implicit metasenv [] in
+        metasenv', Cic.Meta (idx, [])
+    | Cic.Implicit None ->
+        let (metasenv', idx) = mk_implicit metasenv context in
         let irl = identity_relocation_list_for_metavariable context in
-        metasenv', Cic.Meta (type_index, irl)
+        metasenv', Cic.Meta (idx, irl)
     | Cic.Cast (te, ty) ->
         let metasenv', ty' = aux metasenv context ty in
         let metasenv'', te' = aux metasenv' context te in
@@ -149,7 +155,6 @@ let expand_implicits metasenv context term =
               (new_metasenv, (name, new_type) :: types))
             funs (metasenv, [])
         in
-List.iter (fun (_, t) -> assert (t <> Cic.Implicit)) types;
         let context' =
           (List.rev_map
             (fun (name, t) -> Some (Cic.Name name, Cic.Decl t))