]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/software/components/ng_kernel/nCicTypeChecker.ml
huge commit regarding universes:
[helm.git] / helm / software / components / ng_kernel / nCicTypeChecker.ml
index 6dbaf3e5d05a702c45ac967d581e60a578955466..0b4b95eba3dd2bc58d92b12056c47589791abf43 100644 (file)
@@ -395,16 +395,11 @@ let rec typeof ~subst ~metasenv context term =
         with Failure _ -> 
           raise (TypeCheckerFailure (lazy ("unbound variable " ^ string_of_int n
             ^" under: " ^ NCicPp.ppcontext ~metasenv ~subst context))))
-    | C.Sort (C.Type ([false,u] as univ)) ->
-       if NCicEnvironment.is_declared univ then
-        C.Sort (C.Type [true, u])
-       else
-        raise (TypeCheckerFailure (lazy ("undeclared universe " ^
-         NUri.string_of_uri u)))
-    | C.Sort (C.Type _) -> 
-        raise (AssertFailure (lazy ("Cannot type an inferred type: "^
-          NCicPp.ppterm ~subst ~metasenv ~context t)))
-    | C.Sort _ -> C.Sort (C.Type NCicEnvironment.type0)
+    | C.Sort s -> 
+         (try C.Sort (NCicEnvironment.typeof_sort s) 
+         with 
+         | NCicEnvironment.UntypableSort msg -> raise (TypeCheckerFailure msg)
+         | NCicEnvironment.AssertFailure msg -> raise (AssertFailure msg))
     | C.Implicit _ -> raise (AssertFailure (lazy "Implicit found"))
     | C.Meta (n,l) as t -> 
        let canonical_ctx,ty =
@@ -664,9 +659,10 @@ and check_allowed_sort_elimination ~subst ~metasenv r =
            (PP.ppterm ~subst ~metasenv ~context so)
            )));
          (match arity1, R.whd ~subst ((name,C.Decl so)::context) ta with
-           | (C.Sort C.Type _, C.Sort _)
-           | (C.Sort C.Prop, C.Sort C.Prop) -> ()
-           | (C.Sort C.Prop, C.Sort C.Type _) ->
+           | C.Sort s1, C.Sort s2 ->
+               (match NCicEnvironment.allowed_sort_elimination s1 s2 with
+               | `Yes -> ()
+               | `UnitOnly ->
        (* TODO: we should pass all these parameters since we
         * have them already *)
                let _,leftno,itl,_,i = E.get_checked_indtys r in
@@ -684,8 +680,8 @@ and check_allowed_sort_elimination ~subst ~metasenv r =
                      is_non_informative ~metasenv ~subst leftno constrty))
                 then
                  raise (TypeCheckerFailure (lazy
-                  ("Sort elimination not allowed")));
-         | _,_ -> ())
+                  ("Sort elimination not allowed"))))
+           | _ -> ())
       | _,_ -> ()
   in
    aux 
@@ -742,7 +738,9 @@ and is_non_informative ~metasenv ~subst paramsno c =
    match R.whd ~subst context c with
     | C.Prod (n,so,de) ->
        let s = typeof ~metasenv ~subst context so in
-       s = C.Sort C.Prop && aux ((n,(C.Decl so))::context) de
+       (s = C.Sort C.Prop || 
+        match s with C.Sort (C.Type ((`CProp,_)::_)) -> true | _ -> false) && 
+       aux ((n,(C.Decl so))::context) de
     | _ -> true in
  let context',dx = NCicReduction.split_prods ~subst [] paramsno c in
   aux context' dx