]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/software/components/ng_kernel/oCic2NCic.ml
Patch to add a debugging string to HExtlib.split_nth reverted
[helm.git] / helm / software / components / ng_kernel / oCic2NCic.ml
index b1b0d321787925a5d7b3c7f8ad6ff0562af57665..2738b1c901835183078c7a24b0f3470475f13f02 100644 (file)
@@ -22,7 +22,37 @@ let mk_type n =
      [false, NUri.uri_of_string ("cic:/matita/pts/Type"^string_of_int n^".univ")]
 ;;
 
-let cprop = [false, NUri.uri_of_string ("cic:/matita/pts/CProp.univ")];;
+let mk_cprop n = 
+  if n = 0 then 
+    [false, NUri.uri_of_string ("cic:/matita/pts/CProp.univ")]
+  else
+    [false, NUri.uri_of_string ("cic:/matita/pts/CProp"^string_of_int n^".univ")]
+;;
+
+let is_proof_irrelevant context ty =
+  match
+    CicReduction.whd context
+     (fst (CicTypeChecker.type_of_aux' [] context ty CicUniv.oblivion_ugraph))
+  with
+     Cic.Sort Cic.Prop -> true
+   | Cic.Sort _ -> false
+   | _ -> assert false
+;;
+
+exception InProp;;
+
+let get_relevance ty =
+ let rec aux context ty =
+  match CicReduction.whd context ty with
+      Cic.Prod (n,s,t) ->
+        not (is_proof_irrelevant context s)::aux (Some (n,Cic.Decl s)::context) t
+    | _ -> []
+ in aux [] ty
+(*    | ty -> if is_proof_irrelevant context ty then raise InProp else []
+ in
+   try aux [] ty
+   with InProp -> []*)
+;;
 
 (* porcatissima *)
 type reference = Ref of NUri.uri * NReference.spec
@@ -122,6 +152,17 @@ let splat mk_pi ctx t =
     (t,[]) ctx
 ;;
 
+let osplat mk_pi ctx t =
+  List.fold_left
+    (fun t c -> 
+      match c with
+      | Some (name, Cic.Def (bo,ty)) -> Cic.LetIn (name, ty, bo, t)
+      | Some (name, Cic.Decl ty) when mk_pi -> Cic.Prod (name, ty, t)
+      | Some (name, Cic.Decl ty) -> Cic.Lambda (name, ty, t)
+      | None -> assert false)
+    t ctx
+;;
+
 let context_tassonomy ctx = 
     let rec split inner acc acc1 = function 
       | Ce _ :: tl when inner -> split inner (acc+1) (acc1+1) tl
@@ -417,11 +458,11 @@ prerr_endline ("CACHE SAME NAME: " ^ NReference.string_of_reference ref ^ " <==>
  with Found ref -> Some ref
 ;;
 
+let cache1 = UriManager.UriHashtbl.create 313;;
 let rec get_height =
- let cache = UriManager.UriHashtbl.create 313 in
    function u ->
      try
-       UriManager.UriHashtbl.find cache u
+       UriManager.UriHashtbl.find cache1 u
      with
       Not_found ->
         let h = ref 0 in
@@ -435,7 +476,7 @@ let rec get_height =
                1 + !h
            | _ -> 0
          in
-           UriManager.UriHashtbl.add cache u res;
+           UriManager.UriHashtbl.add cache1 u res;
            res
 and height_of_term ?(h=ref 0) t =
  let rec aux =
@@ -463,10 +504,6 @@ and height_of_term ?(h=ref 0) t =
    1 + !h
 ;;
 
-(* we are lambda-lifting also variables that do not occur *)
-(* ctx does not distinguish successive blocks of cofix, since there may be no
- *   lambda separating them *)
-let convert_term uri t = 
   (* k=true if we are converting a term to be pushed in a ctx or if we are
             converting the type of a fix;
      k=false if we are converting a term to be put in the body of a fix;
@@ -561,13 +598,13 @@ let convert_term uri t =
         let rno_fixno = ref 0 in
         let fl, fixpoints,_ =
           List.fold_right2 
-            (fun (name,rno,_,bo) ty (l,fixpoints,idx) -> 
+            (fun (name,rno,oty,bo) ty (l,fixpoints,idx) -> 
                let bo, fixpoints_bo = aux false boctx bctx n_fl buri bo in
                let splty,fixpoints_splty = splat true ctx ty in
                let splbo,fixpoints_splbo = splat false ctx bo in
                let rno = rno + free_decls in
                if idx = fixno then rno_fixno := rno;
-               (([],name,rno,splty,splbo)::l),
+               ((get_relevance (osplat true octx oty),name,rno,splty,splbo)::l),
                fixpoints_bo@fixpoints_splty@fixpoints_splbo@fixpoints,idx+1)
             fl tys ([],fixpoints_tys,0)
         in
@@ -633,7 +670,8 @@ let convert_term uri t =
         let ty, fixpoints_ty = aux k octx ctx n_fix uri ty in
         NCic.LetIn ("cast", ty, t, NCic.Rel 1), fixpoints_t @ fixpoints_ty
     | Cic.Sort Cic.Prop -> NCic.Sort NCic.Prop,[]
-    | Cic.Sort Cic.CProp -> NCic.Sort (NCic.Type cprop),[]
+    | Cic.Sort (Cic.CProp u) -> 
+          NCic.Sort (NCic.Type (mk_cprop (CicUniv.get_rank u))),[]
     | Cic.Sort (Cic.Type u) -> 
           NCic.Sort (NCic.Type (mk_type (CicUniv.get_rank u))),[] 
     | Cic.Sort Cic.Set -> NCic.Sort (NCic.Type (mk_type 0)),[] 
@@ -723,7 +761,12 @@ let convert_term uri t =
        match ens with
           [] -> he,objs
         | _::_ -> NCic.Appl (he::ens),objs
-  in
+;;
+
+(* we are lambda-lifting also variables that do not occur *)
+(* ctx does not distinguish successive blocks of cofix, since there may be no
+ *   lambda separating them *)
+let convert_term uri t = 
    aux false [] [] 0 uri t
 ;;
 
@@ -755,29 +798,6 @@ let cook mode vars t =
   aux varsno [] vars
 ;;
 
-let is_proof_irrelevant context ty =
-  match
-    CicReduction.whd context
-     (fst (CicTypeChecker.type_of_aux' [] context ty CicUniv.oblivion_ugraph))
-  with
-     Cic.Sort Cic.Prop -> true
-   | Cic.Sort _ -> false
-   | _ -> assert false
-;;
-
-exception InProp;;
-
-let get_relevance ty =
- let rec aux context ty =
-  match CicReduction.whd context ty with
-      Cic.Prod (n,s,t) ->
-        not (is_proof_irrelevant context s)::aux (Some (n,Cic.Decl s)::context) t
-    | ty -> if is_proof_irrelevant context ty then raise InProp else []
- in
-   try aux [] ty
-   with InProp -> []
-;;
-
 let convert_obj_aux uri = function
  | Cic.Constant (name, None, ty, vars, _) ->
      let ty = cook `Pi vars ty in
@@ -824,3 +844,30 @@ let convert_obj uri obj =
 (*prerr_endline ("H(" ^ UriManager.string_of_uri uri ^ ") = " ^ string_of_int * (get_height uri));*)
   fixpoints @ [obj]
 ;;
+
+let clear () =
+  Hashtbl.clear cache;
+  UriManager.UriHashtbl.clear cache1
+;;
+
+(*
+let convert_context uri =
+  let name_of = function Cic.Name s -> s | _ -> "_" in
+  List.fold_right
+    (function 
+    | (Some (s, Cic.Decl t) as e) -> fun (nc,auxc,oc) ->
+       let t, _ = aux true oc auxc 0 uri t in
+       (name_of s, NCic.Decl t) :: nc, 
+       Ce (lazy ((name_of s, NCic.Decl t),[])) :: auxc,  e :: oc
+    | (Some (Cic.Name s, Cic.Def (t,ty)) as e) -> fun (nc,auxc,oc) ->
+       let t, _ = aux true oc auxc 0 uri t in
+       let t, _ = aux true oc auxc 0 uri ty in
+       (name_of s, NCic.Def (t,ty)) :: nc, 
+       Ce (lazy ((name_of s, NCic.Def (t,ty)),[])) :: auxc,  e :: oc
+    | None -> nc, , e :: oc
+;;
+
+let convert_term uri ctx t = 
+   aux false [] [] 0 uri t
+;;
+*)