]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/software/components/ng_kernel/nCicTypeChecker.ml
better metavariable context
[helm.git] / helm / software / components / ng_kernel / nCicTypeChecker.ml
index 5daea200c976f366fa55cc0e366adcb23bcd160b..464186f2e0d1cdf91798761326cc524637733bdb 100644 (file)
@@ -691,7 +691,6 @@ and is_non_informative paramsno c =
  let context',dx = split_prods ~subst:[] [] paramsno c in
   aux context' dx
 
-
 and check_mutual_inductive_defs uri ~metasenv ~subst leftno tyl = 
   (* let's check if the arity of the inductive types are well formed *)
   List.iter (fun (_,_,x,_) -> ignore (typeof ~subst ~metasenv [] x)) tyl;
@@ -700,11 +699,12 @@ and check_mutual_inductive_defs uri ~metasenv ~subst leftno tyl =
   let tys = List.rev_map (fun (_,n,ty,_) -> (n,(C.Decl ty))) tyl in
   ignore
    (List.fold_right
-    (fun (_,_,ty,cl) i ->
+    (fun (it_relev,_,ty,cl) i ->
        let context,ty_sort = split_prods ~subst [] ~-1 ty in
        let sx_context_ty_rev,_ = HExtlib.split_nth leftno (List.rev context) in
        List.iter
-         (fun (_,_,te) -> 
+         (fun (k_relev,_,te) ->
+          let _,k_relev = HExtlib.split_nth leftno k_relev in
            let te = debruijn uri len [] te in
            let context,te = split_prods ~subst tys leftno te in
            let _,chopped_context_rev =
@@ -755,11 +755,42 @@ and check_mutual_inductive_defs uri ~metasenv ~subst leftno tyl =
            then
              raise
                (TypeCheckerFailure
-                 (lazy ("Non positive occurence in "^NUri.string_of_uri uri))))
+                 (lazy ("Non positive occurence in "^NUri.string_of_uri
+                uri)))
+           else check_relevance ~subst ~metasenv context k_relev te) 
          cl;
-        i + 1)
+        check_relevance ~subst ~metasenv [] it_relev ty;
+       i+1)
     tyl 1)
 
+and check_relevance ~subst ~metasenv context relevance ty =
+  let error context ty =
+    raise (TypeCheckerFailure 
+     (lazy ("Wrong relevance declaration: " ^ 
+     String.concat "," (List.map string_of_bool relevance)^ 
+     "\nfor type: "^PP.ppterm ~metasenv ~subst ~context ty)))
+  in
+  let rec aux context relevance ty =
+    match R.whd ~subst context ty with
+    | C.Prod (name,so,de) ->
+        let sort = typeof ~subst ~metasenv context so in
+        (match (relevance,R.whd ~subst context sort) with
+         | [],_ -> ()
+          | false::tl,C.Sort C.Prop -> aux ((name,(C.Decl so))::context) tl de
+         | true::_,C.Sort C.Prop
+         | false::_,C.Sort _
+          | false::_,C.Meta _ -> error context ty
+          | true::tl,C.Sort _
+          | true::tl,C.Meta _ -> aux ((name,(C.Decl so))::context) tl de
+          | _ -> raise (AssertFailure (lazy (Printf.sprintf
+                 "Prod: the type %s of the source of %s is not a sort"
+                  (PP.ppterm ~subst ~metasenv ~context sort)
+                  (PP.ppterm ~subst ~metasenv ~context so)))))
+    | _ -> (match relevance with
+      | [] -> ()
+      | _::_ -> error context ty)
+  in aux context relevance ty
+
 and guarded_by_destructors r_uri r_len ~subst ~metasenv context recfuns t = 
  let recursor f k t = U.fold shift_k k (fun k () -> f k) () t in
  let rec aux (context, recfuns, x as k) t = 
@@ -1022,44 +1053,39 @@ and type_of_constant ((Ref.Ref (uri,_)) as ref) =
      ty
   | _ -> raise (AssertFailure (lazy "type_of_constant: environment/reference"))
 
-and get_relevance ~subst context te args = 
-  match te with 
-  | C.Const r when List.length (E.get_relevance r) >= List.length args -> 
-      let relevance = E.get_relevance r in 
-      (match r with
-        | Ref.Ref (_,Ref.Con (_,_,lno)) ->
-            let _,relevance = HExtlib.split_nth lno relevance in
-              HExtlib.mk_list false lno @ relevance
-        | _ -> relevance)
-  | t ->
-      let ty = typeof ~subst ~metasenv:[] context t in
-      let rec aux context ty = function
-        | [] -> [] 
-       | arg::tl -> match R.whd ~subst context ty with
-          | C.Prod (name,so,de) -> 
-             let sort = typeof ~subst ~metasenv:[] context so in
-             let new_ty = S.subst ~avoid_beta_redexes:true arg de in
-             (match R.whd ~subst context sort with
-                | C.Sort C.Prop -> 
-                    false::(aux ((name,(C.Decl so))::context) new_ty tl)
-                | C.Sort _
-                | C.Meta _ -> true::(aux ((name,(C.Decl so))::context) de tl)
-                | _ -> raise (TypeCheckerFailure (lazy (Printf.sprintf
-                       "Prod: the type %s of the source of %s is not a sort" 
-                        (PP.ppterm ~subst ~metasenv:[] ~context sort)
-                        (PP.ppterm ~subst ~metasenv:[] ~context so)))))
-          | _ ->
-             raise 
-               (TypeCheckerFailure
-                 (lazy (Printf.sprintf
-                   "Appl: %s is not a function, it cannot be applied"
-                   (PP.ppterm ~subst ~metasenv:[] ~context
-                    (let res = List.length tl in
-                     let eaten = List.length args - res in
-                      (C.Appl
-                       (t::fst
-                        (HExtlib.split_nth eaten args))))))))
-      in aux context ty args
+and get_relevance ~subst context t args = 
+   let ty = typeof ~subst ~metasenv:[] context t in
+   let rec aux context ty = function
+     | [] -> [] 
+     | arg::tl -> match R.whd ~subst context ty with
+       | C.Prod (name,so,de) -> 
+           let sort = typeof ~subst ~metasenv:[] context so in
+           let new_ty = S.subst ~avoid_beta_redexes:true arg de in
+           (*prerr_endline ("so: " ^ PP.ppterm ~subst ~metasenv:[]
+            ~context so);
+           prerr_endline ("sort: " ^ PP.ppterm ~subst ~metasenv:[]
+            ~context sort);*)
+          (match R.whd ~subst context sort with
+              | C.Sort C.Prop ->
+                  false::(aux context new_ty tl)
+              | C.Sort _
+             | C.Meta _ -> true::(aux context new_ty tl)
+              | _ -> raise (TypeCheckerFailure (lazy (Printf.sprintf
+               "Prod: the type %s of the source of %s is not a sort" 
+                (PP.ppterm ~subst ~metasenv:[] ~context sort)
+                (PP.ppterm ~subst ~metasenv:[] ~context so)))))
+       | _ ->
+          raise 
+            (TypeCheckerFailure
+              (lazy (Printf.sprintf
+                "Appl: %s is not a function, it cannot be applied"
+                (PP.ppterm ~subst ~metasenv:[] ~context
+                 (let res = List.length tl in
+                  let eaten = List.length args - res in
+                   (C.Appl
+                    (t::fst
+                     (HExtlib.split_nth eaten args))))))))
+   in aux context ty args
 ;;
 
 let typecheck_context ~metasenv ~subst context =
@@ -1152,95 +1178,6 @@ let check_rel1_irrelevant ~metasenv ~subst context = fun _ -> ();;
   in 
     aux (1, context) () *)
 
-let check_relevance ~subst ~metasenv relevance ty =
-  let error () =
-    raise (TypeCheckerFailure 
-     (lazy ("Wrong relevance declaration: " ^ 
-     String.concat "," (List.map string_of_bool relevance)^ 
-     "\nfor type: "^PP.ppterm ~metasenv ~subst ~context:[] ty)))
-  in
-  let rec aux context relevance ty =
-    match R.whd ~subst context ty with
-    | C.Prod (name,so,de) ->
-        let sort = typeof ~subst ~metasenv context so in
-        (match (relevance,R.whd ~subst context sort) with
-         | [],_ -> ()
-          | false::tl,C.Sort C.Prop -> aux ((name,(C.Decl so))::context) tl de
-         | true::_,C.Sort C.Prop
-         | false::_,C.Sort _
-          | false::_,C.Meta _ -> error ()
-          | true::tl,C.Sort _
-          | true::tl,C.Meta _ -> aux ((name,(C.Decl so))::context) tl de
-          | _ -> raise (TypeCheckerFailure (lazy (Printf.sprintf
-                 "Prod: the type %s of the source of %s is not a sort"
-                  (PP.ppterm ~subst ~metasenv ~context sort)
-                  (PP.ppterm ~subst ~metasenv ~context so)))))
-    | _ -> (match relevance with
-      | [] -> ()
-      | _::_ -> error ())
-  in aux [] relevance ty
-;;
-(* old check_relevance
-
-let shift e (in_type, context, relevance) = 
-    assert (relevance = []); in_type, e::context, relevance
-  in
-  let rec aux2 (_,context,relevance as k) t = 
-    let error () = () (*
-      raise (TypeCheckerFailure 
-       (lazy ("Wrong relevance declaration: " ^ 
-       String.concat "," (List.map string_of_bool relevance)^ 
-       "\nfor: "^PP.ppterm ~metasenv ~subst ~context t))) *)
-    in
-    let rec aux (in_type, context, relevance as k) () t = 
-      match relevance, R.whd ~subst context t, in_type with
-      | _,C.Meta _,_ -> ()
-      | true::tl,C.Lambda (name,so,t), false 
-      | true::tl,C.Prod (name,so,t), true -> 
-          aux (in_type, (name, C.Decl so)::context, tl) () t
-      | false::tl,C.Lambda (name,so,t), false 
-      | false::tl,C.Prod (name,so,t), true -> 
-          let context = (name, C.Decl so)::context in
-          check_rel1_irrelevant ~metasenv ~subst context t;
-          aux (in_type, context, tl) () t
-      | [], C.Match (ref,oty,t,pl), _ ->
-          aux k () t;
-          let _,lno,itl,_,i = E.get_checked_indtys ref in
-          let rel,_,_,cl = List.nth itl i in
-          let _, rel = 
-            try HExtlib.split_nth lno rel 
-            with Failure _ -> [],[]
-          in
-          aux2 (false, context, rel) oty;
-          List.iter2 
-            (fun p (rel,_,_) -> 
-               let _,rel = 
-                 try HExtlib.split_nth lno rel 
-                 with Failure _ -> [],[]
-               in
-               aux2 (false, context, rel) p)
-            pl cl
-      | [],t,_ -> U.fold shift k aux () t
-      | rel1,C.Appl (C.Const ref :: args),_ ->
-          let relevance = E.get_relevance ref in
-          let _, relevance = 
-            try HExtlib.split_nth (List.length args) relevance 
-            with Failure _ -> [],[] 
-          in
-          prerr_endline ("rimane: "^String.concat "," (List.map string_of_bool relevance)^ " contro "^ String.concat "," (List.map string_of_bool rel1) );
-          HExtlib.list_iter_default2 (fun r1 r2 -> if not r1 && r2 then error ())
-            rel1 true relevance
-      | rel1,C.Const ref,_ ->
-          let relevance = E.get_relevance ref in
-          HExtlib.list_iter_default2 (fun r1 r2 -> if not r1 && r2 then error ())
-            rel1 true relevance
-      | _,_,_ -> error ()
-    in
-       aux k () t
-  in
-    aux2 (in_type, [], relevance)
-;;*)
-
 let typecheck_obj (uri,_height,metasenv,subst,kind) =
  (* height is not checked since it is only used to implement an optimization *)
  typecheck_metasenv metasenv;
@@ -1255,11 +1192,11 @@ let typecheck_obj (uri,_height,metasenv,subst,kind) =
         "inferred type:\n%s\nexpected type:\n%s")
         (PP.ppterm ~subst ~metasenv ~context:[] ty_te) 
         (PP.ppterm ~subst ~metasenv ~context:[] ty))));
-      check_relevance ~subst ~metasenv relevance ty
+      check_relevance ~subst ~metasenv [] relevance ty
       (*check_relevance ~in_type:false ~subst ~metasenv relevance te*)
    | C.Constant (relevance,_,None,ty,_) ->
       ignore (typeof ~subst ~metasenv [] ty);
-      check_relevance ~subst ~metasenv relevance ty
+      check_relevance ~subst ~metasenv [] relevance ty
    | C.Inductive (_, leftno, tyl, _) -> 
        check_mutual_inductive_defs uri ~metasenv ~subst leftno tyl
    | C.Fixpoint (inductive,fl,_) ->
@@ -1267,6 +1204,7 @@ let typecheck_obj (uri,_height,metasenv,subst,kind) =
         List.fold_left
          (fun (types,kl) (relevance,name,k,ty,_) ->
            let _ = typeof ~subst ~metasenv [] ty in
+           check_relevance ~subst ~metasenv [] relevance ty;
             ((name,C.Decl ty)::types, k::kl)
          ) ([],[]) fl
       in