]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/ocaml/cic_omdoc/cic2acic.ml
Debugging stuff removed.
[helm.git] / helm / ocaml / cic_omdoc / cic2acic.ml
index c0e514d37406835bc6f7f224806fe2ac1fc60cdd..d934e83bfa4443581c161f53ef5a5d1f80f9d79e 100644 (file)
  * http://cs.unibo.it/helm/.
  *)
 
+let hashtbl_add_time = ref 0.0;;
+
+let xxx_add h k v =
+ let t1 = Sys.time () in
+  Hashtbl.add h k v ;
+  let t2 = Sys.time () in
+   hashtbl_add_time := !hashtbl_add_time +. t2 -. t1
+;;
+
+let number_new_type_of_aux' = ref 0;;
+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 t2 = Sys.time () in
+ type_of_aux'_add_time := !type_of_aux'_add_time +. t2 -. t1 ;
+ res
+;;
+
 type anntypes =
  {annsynthesized : Cic.annterm ; annexpected : Cic.annterm option}
 ;;
@@ -36,8 +56,8 @@ let gen_id seed =
 let fresh_id seed ids_to_terms ids_to_father_ids =
  fun father t ->
   let res = gen_id seed in
-   Hashtbl.add ids_to_father_ids res father ;
-   Hashtbl.add ids_to_terms res t ;
+   xxx_add ids_to_father_ids res father ;
+   xxx_add ids_to_terms res t ;
    res
 ;;
 
@@ -60,14 +80,15 @@ let acic_of_cic_context' seed ids_to_terms ids_to_father_ids ids_to_inner_sorts
      ids_to_inner_types metasenv context idrefs 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
-prerr_endline "*************** INIZIO DOUBLE TYPE INFERENCE ************";
+   let time1 = Sys.time () in
    let terms_to_types =
     D.double_type_of metasenv context t expectedty
    in
-prerr_endline "*************** FINE DOUBLE TYPE INFERENCE ************";
+   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? *)
@@ -90,6 +111,10 @@ prerr_endline "*************** FINE DOUBLE TYPE INFERENCE ************";
 (*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.                       *)
+(*CSC: solo per testare i tempi *)
+(*XXXXXXX *)
+        try
+(* *)
         let {D.synthesized = synthesized; D.expected = expected} =
          if computeinnertypes then
           D.CicHash.find terms_to_types tt
@@ -97,10 +122,13 @@ prerr_endline "*************** FINE DOUBLE TYPE INFERENCE ************";
           (* We are already in an inner-type and Coscoy's double *)
           (* type inference algorithm has not been applied.      *)
           {D.synthesized =
-            CicReduction.whd context (T.type_of_aux' metasenv context tt) ;
+(***CSC: patch per provare i tempi
+            CicReduction.whd context (xxx_type_of_aux' metasenv context tt) ; *)
+Cic.Sort Cic.Type ;
            D.expected = None}
         in
-         let innersort = T.type_of_aux' metasenv context synthesized in
+         incr number_new_type_of_aux' ;
+         let innersort = (*XXXXX *) xxx_type_of_aux' metasenv context synthesized (* Cic.Sort Cic.Prop *) in
           let ainnertypes,expected_available =
            if computeinnertypes then
             let annexpected,expected_available =
@@ -120,11 +148,17 @@ prerr_endline "*************** FINE DOUBLE TYPE INFERENCE ************";
             None,false
           in
            ainnertypes,synthesized, string_of_sort innersort, expected_available
+(*XXXXXXXX *)
+        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
+(* *)
        in
         let add_inner_type id =
          match ainnertypes with
             None -> ()
-          | Some ainnertypes -> Hashtbl.add ids_to_inner_types id ainnertypes
+          | Some ainnertypes -> xxx_add ids_to_inner_types id ainnertypes
         in
          match tt with
             C.Rel n ->
@@ -133,12 +167,12 @@ prerr_endline "*************** FINE DOUBLE TYPE INFERENCE ************";
                  (Some (C.Name s,_)) -> s
                | _ -> raise NameExpected
              in
-              Hashtbl.add ids_to_inner_sorts fresh_id'' innersort ;
+              xxx_add ids_to_inner_sorts fresh_id'' innersort ;
               if innersort = "Prop"  && expected_available then
                add_inner_type fresh_id'' ;
               C.ARel (fresh_id'', List.nth idrefs (n-1), n, id)
           | C.Var (uri,exp_named_subst) ->
-             Hashtbl.add ids_to_inner_sorts fresh_id'' innersort ;
+             xxx_add ids_to_inner_sorts fresh_id'' innersort ;
              if innersort = "Prop"  && expected_available then
               add_inner_type fresh_id'' ;
              let exp_named_subst' =
@@ -150,7 +184,7 @@ prerr_endline "*************** FINE DOUBLE TYPE INFERENCE ************";
              let (_,canonical_context,_) =
               List.find (function (m,_,_) -> n = m) metasenv
              in
-             Hashtbl.add ids_to_inner_sorts fresh_id'' innersort ;
+             xxx_add ids_to_inner_sorts fresh_id'' innersort ;
              if innersort = "Prop"  && expected_available then
               add_inner_type fresh_id'' ;
              C.AMeta (fresh_id'', n,
@@ -164,21 +198,21 @@ prerr_endline "*************** FINE DOUBLE TYPE INFERENCE ************";
           | 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 ;
+             xxx_add ids_to_inner_sorts fresh_id'' innersort ;
              if innersort = "Prop" then
               add_inner_type fresh_id'' ;
              C.ACast (fresh_id'', aux' context idrefs v, aux' context idrefs t)
           | C.Prod (n,s,t) ->
-              Hashtbl.add ids_to_inner_sorts fresh_id''
+              xxx_add ids_to_inner_sorts fresh_id''
                (string_of_sort innertype) ;
-                   let sourcetype = T.type_of_aux' metasenv context s in
-                    Hashtbl.add ids_to_inner_sorts (source_id_of_id fresh_id'')
+                   let sourcetype = xxx_type_of_aux' metasenv context s in
+                    xxx_add ids_to_inner_sorts (source_id_of_id fresh_id'')
                      (string_of_sort sourcetype) ;
               let n' =
                match n with
                   C.Anonymous -> n
                 | C.Name n' ->
-                   if D.does_not_occur 1 t then
+                   if DoubleTypeInference.does_not_occur 1 t then
                     C.Anonymous
                    else
                     C.Name n'
@@ -187,9 +221,9 @@ prerr_endline "*************** FINE DOUBLE TYPE INFERENCE ************";
                 (fresh_id'', n', aux' context idrefs s,
                  aux' ((Some (n, C.Decl s))::context) (fresh_id''::idrefs) t)
           | C.Lambda (n,s,t) ->
-             Hashtbl.add ids_to_inner_sorts fresh_id'' innersort ;
-                  let sourcetype = T.type_of_aux' metasenv context s in
-                   Hashtbl.add ids_to_inner_sorts (source_id_of_id fresh_id'')
+             xxx_add ids_to_inner_sorts fresh_id'' innersort ;
+                  let sourcetype = xxx_type_of_aux' metasenv context s in
+                   xxx_add ids_to_inner_sorts (source_id_of_id fresh_id'')
                     (string_of_sort sourcetype) ;
               if innersort = "Prop" then
                begin
@@ -208,19 +242,19 @@ prerr_endline "*************** FINE DOUBLE TYPE INFERENCE ************";
                (fresh_id'',n, aux' context idrefs s,
                 aux' ((Some (n, C.Decl s)::context)) (fresh_id''::idrefs) t)
           | C.LetIn (n,s,t) ->
-             Hashtbl.add ids_to_inner_sorts fresh_id'' innersort ;
+             xxx_add ids_to_inner_sorts fresh_id'' innersort ;
              if innersort = "Prop" then
               add_inner_type fresh_id'' ;
              C.ALetIn
               (fresh_id'', n, aux' context idrefs s,
-               aux' ((Some (n, C.Def s))::context) (fresh_id''::idrefs) t)
+               aux' ((Some (n, C.Def(s,None)))::context) (fresh_id''::idrefs) t)
           | C.Appl l ->
-             Hashtbl.add ids_to_inner_sorts fresh_id'' innersort ;
+             xxx_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 idrefs) l)
           | C.Const (uri,exp_named_subst) ->
-             Hashtbl.add ids_to_inner_sorts fresh_id'' innersort ;
+             xxx_add ids_to_inner_sorts fresh_id'' innersort ;
              if innersort = "Prop"  && expected_available then
               add_inner_type fresh_id'' ;
              let exp_named_subst' =
@@ -235,7 +269,7 @@ prerr_endline "*************** FINE DOUBLE TYPE INFERENCE ************";
              in
               C.AMutInd (fresh_id'', uri, tyno, exp_named_subst')
           | C.MutConstruct (uri,tyno,consno,exp_named_subst) ->
-             Hashtbl.add ids_to_inner_sorts fresh_id'' innersort ;
+             xxx_add ids_to_inner_sorts fresh_id'' innersort ;
              if innersort = "Prop"  && expected_available then
               add_inner_type fresh_id'' ;
              let exp_named_subst' =
@@ -244,7 +278,7 @@ prerr_endline "*************** FINE DOUBLE TYPE INFERENCE ************";
              in
               C.AMutConstruct (fresh_id'', uri, tyno, consno, exp_named_subst')
           | C.MutCase (uri, tyno, outty, term, patterns) ->
-             Hashtbl.add ids_to_inner_sorts fresh_id'' innersort ;
+             xxx_add ids_to_inner_sorts fresh_id'' innersort ;
              if innersort = "Prop" then
               add_inner_type fresh_id'' ;
              C.AMutCase (fresh_id'', uri, tyno, aux' context idrefs outty,
@@ -256,7 +290,7 @@ prerr_endline "*************** FINE DOUBLE TYPE INFERENCE ************";
              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 ;
+              xxx_add ids_to_inner_sorts fresh_id'' innersort ;
               if innersort = "Prop" then
                add_inner_type fresh_id'' ;
               C.AFix (fresh_id'', funno,
@@ -273,7 +307,7 @@ prerr_endline "*************** FINE DOUBLE TYPE INFERENCE ************";
              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 ;
+              xxx_add ids_to_inner_sorts fresh_id'' innersort ;
               if innersort = "Prop" then
                add_inner_type fresh_id'' ;
               C.ACoFix (fresh_id'', funno,
@@ -284,7 +318,12 @@ prerr_endline "*************** FINE DOUBLE TYPE INFERENCE ************";
                 ) fresh_idrefs funs
               )
         in
-         aux true None context idrefs t
+         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
 ;;
 
 let acic_of_cic_context metasenv context idrefs t =
@@ -341,7 +380,6 @@ let acic_object_of_cic_object obj =
         C.AVariable
          ("mettereaposto",id,abo,aty, params)
     | C.CurrentProof (id,conjectures,bo,ty,params) ->
-prerr_endline "************* INIZIO ETA_FIXING (congetture) ********" ;
        let conjectures' =
         List.map
          (function (i,canonical_context,term) ->
@@ -350,19 +388,20 @@ prerr_endline "************* INIZIO ETA_FIXING (congetture) ********" ;
              (function
                  None -> None
                | Some (n, C.Decl t)-> Some (n, C.Decl (E.eta_fix conjectures t))
-               | Some (n, C.Def t) -> Some (n, C.Def (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
            in
            let term' = E.eta_fix conjectures term in
             (i,canonical_context',term')
          ) conjectures
        in
-prerr_endline "************* INIZIO CIC ==> ACIC (congetture) ********" ;
        let aconjectures =
         List.map
          (function (i,canonical_context,term) as conjecture ->
            let cid = "c" ^ string_of_int !conjectures_seed in
-            Hashtbl.add ids_to_conjectures cid conjecture ;
+            xxx_add ids_to_conjectures cid conjecture ;
             incr conjectures_seed ;
             let idrefs',revacanonical_context =
              let rec aux context idrefs =
@@ -371,7 +410,7 @@ prerr_endline "************* INIZIO CIC ==> ACIC (congetture) ********" ;
                | hyp::tl ->
                   let hid = "h" ^ string_of_int !hypotheses_seed in
                   let new_idrefs = hid::idrefs in
-                   Hashtbl.add ids_to_hypotheses hid hyp ;
+                   xxx_add ids_to_hypotheses hid hyp ;
                    incr hypotheses_seed ;
                    match hyp with
                       (Some (n,C.Decl t)) ->
@@ -382,7 +421,7 @@ prerr_endline "************* INIZIO CIC ==> ACIC (congetture) ********" ;
                           conjectures context idrefs t None
                         in
                          final_idrefs,(hid,Some (n,C.ADecl at))::atl
-                    | (Some (n,C.Def t)) ->
+                    | (Some (n,C.Def (t,_))) ->
                         let final_idrefs,atl =
                          aux (hyp::context) new_idrefs tl in
                         let at =
@@ -404,13 +443,28 @@ prerr_endline "************* INIZIO CIC ==> ACIC (congetture) ********" ;
              in
               (cid,i,(List.rev revacanonical_context),aterm)
          ) conjectures' in
-prerr_endline "*********** INIZIO ETA FIXING PROVA **********";
+       let time1 = Sys.time () in
        let bo' = E.eta_fix conjectures' bo in
        let ty' = E.eta_fix conjectures' ty in
-prerr_endline "*********** INIZIO CIC ==> ACIC PROVA **********";
+       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 ;
        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) ;
+       prerr_endline
+        ("++++++++++++ Tempi della type_of_aux'_add_time(" ^ string_of_int !number_new_type_of_aux' ^ "): " ^ string_of_float !type_of_aux'_add_time) ;
+       prerr_endline
+        ("++++++++++++ Tempi della type_of_aux'_add_time nella double_type_inference(" ^ string_of_int !DoubleTypeInference.number_new_type_of_aux'_double_work ^ ";" ^ string_of_int !DoubleTypeInference.number_new_type_of_aux'_prop ^ "/" ^ string_of_int !DoubleTypeInference.number_new_type_of_aux' ^ "): " ^ string_of_float !DoubleTypeInference.type_of_aux'_add_time) ;
+       prerr_endline
+        ("++++++++++ 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) ->