]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/gTopLevel/cic2acic.ml
* Abst removed from the DTD
[helm.git] / helm / gTopLevel / cic2acic.ml
index 7b9511da11d1653d9db106c626235dc17b986d67..81e94419699624d13c167accbe0b8bccff80f3e7 100644 (file)
 
 exception NotImplemented;;
 
+type anntypes =
+ {annsynthesized : Cic.annterm ; annexpected : Cic.annterm option}
+;;
+
 let fresh_id seed ids_to_terms ids_to_father_ids =
  fun father t ->
   let res = "i" ^ string_of_int !seed in
@@ -48,158 +52,168 @@ let rec get_nth l n =
 ;;
 
 let acic_of_cic_context' seed ids_to_terms ids_to_father_ids ids_to_inner_sorts
-     ids_to_inner_types metasenv context t
+     ids_to_inner_types metasenv context t expectedty
 =
+ let module D = DoubleTypeInference in
  let module T = CicTypeChecker in
  let module C = Cic in
   let fresh_id' = fresh_id seed ids_to_terms ids_to_father_ids in
-   let terms_to_types = DoubleTypeInference.double_type_of metasenv context t in
-   let rec aux computeinnertypes father context tt =
-    let fresh_id'' = fresh_id' father tt in
-    (*CSC: computeinnertypes era true, il che e' proprio sbagliato, no? *)
-    let aux' = aux computeinnertypes (Some fresh_id'') in
-     (* First of all we compute the inner type and the inner sort *)
-     (* of the term. They may be useful in what follows.          *)
-     (*CSC: This is a very inefficient way of computing inner types *)
-     (*CSC: and inner sorts: very deep terms have their types/sorts *)
-     (*CSC: computed again and again.                               *)
-     let string_of_sort =
-      function 
-         C.Sort C.Prop -> "Prop"
-       | C.Sort C.Set  -> "Set"
-       | C.Sort C.Type -> "Type"
-       | _ -> assert false
-     in
-      let ainnertype,innertype,innersort =
+   let terms_to_types =
+    D.double_type_of metasenv context t expectedty
+   in
+    let rec aux computeinnertypes father context tt =
+     let fresh_id'' = fresh_id' father tt in
+     (*CSC: computeinnertypes era true, il che e' proprio sbagliato, no? *)
+     let aux' = aux computeinnertypes (Some fresh_id'') in
+      (* First of all we compute the inner type and the inner sort *)
+      (* of the term. They may be useful in what follows.          *)
+      (*CSC: This is a very inefficient way of computing inner types *)
+      (*CSC: and inner sorts: very deep terms have their types/sorts *)
+      (*CSC: computed again and again.                               *)
+      let string_of_sort =
+       function 
+          C.Sort C.Prop -> "Prop"
+        | C.Sort C.Set  -> "Set"
+        | C.Sort C.Type -> "Type"
+        | _ -> assert false
+      in
+       let ainnertypes,innertype,innersort =
 (*CSC: Here we need the algorithm for Coscoy's double type-inference  *)
 (*CSC: (expected type + inferred type). Just for now we use the usual *)
 (*CSC: type-inference, but the result is very poor. As a very weak    *)
 (*CSC: patch, I apply whd to the computed type. Full beta             *)
 (*CSC: reduction would be a much better option.                       *)
-        let innertype =
+        let {D.synthesized = synthesized; D.expected = expected} =
          if computeinnertypes then
-          let {DoubleTypeInference.synthesized = synthesized} =
-           DoubleTypeInference.CicHash.find terms_to_types tt
-          in
-           synthesized
+          D.CicHash.find terms_to_types tt
          else
           (* We are already in an inner-type and Coscoy's double *)
           (* type inference algorithm has not been applied.      *)
-          CicReduction.whd context (T.type_of_aux' metasenv context tt)
+          {D.synthesized =
+            CicReduction.whd context (T.type_of_aux' metasenv context tt) ;
+           D.expected = None}
         in
-         let innersort = T.type_of_aux' metasenv context innertype in
-          let ainnertype =
+         let innersort = T.type_of_aux' metasenv context synthesized in
+          let ainnertypes =
            if computeinnertypes then
-            Some (aux false (Some fresh_id'') context innertype)
+            Some
+             {annsynthesized =
+               aux false (Some fresh_id'') context synthesized ;
+              annexpected =
+               match expected with
+                  None -> None
+                | Some expectedty' ->
+                   Some (aux false (Some fresh_id'') context expectedty')
+             }
            else
             None
           in
-           ainnertype, innertype, string_of_sort innersort
-      in
-      let add_inner_type id =
-       match ainnertype with
-          None -> ()
-        | Some ainnertype -> Hashtbl.add ids_to_inner_types id ainnertype
-      in
-       match tt with
-          C.Rel n ->
-           let id =
-            match get_nth context n with
-               (Some (C.Name s,_)) -> s
-             | _ -> raise NameExpected
-           in
+           ainnertypes, synthesized, string_of_sort innersort
+       in
+        let add_inner_type id =
+         match ainnertypes with
+            None -> ()
+          | Some ainnertypes -> Hashtbl.add ids_to_inner_types id ainnertypes
+        in
+         match tt with
+            C.Rel n ->
+             let id =
+              match get_nth context n with
+                 (Some (C.Name s,_)) -> s
+               | _ -> raise NameExpected
+             in
+              Hashtbl.add ids_to_inner_sorts fresh_id'' innersort ;
+              C.ARel (fresh_id'', n, id)
+          | C.Var uri ->
+             Hashtbl.add ids_to_inner_sorts fresh_id'' innersort ;
+             C.AVar (fresh_id'', uri)
+          | C.Meta (n,l) ->
+             Hashtbl.add ids_to_inner_sorts fresh_id'' innersort ;
+             C.AMeta (fresh_id'', n,
+              (List.map
+                (function None -> None | Some t -> Some (aux' context t)) l))
+          | C.Sort s -> C.ASort (fresh_id'', s)
+          | C.Implicit -> C.AImplicit (fresh_id'')
+          | C.Cast (v,t) ->
+             Hashtbl.add ids_to_inner_sorts fresh_id'' innersort ;
+             if innersort = "Prop" then
+              add_inner_type fresh_id'' ;
+             C.ACast (fresh_id'', aux' context v, aux' context t)
+          | C.Prod (n,s,t) ->
+              Hashtbl.add ids_to_inner_sorts fresh_id''
+               (string_of_sort innertype) ;
+              C.AProd
+               (fresh_id'', n, aux' context s,
+                aux' ((Some (n, C.Decl s))::context) t)
+          | C.Lambda (n,s,t) ->
+             Hashtbl.add ids_to_inner_sorts fresh_id'' innersort ;
+             if innersort = "Prop" then
+              begin
+               let father_is_lambda =
+                match father with
+                   None -> false
+                 | Some father' ->
+                    match Hashtbl.find ids_to_terms father' with
+                       C.Lambda _ -> true
+                     | _ -> false
+               in
+                if not father_is_lambda then
+                 add_inner_type fresh_id''
+              end ;
+             C.ALambda
+              (fresh_id'',n, aux' context s,
+               aux' ((Some (n, C.Decl s)::context)) t)
+          | C.LetIn (n,s,t) ->
             Hashtbl.add ids_to_inner_sorts fresh_id'' innersort ;
-            C.ARel (fresh_id'', n, id)
-        | C.Var uri ->
-           Hashtbl.add ids_to_inner_sorts fresh_id'' innersort ;
-           C.AVar (fresh_id'', uri)
-        | C.Meta (n,l) ->
-           Hashtbl.add ids_to_inner_sorts fresh_id'' innersort ;
-           C.AMeta (fresh_id'', n,
-            (List.map
-              (function None -> None | Some t -> Some (aux' context t)) l))
-        | C.Sort s -> C.ASort (fresh_id'', s)
-        | C.Implicit -> C.AImplicit (fresh_id'')
-        | C.Cast (v,t) ->
-           Hashtbl.add ids_to_inner_sorts fresh_id'' innersort ;
-           if innersort = "Prop" then
-            add_inner_type fresh_id'' ;
-           C.ACast (fresh_id'', aux' context v, aux' context t)
-        | C.Prod (n,s,t) ->
-            Hashtbl.add ids_to_inner_sorts fresh_id''
-             (string_of_sort innertype) ;
-            C.AProd
+            C.ALetIn
              (fresh_id'', n, aux' context s,
-              aux' ((Some (n, C.Decl s))::context) t)
-        | C.Lambda (n,s,t) ->
-           Hashtbl.add ids_to_inner_sorts fresh_id'' innersort ;
-           if innersort = "Prop" then
-            begin
-             let father_is_lambda =
-              match father with
-                 None -> false
-               | Some father' ->
-                  match Hashtbl.find ids_to_terms father' with
-                     C.Lambda _ -> true
-                   | _ -> false
+              aux' ((Some (n, C.Def s))::context) t)
+          | C.Appl l ->
+             Hashtbl.add ids_to_inner_sorts fresh_id'' innersort ;
+             if innersort = "Prop" then
+              add_inner_type fresh_id'' ;
+             C.AAppl (fresh_id'', List.map (aux' context) l)
+          | C.Const (uri,cn) ->
+             Hashtbl.add ids_to_inner_sorts fresh_id'' innersort ;
+             C.AConst (fresh_id'', uri, cn)
+          | C.MutInd (uri,cn,tyno) -> C.AMutInd (fresh_id'', uri, cn, tyno)
+          | C.MutConstruct (uri,cn,tyno,consno) ->
+             Hashtbl.add ids_to_inner_sorts fresh_id'' innersort ;
+             C.AMutConstruct (fresh_id'', uri, cn, tyno, consno)
+          | C.MutCase (uri, cn, tyno, outty, term, patterns) ->
+             Hashtbl.add ids_to_inner_sorts fresh_id'' innersort ;
+             if innersort = "Prop" then
+              add_inner_type fresh_id'' ;
+             C.AMutCase (fresh_id'', uri, cn, tyno, aux' context outty,
+              aux' context term, List.map (aux' context) patterns)
+          | C.Fix (funno, funs) ->
+             let tys =
+              List.map (fun (name,_,ty,_) -> Some (C.Name name, C.Decl ty)) funs
              in
-              if not father_is_lambda then
-               add_inner_type fresh_id''
-            end ;
-           C.ALambda
-            (fresh_id'',n, aux' context s,
-             aux' ((Some (n, C.Decl s)::context)) t)
-        | C.LetIn (n,s,t) ->
-          Hashtbl.add ids_to_inner_sorts fresh_id'' innersort ;
-          C.ALetIn
-           (fresh_id'', n, aux' context s,
-            aux' ((Some (n, C.Def s))::context) t)
-        | C.Appl l ->
-           Hashtbl.add ids_to_inner_sorts fresh_id'' innersort ;
-           if innersort = "Prop" then
-            add_inner_type fresh_id'' ;
-           C.AAppl (fresh_id'', List.map (aux' context) l)
-        | C.Const (uri,cn) ->
-           Hashtbl.add ids_to_inner_sorts fresh_id'' innersort ;
-           C.AConst (fresh_id'', uri, cn)
-        | C.Abst _ -> raise NotImplemented
-        | C.MutInd (uri,cn,tyno) -> C.AMutInd (fresh_id'', uri, cn, tyno)
-        | C.MutConstruct (uri,cn,tyno,consno) ->
-           Hashtbl.add ids_to_inner_sorts fresh_id'' innersort ;
-           C.AMutConstruct (fresh_id'', uri, cn, tyno, consno)
-        | C.MutCase (uri, cn, tyno, outty, term, patterns) ->
-           Hashtbl.add ids_to_inner_sorts fresh_id'' innersort ;
-           if innersort = "Prop" then
-            add_inner_type fresh_id'' ;
-           C.AMutCase (fresh_id'', uri, cn, tyno, aux' context outty,
-            aux' context term, List.map (aux' context) patterns)
-        | C.Fix (funno, funs) ->
-           let tys =
-            List.map (fun (name,_,ty,_) -> Some (C.Name name, C.Decl ty)) funs
-           in
-            Hashtbl.add ids_to_inner_sorts fresh_id'' innersort ;
-            if innersort = "Prop" then
-             add_inner_type fresh_id'' ;
-            C.AFix (fresh_id'', funno,
-             List.map
-              (fun (name, indidx, ty, bo) ->
-                (name, indidx, aux' context ty, aux' (tys@context) bo)
-              ) funs
-           )
-        | C.CoFix (funno, funs) ->
-           let tys =
-            List.map (fun (name,ty,_) -> Some (C.Name name, C.Decl ty)) funs in
-            Hashtbl.add ids_to_inner_sorts fresh_id'' innersort ;
-            if innersort = "Prop" then
-             add_inner_type fresh_id'' ;
-            C.ACoFix (fresh_id'', funno,
-             List.map
-              (fun (name, ty, bo) ->
-                (name, aux' context ty, aux' (tys@context) bo)
-              ) funs
-            )
-      in
-       aux true None context t
+              Hashtbl.add ids_to_inner_sorts fresh_id'' innersort ;
+              if innersort = "Prop" then
+               add_inner_type fresh_id'' ;
+              C.AFix (fresh_id'', funno,
+               List.map
+                (fun (name, indidx, ty, bo) ->
+                  (name, indidx, aux' context ty, aux' (tys@context) bo)
+                ) funs
+             )
+          | C.CoFix (funno, funs) ->
+             let tys =
+              List.map (fun (name,ty,_) -> Some (C.Name name, C.Decl ty)) funs
+             in
+              Hashtbl.add ids_to_inner_sorts fresh_id'' innersort ;
+              if innersort = "Prop" then
+               add_inner_type fresh_id'' ;
+              C.ACoFix (fresh_id'', funno,
+               List.map
+                (fun (name, ty, bo) ->
+                  (name, aux' context ty, aux' (tys@context) bo)
+                ) funs
+              )
+        in
+         aux true None context t
 ;;
 
 let acic_of_cic_context metasenv context t =
@@ -231,9 +245,8 @@ let acic_object_of_cic_object obj =
    let aobj =
     match obj with
       C.Definition (id,bo,ty,params) ->
-       let abo = acic_term_of_cic_term' bo in
-       let aty = acic_term_of_cic_term' ty
-       in
+       let abo = acic_term_of_cic_term' bo (Some ty) in
+       let aty = acic_term_of_cic_term' ty None in
         C.ADefinition ("mettereaposto",id,abo,aty,(Cic.Actual params))
     | C.Axiom (id,ty,params) -> raise NotImplemented
     | C.Variable (id,bo,ty) -> raise NotImplemented
@@ -255,12 +268,12 @@ let acic_object_of_cic_object obj =
                    match hyp with
                       (Some (n,C.Decl t)) ->
                         let at =
-                         acic_term_of_cic_term_context' conjectures tl t
+                         acic_term_of_cic_term_context' conjectures tl t None
                         in
                          (hid,Some (n,C.ADecl at))::(aux tl)
                     | (Some (n,C.Def t)) ->
                         let at =
-                         acic_term_of_cic_term_context' conjectures tl t
+                         acic_term_of_cic_term_context' conjectures tl t None
                         in
                          (hid,Some (n,C.ADef at))::(aux tl)
                     | None -> (hid,None)::(aux tl)
@@ -268,12 +281,13 @@ let acic_object_of_cic_object obj =
               aux canonical_context
             in
              let aterm =
-              acic_term_of_cic_term_context' conjectures canonical_context term
+              acic_term_of_cic_term_context' conjectures canonical_context
+               term None
              in
               (cid,i,acanonical_context,aterm)
          ) conjectures in
-       let abo = acic_term_of_cic_term_context' conjectures [] bo in
-       let aty = acic_term_of_cic_term_context' conjectures [] ty in
+       let abo = acic_term_of_cic_term_context' conjectures [] bo (Some ty) in
+       let aty = acic_term_of_cic_term_context' conjectures [] ty None in
         C.ACurrentProof ("mettereaposto",id,aconjectures,abo,aty)
     | C.InductiveDefinition (tys,params,paramsno) -> raise NotImplemented
    in