X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Fcomponents%2Fng_kernel%2FoCic2NCic.ml;h=096834d40fbddd87998d31e94656b45947de40f7;hb=800eb6af3e6743a66168e7003e1081b108a78df0;hp=127d421ccfd06f410fd087418827cbe2e5ea6223;hpb=7f5d0adf3d44aa3e52e882dbe5f42358b8ee96cf;p=helm.git diff --git a/helm/software/components/ng_kernel/oCic2NCic.ml b/helm/software/components/ng_kernel/oCic2NCic.ml index 127d421cc..096834d40 100644 --- a/helm/software/components/ng_kernel/oCic2NCic.ml +++ b/helm/software/components/ng_kernel/oCic2NCic.ml @@ -1,5 +1,35 @@ +(* + ||M|| This file is part of HELM, an Hypertextual, Electronic + ||A|| Library of Mathematics, developed at the Computer Science + ||T|| Department, University of Bologna, Italy. + ||I|| + ||T|| HELM is free software; you can redistribute it and/or + ||A|| modify it under the terms of the GNU General Public License + \ / version 2 or (at your option) any later version. + \ / This software is distributed as is, NO WARRANTY. + V_______________________________________________________________ *) + +(* $Id$ *) + module Ref = NReference +let nuri_of_ouri o = NUri.uri_of_string (UriManager.string_of_uri o);; + +let mk_type n = + if n = 0 then + [false, NUri.uri_of_string ("cic:/matita/pts/Type.univ")] + else + [false, NUri.uri_of_string ("cic:/matita/pts/Type"^string_of_int n^".univ")] +;; + +(* porcatissima *) +type reference = Ref of NUri.uri * NReference.spec +let reference_of_ouri u indinfo = + let u = nuri_of_ouri u in + NReference.reference_of_string + (NReference.string_of_reference (Obj.magic (Ref (u,indinfo)))) +;; + type ctx = | Ce of (NCic.hypothesis * NCic.obj list) Lazy.t | Fix of (Ref.reference * string * NCic.term) Lazy.t @@ -300,10 +330,10 @@ let alpha t1 t2 ref ref' = | NCic.Prod (_,s1,t1), NCic.Prod (_,s2,t2) -> aux s1 s2; aux t1 t2 | NCic.LetIn (_,s1,ty1,t1), NCic.LetIn (_,s2,ty2,t2) -> aux s1 s2; aux ty1 ty2; aux t1 t2 - | NCic.Const (NReference.Ref (_,uu1,xp1)), - NCic.Const (NReference.Ref (_,uu2,xp2)) when - let NReference.Ref (_,u1,_) = ref in - let NReference.Ref (_,u2,_) = ref' in + | NCic.Const (NReference.Ref (uu1,xp1)), + NCic.Const (NReference.Ref (uu2,xp2)) when + let NReference.Ref (u1,_) = ref in + let NReference.Ref (u2,_) = ref' in NUri.eq uu1 u1 && NUri.eq uu2 u2 && xp1 = xp2 -> () | NCic.Const r1, NCic.Const r2 when NReference.eq r1 r2 -> () @@ -333,13 +363,13 @@ let find_in_cache name obj ref = (function (ref',obj') -> let recno, fixno = match ref with - NReference.Ref (_,_,NReference.Fix (fixno,recno)) -> recno,fixno - | NReference.Ref (_,_,NReference.CoFix (fixno)) -> ~-1,fixno + NReference.Ref (_,NReference.Fix (fixno,recno,_)) -> recno,fixno + | NReference.Ref (_,NReference.CoFix (fixno)) -> ~-1,fixno | _ -> assert false in let recno',fixno' = match ref' with - NReference.Ref (_,_,NReference.Fix (fixno',recno)) -> recno,fixno' - | NReference.Ref (_,_,NReference.CoFix (fixno')) -> ~-1,fixno' + NReference.Ref (_,NReference.Fix (fixno',recno,_)) -> recno,fixno' + | NReference.Ref (_,NReference.CoFix (fixno')) -> ~-1,fixno' | _ -> assert false in if recno = recno' && fixno = fixno' && same_obj ref ref' (obj,obj') then ( (* @@ -356,14 +386,14 @@ prerr_endline ("CACHE SAME NAME: " ^ NReference.string_of_reference ref ^ " <==> begin match obj, ref with | (_,_,_,_,NCic.Fixpoint (true,fl,_)) , - NReference.Ref (x,y,NReference.Fix _) -> + NReference.Ref (y,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 (x,y,NReference.CoFix _) -> + NReference.Ref (y,NReference.CoFix _) -> ignore(List.fold_left (fun i (_,name,rno,_,_) -> let ref = NReference.mk_cofix i ref in Hashtbl.add cache name (ref,obj); @@ -375,6 +405,52 @@ prerr_endline ("CACHE SAME NAME: " ^ NReference.string_of_reference ref ^ " <==> with Found ref -> Some ref ;; +let rec get_height = + let cache = UriManager.UriHashtbl.create 313 in + function u -> + try + UriManager.UriHashtbl.find cache u + with + Not_found -> + let h = ref 0 in + let res = + match fst (CicEnvironment.get_obj CicUniv.oblivion_ugraph u) with + Cic.Constant (_,Some bo,ty,params,_) + | Cic.Variable (_,Some bo,ty,params,_) -> + ignore (height_of_term ~h bo); + ignore (height_of_term ~h ty); + List.iter (function uri -> h := max !h (get_height uri)) params; + 1 + !h + | _ -> 0 + in + UriManager.UriHashtbl.add cache u res; + res +and height_of_term ?(h=ref 0) t = + let rec aux = + function + Cic.Rel _ + | Cic.Sort _ -> () + | Cic.Implicit _ -> assert false + | Cic.Var (uri,exp_named_subst) + | Cic.Const (uri,exp_named_subst) + | Cic.MutInd (uri,_,exp_named_subst) + | 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.Cast (t1,t2) + | Cic.Prod (_,t1,t2) + | Cic.Lambda (_,t1,t2) -> aux t1; aux t2 + | Cic.LetIn (_,s,ty,t) -> aux s; aux ty; aux t + | Cic.Appl l -> List.iter aux l + | Cic.MutCase (_,_,outty,t,pl) -> aux outty; aux t; List.iter aux pl + | Cic.Fix (_, fl) -> List.iter (fun (_, _, ty, bo) -> aux ty; aux bo) fl; incr h + | Cic.CoFix (_, fl) -> List.iter (fun (_, ty, bo) -> aux ty; aux bo) fl; incr h + in + aux 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 *) @@ -399,7 +475,7 @@ let convert_term uri t = List.fold_right (fun (name,ty,_) (bctx, fixpoints, tys, idx) -> let ty, fixpoints_ty = aux true octx ctx n_fix uri ty in - let r = Ref.reference_of_ouri buri(Ref.CoFix idx) in + let r = reference_of_ouri buri(Ref.CoFix idx) in bctx @ [Fix (lazy (r,name,ty))], fixpoints_ty @ fixpoints,ty::tys,idx-1) fl ([], [], [], List.length fl-1) @@ -423,10 +499,10 @@ let convert_term uri t = fl tys ([],fixpoints_tys) in let obj = - NUri.nuri_of_ouri buri,0,[],[], + nuri_of_ouri buri,0,[],[], NCic.Fixpoint (false, fl, (`Generated, `Definition)) in - let r = Ref.reference_of_ouri buri (Ref.CoFix cofixno) in + let r = reference_of_ouri buri (Ref.CoFix cofixno) in let obj,r = let _,name,_,_,_ = List.nth fl cofixno in match find_in_cache name obj r with @@ -441,14 +517,14 @@ let convert_term uri t = let buri = UriManager.uri_of_string (UriManager.buri_of_uri uri^"/"^ - UriManager.name_of_uri uri ^ "___" ^ get_fresh () ^ ".con") - in + UriManager.name_of_uri uri ^ "___" ^ get_fresh () ^ ".con") in + let height = height_of_term fix - 1 in let bad_bctx, fixpoints_tys, tys, _ = List.fold_right (fun (name,recno,ty,_) (bctx, fixpoints, tys, idx) -> let ty, fixpoints_ty = aux true octx ctx n_fix uri ty in let r = (* recno is dummy here, must be lifted by the ctx len *) - Ref.reference_of_ouri buri (Ref.Fix (idx,recno)) + reference_of_ouri buri (Ref.Fix (idx,recno,height)) in bctx @ [Fix (lazy (r,name,ty))], fixpoints_ty@fixpoints,ty::tys,idx-1) @@ -458,9 +534,9 @@ let convert_term uri t = let free_decls = Lazy.force free_decls in let bctx = List.map (function ce -> match strictify ce with - | `Fix (Ref.Ref (_,_,Ref.Fix (idx, recno)),name, ty) -> - Fix (lazy (Ref.reference_of_ouri buri - (Ref.Fix (idx,recno+free_decls)),name,ty)) + | `Fix (Ref.Ref (_,Ref.Fix (idx, recno,height)),name, ty) -> + Fix (lazy (reference_of_ouri buri + (Ref.Fix (idx,recno+free_decls,height)),name,ty)) | _ -> assert false) bad_bctx @ ctx in let n_fl = List.length fl in @@ -484,9 +560,10 @@ let convert_term uri t = fl tys ([],fixpoints_tys,0) in let obj = - NUri.nuri_of_ouri buri,max_int,[],[], + nuri_of_ouri buri,height,[],[], NCic.Fixpoint (true, fl, (`Generated, `Definition)) in - let r = Ref.reference_of_ouri buri (Ref.Fix (fixno,!rno_fixno)) in +(*prerr_endline ("H(" ^ UriManager.string_of_uri buri ^ ") = " ^ string_of_int * height);*) + let r = reference_of_ouri buri (Ref.Fix (fixno,!rno_fixno,height)) in let obj,r = let _,name,_,_,_ = List.nth fl fixno in match find_in_cache name obj r with @@ -546,8 +623,8 @@ let convert_term uri t = | Cic.Sort Cic.Prop -> NCic.Sort NCic.Prop,[] | Cic.Sort Cic.CProp -> NCic.Sort NCic.CProp,[] | Cic.Sort (Cic.Type u) -> - NCic.Sort (NCic.Type (CicUniv.get_rank u)),[] - | Cic.Sort Cic.Set -> NCic.Sort (NCic.Type 0),[] + NCic.Sort (NCic.Type (mk_type (CicUniv.get_rank u))),[] + | Cic.Sort Cic.Set -> NCic.Sort (NCic.Type (mk_type 0)),[] (* calculate depth in the univ_graph*) | Cic.Appl l -> let l, fixpoints = @@ -564,9 +641,9 @@ let convert_term uri t = aux_ens k curi octx ctx n_fix uri ens (match fst(CicEnvironment.get_obj CicUniv.oblivion_ugraph curi) with | Cic.Constant (_,Some _,_,_,_) -> - NCic.Const (Ref.reference_of_ouri curi Ref.Def) + NCic.Const (reference_of_ouri curi (Ref.Def (get_height curi))) | Cic.Constant (_,None,_,_,_) -> - NCic.Const (Ref.reference_of_ouri curi Ref.Decl) + NCic.Const (reference_of_ouri curi Ref.Decl) | _ -> assert false) | Cic.MutInd (curi, tyno, ens) -> let is_inductive = @@ -576,10 +653,10 @@ let convert_term uri t = | _ -> assert false in aux_ens k curi octx ctx n_fix uri ens - (NCic.Const (Ref.reference_of_ouri curi (Ref.Ind (is_inductive,tyno)))) + (NCic.Const (reference_of_ouri curi (Ref.Ind (is_inductive,tyno)))) | Cic.MutConstruct (curi, tyno, consno, ens) -> aux_ens k curi octx ctx n_fix uri ens - (NCic.Const (Ref.reference_of_ouri curi (Ref.Con (tyno,consno)))) + (NCic.Const (reference_of_ouri curi (Ref.Con (tyno,consno)))) | Cic.Var (curi, ens) -> (match fst (CicEnvironment.get_obj CicUniv.oblivion_ugraph curi) with Cic.Variable (_,Some bo,_,_,_) -> @@ -591,7 +668,7 @@ let convert_term uri t = Cic.InductiveDefinition ([],_,_,_) -> true | Cic.InductiveDefinition ((_,b,_,_)::_,_,_,_) -> b | _ -> assert false in - let r = Ref.reference_of_ouri curi (Ref.Ind (is_inductive,tyno)) in + let r = reference_of_ouri curi (Ref.Ind (is_inductive,tyno)) in let outty, fixpoints_outty = aux k octx ctx n_fix uri outty in let t, fixpoints_t = aux k octx ctx n_fix uri t in let branches, fixpoints = @@ -661,12 +738,35 @@ 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 let nty, fixpoints = convert_term uri ty in assert(fixpoints = []); - NCic.Constant ([], name, None, nty, (`Provided,`Theorem,`Regular)), + NCic.Constant (get_relevance ty, name, None, nty, (`Provided,`Theorem,`Regular)), fixpoints | Cic.Constant (name, Some bo, ty, vars, _) -> let bo = cook `Lambda vars bo in @@ -674,7 +774,7 @@ let convert_obj_aux uri = function let nbo, fixpoints_bo = convert_term uri bo in let nty, fixpoints_ty = convert_term uri ty in assert(fixpoints_ty = []); - NCic.Constant ([], name, Some nbo, nty, (`Provided,`Theorem,`Regular)), + NCic.Constant (get_relevance ty, name, Some nbo, nty, (`Provided,`Theorem,`Regular)), fixpoints_bo @ fixpoints_ty | Cic.InductiveDefinition (itl,vars,leftno,_) -> let ind = let _,x,_,_ = List.hd itl in x in @@ -682,16 +782,16 @@ let convert_obj_aux uri = function List.fold_right (fun (name, _, ty, cl) (itl,acc) -> let ty = cook `Pi vars ty in - let ty, fix_ty = convert_term uri ty in + let nty, fix_ty = convert_term uri ty in let cl, fix_cl = List.fold_right (fun (name, ty) (cl,acc) -> let ty = cook `Pi vars ty in - let ty, fix_ty = convert_term uri ty in - ([], name, ty)::cl, acc @ fix_ty) + let nty, fix_ty = convert_term uri ty in + (get_relevance ty, name, nty)::cl, acc @ fix_ty) cl ([],[]) in - ([], name, ty, cl)::itl, fix_ty @ fix_cl @ acc) + (get_relevance ty, name, nty, cl)::itl, fix_ty @ fix_cl @ acc) itl ([],[]) in NCic.Inductive(ind, leftno + List.length @@ -710,6 +810,7 @@ let convert_obj_aux uri = function let convert_obj uri obj = reset_seed (); let o, fixpoints = convert_obj_aux uri obj in - let obj = NUri.nuri_of_ouri uri,max_int, [], [], o in + let obj = nuri_of_ouri uri,get_height uri, [], [], o in +(*prerr_endline ("H(" ^ UriManager.string_of_uri uri ^ ") = " ^ string_of_int * (get_height uri));*) fixpoints @ [obj] ;;