]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/ocaml/cic_omdoc/cic2acic.ml
checked in new version of matita from svn
[helm.git] / helm / ocaml / cic_omdoc / cic2acic.ml
index 8418a64d42506796fc8afb5d245e12415c7c7869..c2a832cbecf1f7ffec729324109ae9c3364eb459 100644 (file)
@@ -37,7 +37,7 @@ let type_of_aux'_add_time = ref 0.0;;
 
 let xxx_type_of_aux' m c t =
  let t1 = Sys.time () in
- let res = CicTypeChecker.type_of_aux' m c t in
+ let res,_ = CicTypeChecker.type_of_aux' m c t CicUniv.empty_ugraph in
  let t2 = Sys.time () in
  type_of_aux'_add_time := !type_of_aux'_add_time +. t2 -. t1 ;
  res
@@ -81,9 +81,10 @@ let acic_of_cic_context' seed ids_to_terms ids_to_father_ids ids_to_inner_sorts
  let module D = DoubleTypeInference in
  let module C = Cic in
   let fresh_id' = fresh_id seed ids_to_terms ids_to_father_ids in
-   let time1 = Sys.time () in
+(*    let time1 = Sys.time () in *)
    let terms_to_types =
      let time0 = Sys.time () in
+(*
      let prova = CicTypeChecker.type_of_aux' metasenv context t in
      let time1 = Sys.time () in
      prerr_endline ("*** Fine type_inference:" ^ (string_of_float (time1 -. time0)));
@@ -91,10 +92,14 @@ let acic_of_cic_context' seed ids_to_terms ids_to_father_ids ids_to_inner_sorts
      let time2 = Sys.time () in
    prerr_endline ("*** Fine double_type_inference:" ^ (string_of_float (time2 -. time1)));
      res 
+*)
+    D.double_type_of metasenv context t expectedty
    in
+(*
    let time2 = Sys.time () in
    prerr_endline
     ("++++++++++++ Tempi della double_type_of: "^ string_of_float (time2 -. time1)) ;
+*)
     let rec aux computeinnertypes father context idrefs tt =
      let fresh_id'' = fresh_id' father tt in
      (*CSC: computeinnertypes era true, il che e' proprio sbagliato, no? *)
@@ -108,9 +113,14 @@ let acic_of_cic_context' seed ids_to_terms ids_to_father_ids ids_to_inner_sorts
        match CicReduction.whd context t with 
           C.Sort C.Prop  -> "Prop"
         | C.Sort C.Set   -> "Set"
-        | C.Sort C.Type  -> "Type"
-       | C.Sort C.CProp -> "CProp"
-        | _              -> assert false
+        | C.Sort (C.Type _) -> "Type" (* TASSI OK*)
+        | C.Sort C.CProp -> "CProp"
+        | C.Meta _       ->
+(* prerr_endline "Cic2acic: string_of_sort applied to a meta" ; *)
+           "?"
+        | t              ->
+prerr_endline ("Cic2acic: string_of_sort applied to: " ^ CicPp.ppterm t) ;
+            assert false
       in
        let ainnertypes,innertype,innersort,expected_available =
 (*CSC: Here we need the algorithm for Coscoy's double type-inference  *)
@@ -131,7 +141,7 @@ let acic_of_cic_context' seed ids_to_terms ids_to_father_ids ids_to_inner_sorts
           {D.synthesized =
 (***CSC: patch per provare i tempi
             CicReduction.whd context (xxx_type_of_aux' metasenv context tt) ; *)
-Cic.Sort Cic.Type ;
+Cic.Sort (Cic.Type (CicUniv.fresh())); (* TASSI: non dovrebbe fare danni *)
           D.expected = None}
         in
          incr number_new_type_of_aux' ;
@@ -159,7 +169,8 @@ Cic.Sort Cic.Type ;
         with
          Not_found ->  (* l'inner-type non e' nella tabella ==> sort <> Prop *)
           (* CSC: Type or Set? I can not tell *)
-          None,Cic.Sort Cic.Type,"Type",false
+          None,Cic.Sort (Cic.Type (CicUniv.fresh())),"Type",false 
+         (* TASSI non dovrebbe fare danni *)
 (* *)
        in
         let add_inner_type id =
@@ -188,9 +199,7 @@ Cic.Sort Cic.Type ;
              in
               C.AVar (fresh_id'', uri,exp_named_subst')
           | C.Meta (n,l) ->
-             let (_,canonical_context,_) =
-              List.find (function (m,_,_) -> n = m) metasenv
-             in
+             let (_,canonical_context,_) = CicUtil.lookup_meta n metasenv in
              xxx_add ids_to_inner_sorts fresh_id'' innersort ;
              if innersort = "Prop"  && expected_available then
               add_inner_type fresh_id'' ;
@@ -325,12 +334,15 @@ Cic.Sort Cic.Type ;
                 ) fresh_idrefs funs
               )
         in
+(*
          let timea = Sys.time () in
          let res = aux true None context idrefs t in
          let timeb = Sys.time () in
           prerr_endline
            ("+++++++++++++ Tempi della aux dentro alla acic_of_cic: "^ string_of_float (timeb -. timea)) ;
           res
+*)
+        aux true None context idrefs t
 ;;
 
 let acic_of_cic_context metasenv context idrefs t =
@@ -392,7 +404,7 @@ let asequent_of_sequent (metasenv:Cic.metasenv) (sequent:Cic.conjecture) =
      ids_to_terms,ids_to_father_ids,ids_to_inner_sorts,ids_to_hypotheses
 ;;
 
-let acic_object_of_cic_object obj =
+let acic_object_of_cic_object ?(eta_fix=true) obj =
  let module C = Cic in
  let module E = Eta_fixing in
   let ids_to_terms = Hashtbl.create 503 in
@@ -411,47 +423,56 @@ let acic_object_of_cic_object obj =
   let aconjecture_of_conjecture' = aconjecture_of_conjecture seed 
     ids_to_terms ids_to_father_ids ids_to_inner_sorts ids_to_inner_types 
     ids_to_hypotheses hypotheses_seed in 
+   let eta_fix metasenv context t =
+    if eta_fix then E.eta_fix metasenv context t else t
+   in
    let aobj =
     match obj with
-      C.Constant (id,Some bo,ty,params) ->
-       let bo' = E.eta_fix [] bo in
-       let ty' = E.eta_fix [] ty in
+      C.Constant (id,Some bo,ty,params,attrs) ->
+       let bo' = eta_fix [] [] bo in
+       let ty' = eta_fix [] [] ty in
        let abo = acic_term_of_cic_term' bo' (Some ty') in
        let aty = acic_term_of_cic_term' ty' None in
         C.AConstant
-         ("mettereaposto",Some "mettereaposto2",id,Some abo,aty,params)
-    | C.Constant (id,None,ty,params) ->
-       let ty' = E.eta_fix [] ty in
+         ("mettereaposto",Some "mettereaposto2",id,Some abo,aty,params,attrs)
+    | C.Constant (id,None,ty,params,attrs) ->
+       let ty' = eta_fix [] [] ty in
        let aty = acic_term_of_cic_term' ty' None in
         C.AConstant
-         ("mettereaposto",None,id,None,aty,params)
-    | C.Variable (id,bo,ty,params) ->
-       let ty' = E.eta_fix [] ty in
+         ("mettereaposto",None,id,None,aty,params,attrs)
+    | C.Variable (id,bo,ty,params,attrs) ->
+       let ty' = eta_fix [] [] ty in
        let abo =
         match bo with
            None -> None
          | Some bo ->
-            let bo' = E.eta_fix [] bo in
+            let bo' = eta_fix [] [] bo in
              Some (acic_term_of_cic_term' bo' (Some ty'))
        in
        let aty = acic_term_of_cic_term' ty' None in
         C.AVariable
-         ("mettereaposto",id,abo,aty, params)
-    | C.CurrentProof (id,conjectures,bo,ty,params) ->
+         ("mettereaposto",id,abo,aty,params,attrs)
+    | C.CurrentProof (id,conjectures,bo,ty,params,attrs) ->
        let conjectures' =
         List.map
          (function (i,canonical_context,term) ->
            let canonical_context' =
-            List.map
-             (function
-                 None -> None
-               | Some (n, C.Decl t)-> Some (n, C.Decl (E.eta_fix conjectures t))
-               | Some (n, C.Def (t,None)) ->
-                  Some (n, C.Def ((E.eta_fix conjectures t),None))
-               | Some (_,C.Def (_,Some _)) -> assert false
-             ) canonical_context
+            List.fold_right
+             (fun d canonical_context' ->
+               let d' =
+                match d with
+                   None -> None
+                 | Some (n, C.Decl t)->
+                    Some (n, C.Decl (eta_fix conjectures canonical_context' t))
+                 | Some (n, C.Def (t,None)) ->
+                    Some (n,
+                     C.Def ((eta_fix conjectures canonical_context' t),None))
+                 | Some (_,C.Def (_,Some _)) -> assert false
+               in
+                d::canonical_context'
+             ) [] canonical_context
            in
-           let term' = E.eta_fix conjectures term in
+           let term' = eta_fix conjectures canonical_context' term in
             (i,canonical_context',term')
          ) conjectures
        in
@@ -505,18 +526,21 @@ let acic_object_of_cic_object obj =
              in
               (cid,i,(List.rev revacanonical_context),aterm) 
          ) conjectures' in *)
-       let time1 = Sys.time () in
-       let bo' = E.eta_fix conjectures' bo in
-       let ty' = E.eta_fix conjectures' ty in
+(*        let time1 = Sys.time () in *)
+       let bo' = eta_fix conjectures' [] bo in
+       let ty' = eta_fix conjectures' [] ty in
+(*
        let time2 = Sys.time () in
        prerr_endline
         ("++++++++++ Tempi della eta_fix: "^ string_of_float (time2 -. time1)) ;
        hashtbl_add_time := 0.0 ;
        type_of_aux'_add_time := 0.0 ;
        DoubleTypeInference.syntactic_equality_add_time := 0.0 ;
+*)
        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
+(*
        let time3 = Sys.time () in
        prerr_endline
         ("++++++++++++ Tempi della hashtbl_add_time: " ^ string_of_float !hashtbl_add_time) ;
@@ -530,9 +554,10 @@ let acic_object_of_cic_object obj =
         ("++++++++++ Tempi della acic_of_cic: " ^ string_of_float (time3 -. time2)) ;
        prerr_endline
         ("++++++++++ Numero di iterazioni della acic_of_cic: " ^ string_of_int !seed) ;
+*)
         C.ACurrentProof
-         ("mettereaposto","mettereaposto2",id,aconjectures,abo,aty,params)
-    | C.InductiveDefinition (tys,params,paramsno) ->
+         ("mettereaposto","mettereaposto2",id,aconjectures,abo,aty,params,attrs)
+    | C.InductiveDefinition (tys,params,paramsno,attrs) ->
        let context =
         List.map
          (fun (name,_,arity,_) -> Some (C.Name name, C.Decl arity)) tys in
@@ -550,7 +575,7 @@ let acic_object_of_cic_object obj =
             (id,name,inductive,acic_term_of_cic_term' ty None,acons)
          ) (List.rev idrefs) tys
        in
-        C.AInductiveDefinition ("mettereaposto",atys,params,paramsno)
+        C.AInductiveDefinition ("mettereaposto",atys,params,paramsno,attrs)
    in
     aobj,ids_to_terms,ids_to_father_ids,ids_to_inner_sorts,ids_to_inner_types,
      ids_to_conjectures,ids_to_hypotheses