X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Fcomponents%2Fng_kernel%2FnCicEnvironment.ml;h=57f130546d9ed4c5a663e88119fba719d6df2e7f;hb=5f87c295e57d5c5ef9bcb13d71f19b24642355be;hp=9b33de70184bfc3e3a1d32ff44aeb6c99f585a69;hpb=e2381427bca733bd36a099002fa8b7140f7a20d0;p=helm.git diff --git a/helm/software/components/ng_kernel/nCicEnvironment.ml b/helm/software/components/ng_kernel/nCicEnvironment.ml index 9b33de701..57f130546 100644 --- a/helm/software/components/ng_kernel/nCicEnvironment.ml +++ b/helm/software/components/ng_kernel/nCicEnvironment.ml @@ -11,51 +11,49 @@ (* $Id$ *) +module C = NCic +module Ref = NReference + exception CircularDependency of string Lazy.t;; exception ObjectNotFound of string Lazy.t;; exception BadDependency of string Lazy.t;; +exception BadConstraint of string Lazy.t;; -let type0 = [false, NUri.uri_of_string ("cic:/matita/pts/Type.univ")] +let type0 = [] -let u_eq (a1,a2) (b1,b2) = a1=b1 && NUri.eq a2 b2 +let le_constraints = ref [] (* strict,a,b *) -let u_lt a b = - match a,b with - | (false,a2), (true,b2) -> NUri.eq a2 b2 - | _ -> false +let rec le_path_uri avoid strict a b = + (not strict && NUri.eq a b) || + List.exists + (fun (strict',x,y) -> + NUri.eq y b && not (List.exists (NUri.eq x) avoid) && + le_path_uri (x::avoid) (strict && not strict') a x + ) !le_constraints ;; - -let leq_constraints = ref [] -let rec path a b = - List.exists (fun (x,y) -> u_eq y b && (u_eq a x || u_lt a x || path a x)) - !leq_constraints +let leq_path a b = le_path_uri [b] (fst a) (snd a) b;; let universe_leq a b = match a, b with - | a,[b] -> List.for_all (fun a -> path a b) a - | _ -> assert false - -let universe_eq a b = universe_leq b a || universe_leq a b + | a,[(false,b)] -> List.for_all (fun a -> leq_path a b) a + | _,_ -> + raise (BadConstraint + (lazy "trying to check if a universe is less or equal than an inferred universe")) -let add_lt_constraint a b = - match a,b with - | [false,a2 as a],[false,_ as b] -> - if path b a then (raise (Failure "universe inconsistency")); - leq_constraints := ((true,a2),b) :: !leq_constraints - | _ -> assert false -;; +let universe_eq a b = universe_leq b a && universe_leq a b -let add_leq_constraint a b = +let add_constraint strict a b = match a,b with - | [false,_ as a],[false,b2 as b] -> - if path (true,b2) a then (raise (Failure "universe inconsistency")); - leq_constraints := (a,b) :: !leq_constraints - | _ -> assert false + | [false,a2],[false,b2] -> + if not (le_path_uri [] strict a2 b2) then ( + if le_path_uri [] (not strict) b2 a2 then + (raise (BadConstraint (lazy "universe inconsistency"))); + le_constraints := (strict,a2,b2) :: !le_constraints) + | _ -> raise (BadConstraint + (lazy "trying to add a constraint on an inferred universe")) ;; - - let typecheck_obj,already_set = ref (fun _ -> assert false), ref false;; let set_typecheck_obj f = if !already_set then @@ -123,69 +121,60 @@ let get_checked_obj u = ;; let get_checked_decl = function - | NReference.Ref (uri, NReference.Decl) -> + | Ref.Ref (uri, Ref.Decl) -> (match get_checked_obj uri with - | _,height,_,_, NCic.Constant (rlv,name,None,ty,att) -> + | _,height,_,_, C.Constant (rlv,name,None,ty,att) -> rlv,name,ty,att,height - | _,_,_,_, NCic.Constant (_,_,Some _,_,_) -> + | _,_,_,_, C.Constant (_,_,Some _,_,_) -> prerr_endline "get_checked_decl on a definition"; assert false | _ -> prerr_endline "get_checked_decl on a non decl 2"; assert false) | _ -> prerr_endline "get_checked_decl on a non decl"; assert false ;; let get_checked_def = function - | NReference.Ref (uri, NReference.Def _) -> + | Ref.Ref (uri, Ref.Def _) -> (match get_checked_obj uri with - | _,height,_,_, NCic.Constant (rlv,name,Some bo,ty,att) -> + | _,height,_,_, C.Constant (rlv,name,Some bo,ty,att) -> rlv,name,bo,ty,att,height - | _,_,_,_, NCic.Constant (_,_,None,_,_) -> + | _,_,_,_, C.Constant (_,_,None,_,_) -> prerr_endline "get_checked_def on an axiom"; assert false | _ -> prerr_endline "get_checked_def on a non def 2"; assert false) | _ -> prerr_endline "get_checked_def on a non def"; assert false ;; let get_checked_indtys = function - | NReference.Ref (uri, (NReference.Ind (_,n)|NReference.Con (n,_))) -> + | Ref.Ref (uri, (Ref.Ind (_,n,_)|Ref.Con (n,_,_))) -> (match get_checked_obj uri with - | _,_,_,_, NCic.Inductive (inductive,leftno,tys,att) -> + | _,_,_,_, C.Inductive (inductive,leftno,tys,att) -> inductive,leftno,tys,att,n | _ -> prerr_endline "get_checked_indtys on a non ind 2"; assert false) | _ -> prerr_endline "get_checked_indtys on a non ind"; assert false ;; let get_checked_fixes_or_cofixes = function - | NReference.Ref (uri, (NReference.Fix (fixno,_,_)|NReference.CoFix fixno))-> + | Ref.Ref (uri, (Ref.Fix _|Ref.CoFix _))-> (match get_checked_obj uri with - | _,height,_,_, NCic.Fixpoint (_,funcs,att) -> + | _,height,_,_, C.Fixpoint (_,funcs,att) -> funcs, att, height | _ ->prerr_endline "get_checked_(co)fix on a non (co)fix 2";assert false) - | r -> prerr_endline ("get_checked_(co)fix on " ^ NReference.string_of_reference r); assert false -;; - -let get_indty_leftno = function - | NReference.Ref (uri, NReference.Ind _) - | NReference.Ref (uri, NReference.Con _) -> - (match get_checked_obj uri with - | _,_,_,_, NCic.Inductive (_,left,_,_) -> left - | _ ->prerr_endline "get_indty_leftno called on a non ind 2";assert false) - | _ -> prerr_endline "get_indty_leftno called on a non indty";assert false + | _ -> prerr_endline "get_checked_(co)fix on a non (co)fix"; assert false ;; -let get_relevance (NReference.Ref (_, infos) as r) = +let get_relevance (Ref.Ref (_, infos) as r) = match infos with - NReference.Def _ -> let res,_,_,_,_,_ = get_checked_def r in res - | NReference.Decl -> let res,_,_,_,_ = get_checked_decl r in res - | NReference.Ind _ -> + Ref.Def _ -> let res,_,_,_,_,_ = get_checked_def r in res + | Ref.Decl -> let res,_,_,_,_ = get_checked_decl r in res + | Ref.Ind _ -> let _,_,tl,_,n = get_checked_indtys r in let res,_,_,_ = List.nth tl n in res - | NReference.Con (_,i) -> + | Ref.Con (_,i,_) -> let _,_,tl,_,n = get_checked_indtys r in let _,_,_,cl = List.nth tl n in let res,_,_ = List.nth cl (i - 1) in res - | NReference.Fix (fixno,_,_) - | NReference.CoFix fixno -> + | Ref.Fix (fixno,_,_) + | Ref.CoFix fixno -> let fl,_,_ = get_checked_fixes_or_cofixes r in let res,_,_,_,_ = List.nth fl fixno in res