]> 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 ee259877dc63f7cde0ec7ef6bb2a8f6664145ba6..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
@@ -85,7 +115,7 @@ let restrict octx ctx ot =
    | ((_,objs,None)::tl, Cic.Lambda(name,oso,ota), NCic.Lambda(name',so,ta)) ->
        split_lambdas_and_letins ((Some(name,(Cic.Decl oso)))::octx)
         (Ce (lazy ((name',NCic.Decl so),objs))::ctx) tl (ota,ta)
-   | ((_,objs,Some r)::tl,Cic.Lambda(name,oso,ota),NCic.Lambda(name',so,ta)) ->
+   | ((_,_,Some r)::tl,Cic.Lambda(name,oso,ota),NCic.Lambda(name',so,ta)) ->
        split_lambdas_and_letins ((Some(name,(Cic.Decl oso)))::octx)
         (Fix (lazy (r,name',so))::ctx) tl (ota,ta)
    | ((_,objs,None)::tl,Cic.LetIn(name,obo,oty,ota),NCic.LetIn(nam',bo,ty,ta))->
@@ -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
@@ -170,7 +211,7 @@ let splat_args_for_rel ctx t ?rels n_fix =
 ;;
 
 let splat_args ctx t n_fix rels =
-  let bound, free, _, primo_ce_dopo_fix = context_tassonomy ctx in
+  let bound, _, _, primo_ce_dopo_fix = context_tassonomy ctx in
   if ctx = [] then t
   else
    let rec aux = function
@@ -204,7 +245,7 @@ let fix_outty curi tyno t context outty =
           0, Cic.Sort _ -> 0
         | 0, Cic.Prod (name,so,ty) ->
            1 + count_prods 0 (Some (name, Cic.Decl so)::context) ty
-        | n, Cic.Prod (name,so,ty) ->
+        | _, Cic.Prod (name,so,ty) ->
            count_prods (leftno - 1) (Some (name, Cic.Decl so)::context) ty
         | _,_ -> assert false
       in
@@ -398,15 +439,15 @@ prerr_endline ("CACHE SAME NAME: " ^ NReference.string_of_reference ref ^ " <==>
   begin
     match obj, ref with 
     | (_,_,_,_,NCic.Fixpoint (true,fl,_)) , 
-      NReference.Ref (y,NReference.Fix _) ->
+      NReference.Ref (_,NReference.Fix _) ->
        ignore(List.fold_left (fun i (_,name,rno,_,_) ->
          let ref = NReference.mk_fix i rno ref in
          Hashtbl.add cache name (ref,obj);
          i+1
        ) 0 fl)
     | (_,_,_,_,NCic.Fixpoint (false,fl,_)) , 
-      NReference.Ref (y,NReference.CoFix _) ->
-       ignore(List.fold_left (fun i (_,name,rno,_,_) ->
+      NReference.Ref (_,NReference.CoFix _) ->
+       ignore(List.fold_left (fun i (_,name,_,_,_) ->
          let ref = NReference.mk_cofix i ref in
          Hashtbl.add cache name (ref,obj);
          i+1
@@ -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 =
@@ -449,7 +490,7 @@ and height_of_term ?(h=ref 0) t =
  | Cic.MutConstruct (uri,_,_,exp_named_subst) ->
     h := max !h (get_height uri);
     List.iter (function (_,t) -> aux t) exp_named_subst
- | Cic.Meta (i,l) -> List.iter (function None -> () | Some t -> aux t) l
+ | Cic.Meta (_,l) -> List.iter (function None -> () | Some t -> aux t) l
  | Cic.Cast (t1,t2)
  | Cic.Prod (_,t1,t2)
  | Cic.Lambda (_,t1,t2) -> aux t1; aux t2
@@ -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
+;;
+*)