1 (* Copyright (C) 2000, HELM Team.
3 * This file is part of HELM, an Hypertextual, Electronic
4 * Library of Mathematics, developed at the Computer Science
5 * Department, University of Bologna, Italy.
7 * HELM is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
12 * HELM is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with HELM; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
22 * For details, see the HELM World-Wide-Web page,
23 * http://cs.unibo.it/helm/.
26 (* TODO factorize functions to frequent errors (e.g. "Unknwon mutual inductive
31 exception AssertFailure of string;;
32 exception TypeCheckerFailure of string;;
36 let rec debug_aux t i =
38 let module U = UriManager in
39 CicPp.ppobj (C.Variable ("DEBUG", None, t, [], [])) ^ "\n" ^ i
42 raise (TypeCheckerFailure (List.fold_right debug_aux (t::context) ""))
45 let debug_print = fun _ -> () ;;
50 | (he::tl, n) -> let (l1,l2) = split tl (n-1) in (he::l1,l2)
52 raise (TypeCheckerFailure "Parameters number < left parameters number")
55 let debrujin_constructor uri number_of_types =
59 C.Rel n as t when n <= k -> t
61 raise (TypeCheckerFailure "unbound variable found in constructor type")
62 | C.Var (uri,exp_named_subst) ->
63 let exp_named_subst' =
64 List.map (function (uri,t) -> (uri,aux k t)) exp_named_subst
66 C.Var (uri,exp_named_subst')
68 let l' = List.map (function None -> None | Some t -> Some (aux k t)) l in
71 | C.Implicit _ as t -> t
72 | C.Cast (te,ty) -> C.Cast (aux k te, aux k ty)
73 | C.Prod (n,s,t) -> C.Prod (n, aux k s, aux (k+1) t)
74 | C.Lambda (n,s,t) -> C.Lambda (n, aux k s, aux (k+1) t)
75 | C.LetIn (n,s,t) -> C.LetIn (n, aux k s, aux (k+1) t)
76 | C.Appl l -> C.Appl (List.map (aux k) l)
77 | C.Const (uri,exp_named_subst) ->
78 let exp_named_subst' =
79 List.map (function (uri,t) -> (uri,aux k t)) exp_named_subst
81 C.Const (uri,exp_named_subst')
82 | C.MutInd (uri',tyno,exp_named_subst) when UriManager.eq uri uri' ->
83 if exp_named_subst != [] then
84 raise (TypeCheckerFailure
85 ("non-empty explicit named substitution is applied to "^
86 "a mutual inductive type which is being defined")) ;
87 C.Rel (k + number_of_types - tyno) ;
88 | C.MutInd (uri',tyno,exp_named_subst) ->
89 let exp_named_subst' =
90 List.map (function (uri,t) -> (uri,aux k t)) exp_named_subst
92 C.MutInd (uri',tyno,exp_named_subst')
93 | C.MutConstruct (uri,tyno,consno,exp_named_subst) ->
94 let exp_named_subst' =
95 List.map (function (uri,t) -> (uri,aux k t)) exp_named_subst
97 C.MutConstruct (uri,tyno,consno,exp_named_subst')
98 | C.MutCase (sp,i,outty,t,pl) ->
99 C.MutCase (sp, i, aux k outty, aux k t,
102 let len = List.length fl in
105 (fun (name, i, ty, bo) -> (name, i, aux k ty, aux (k+len) bo))
110 let len = List.length fl in
113 (fun (name, ty, bo) -> (name, aux k ty, aux (k+len) bo))
116 C.CoFix (i, liftedfl)
121 exception CicEnvironmentError;;
123 let rec type_of_constant ~logger uri ugraph =
124 let module C = Cic in
125 let module R = CicReduction in
126 let module U = UriManager in
128 match CicEnvironment.is_type_checked ~trust:true ugraph uri with
129 CicEnvironment.CheckedObj (cobj,ugraph') -> cobj,ugraph'
130 | CicEnvironment.UncheckedObj uobj ->
131 logger#log (`Start_type_checking uri) ;
132 (* let's typecheck the uncooked obj *)
134 (****************************************************************
135 TASSI: FIXME qui e' inutile ricordarselo,
136 tanto poi lo richiediamo alla cache che da quello su disco
137 *****************************************************************)
141 C.Constant (_,Some te,ty,_,_) ->
142 let _,ugraph = type_of ~logger ty ugraph in
143 let type_of_te,ugraph' = type_of ~logger te ugraph in
144 let b',ugraph'' = (R.are_convertible [] type_of_te ty ugraph') in
146 raise (TypeCheckerFailure (sprintf
147 "the constant %s is not well typed because the type %s of the body is not convertible to the declared type %s"
148 (U.string_of_uri uri) (CicPp.ppterm type_of_te)
152 | C.Constant (_,None,ty,_,_) ->
153 (* only to check that ty is well-typed *)
154 let _,ugraph' = type_of ~logger ty ugraph in
156 | C.CurrentProof (_,conjs,te,ty,_,_) ->
159 (fun (metasenv,ugraph) ((_,context,ty) as conj) ->
161 type_of_aux' ~logger metasenv context ty ugraph
163 (metasenv @ [conj],ugraph')
166 let _,ugraph2 = type_of_aux' ~logger conjs [] ty ugraph1 in
167 let type_of_te,ugraph3 =
168 type_of_aux' ~logger conjs [] te ugraph2
170 let b,ugraph4 = (R.are_convertible [] type_of_te ty ugraph3) in
172 raise (TypeCheckerFailure (sprintf
173 "the current proof %s is not well typed because the type %s of the body is not convertible to the declared type %s"
174 (U.string_of_uri uri) (CicPp.ppterm type_of_te)
179 raise (TypeCheckerFailure
180 ("Unknown constant:" ^ U.string_of_uri uri)))
183 CicEnvironment.set_type_checking_info uri;
184 logger#log (`Type_checking_completed uri) ;
185 match CicEnvironment.is_type_checked ~trust:false ugraph uri with
186 CicEnvironment.CheckedObj (cobj,ugraph') -> cobj,ugraph'
187 | CicEnvironment.UncheckedObj _ -> raise CicEnvironmentError
188 with Invalid_argument s ->
189 (*debug_print (lazy s);*)
192 match cobj,ugraph with
193 (C.Constant (_,_,ty,_,_)),g -> ty,g
194 | (C.CurrentProof (_,_,_,ty,_,_)),g -> ty,g
196 raise (TypeCheckerFailure ("Unknown constant:" ^ U.string_of_uri uri))
198 and type_of_variable ~logger uri ugraph =
199 let module C = Cic in
200 let module R = CicReduction in
201 let module U = UriManager in
202 (* 0 because a variable is never cooked => no partial cooking at one level *)
203 match CicEnvironment.is_type_checked ~trust:true ugraph uri with
204 CicEnvironment.CheckedObj ((C.Variable (_,_,ty,_,_)),ugraph') -> ty,ugraph'
205 | CicEnvironment.UncheckedObj (C.Variable (_,bo,ty,_,_)) ->
206 logger#log (`Start_type_checking uri) ;
207 (* only to check that ty is well-typed *)
208 let _,ugraph1 = type_of ~logger ty ugraph in
213 let ty_bo,ugraph' = type_of ~logger bo ugraph1 in
214 let b,ugraph'' = (R.are_convertible [] ty_bo ty ugraph') in
216 raise (TypeCheckerFailure
217 ("Unknown variable:" ^ U.string_of_uri uri))
222 CicEnvironment.set_type_checking_info uri ;
223 logger#log (`Type_checking_completed uri) ;
224 match CicEnvironment.is_type_checked ~trust:false ugraph uri with
225 CicEnvironment.CheckedObj ((C.Variable (_,_,ty,_,_)),ugraph') ->
227 | CicEnvironment.CheckedObj _
228 | CicEnvironment.UncheckedObj _ -> raise CicEnvironmentError
229 with Invalid_argument s ->
230 (*debug_print (lazy s);*)
233 raise (TypeCheckerFailure ("Unknown variable:" ^ U.string_of_uri uri))
235 and does_not_occur context n nn te =
236 let module C = Cic in
237 (*CSC: whd sembra essere superflua perche' un caso in cui l'occorrenza *)
238 (*CSC: venga mangiata durante la whd sembra presentare problemi di *)
240 match CicReduction.whd context te with
241 C.Rel m when m > n && m <= nn -> false
243 | C.Meta _ (* CSC: Are we sure? No recursion?*)
245 | C.Implicit _ -> true
247 does_not_occur context n nn te && does_not_occur context n nn ty
248 | C.Prod (name,so,dest) ->
249 does_not_occur context n nn so &&
250 does_not_occur((Some (name,(C.Decl so)))::context) (n + 1) (nn + 1)
252 | C.Lambda (name,so,dest) ->
253 does_not_occur context n nn so &&
254 does_not_occur((Some (name,(C.Decl so)))::context) (n + 1) (nn + 1)
256 | C.LetIn (name,so,dest) ->
257 does_not_occur context n nn so &&
258 does_not_occur ((Some (name,(C.Def (so,None))))::context)
259 (n + 1) (nn + 1) dest
261 List.fold_right (fun x i -> i && does_not_occur context n nn x) l true
262 | C.Var (_,exp_named_subst)
263 | C.Const (_,exp_named_subst)
264 | C.MutInd (_,_,exp_named_subst)
265 | C.MutConstruct (_,_,_,exp_named_subst) ->
266 List.fold_right (fun (_,x) i -> i && does_not_occur context n nn x)
268 | C.MutCase (_,_,out,te,pl) ->
269 does_not_occur context n nn out && does_not_occur context n nn te &&
270 List.fold_right (fun x i -> i && does_not_occur context n nn x) pl true
272 let len = List.length fl in
273 let n_plus_len = n + len in
274 let nn_plus_len = nn + len in
276 List.map (fun (n,_,ty,_) -> Some (C.Name n,(Cic.Decl ty))) fl
279 (fun (_,_,ty,bo) i ->
280 i && does_not_occur context n nn ty &&
281 does_not_occur (tys @ context) n_plus_len nn_plus_len bo
284 let len = List.length fl in
285 let n_plus_len = n + len in
286 let nn_plus_len = nn + len in
288 List.map (fun (n,ty,_) -> Some (C.Name n,(Cic.Decl ty))) fl
292 i && does_not_occur context n nn ty &&
293 does_not_occur (tys @ context) n_plus_len nn_plus_len bo
296 (*CSC l'indice x dei tipi induttivi e' t.c. n < x <= nn *)
297 (*CSC questa funzione e' simile alla are_all_occurrences_positive, ma fa *)
298 (*CSC dei controlli leggermente diversi. Viene invocata solamente dalla *)
299 (*CSC strictly_positive *)
300 (*CSC definizione (giusta???) tratta dalla mail di Hugo ;-) *)
301 and weakly_positive context n nn uri te =
302 let module C = Cic in
303 (*CSC: Che schifo! Bisogna capire meglio e trovare una soluzione ragionevole!*)
305 C.MutInd (HelmLibraryObjects.Datatypes.nat_URI,0,[])
307 (*CSC mettere in cicSubstitution *)
308 let rec subst_inductive_type_with_dummy_mutind =
310 C.MutInd (uri',0,_) when UriManager.eq uri' uri ->
312 | C.Appl ((C.MutInd (uri',0,_))::tl) when UriManager.eq uri' uri ->
314 | C.Cast (te,ty) -> subst_inductive_type_with_dummy_mutind te
315 | C.Prod (name,so,ta) ->
316 C.Prod (name, subst_inductive_type_with_dummy_mutind so,
317 subst_inductive_type_with_dummy_mutind ta)
318 | C.Lambda (name,so,ta) ->
319 C.Lambda (name, subst_inductive_type_with_dummy_mutind so,
320 subst_inductive_type_with_dummy_mutind ta)
322 C.Appl (List.map subst_inductive_type_with_dummy_mutind tl)
323 | C.MutCase (uri,i,outtype,term,pl) ->
325 subst_inductive_type_with_dummy_mutind outtype,
326 subst_inductive_type_with_dummy_mutind term,
327 List.map subst_inductive_type_with_dummy_mutind pl)
329 C.Fix (i,List.map (fun (name,i,ty,bo) -> (name,i,
330 subst_inductive_type_with_dummy_mutind ty,
331 subst_inductive_type_with_dummy_mutind bo)) fl)
333 C.CoFix (i,List.map (fun (name,ty,bo) -> (name,
334 subst_inductive_type_with_dummy_mutind ty,
335 subst_inductive_type_with_dummy_mutind bo)) fl)
336 | C.Const (uri,exp_named_subst) ->
337 let exp_named_subst' =
339 (function (uri,t) -> (uri,subst_inductive_type_with_dummy_mutind t))
342 C.Const (uri,exp_named_subst')
343 | C.MutInd (uri,typeno,exp_named_subst) ->
344 let exp_named_subst' =
346 (function (uri,t) -> (uri,subst_inductive_type_with_dummy_mutind t))
349 C.MutInd (uri,typeno,exp_named_subst')
350 | C.MutConstruct (uri,typeno,consno,exp_named_subst) ->
351 let exp_named_subst' =
353 (function (uri,t) -> (uri,subst_inductive_type_with_dummy_mutind t))
356 C.MutConstruct (uri,typeno,consno,exp_named_subst')
359 match CicReduction.whd context te with
360 C.Appl ((C.MutInd (uri',0,_))::tl) when UriManager.eq uri' uri -> true
361 | C.MutInd (uri',0,_) when UriManager.eq uri' uri -> true
362 | C.Prod (C.Anonymous,source,dest) ->
363 strictly_positive context n nn
364 (subst_inductive_type_with_dummy_mutind source) &&
365 weakly_positive ((Some (C.Anonymous,(C.Decl source)))::context)
366 (n + 1) (nn + 1) uri dest
367 | C.Prod (name,source,dest) when
368 does_not_occur ((Some (name,(C.Decl source)))::context) 0 n dest ->
369 (* dummy abstraction, so we behave as in the anonimous case *)
370 strictly_positive context n nn
371 (subst_inductive_type_with_dummy_mutind source) &&
372 weakly_positive ((Some (name,(C.Decl source)))::context)
373 (n + 1) (nn + 1) uri dest
374 | C.Prod (name,source,dest) ->
375 does_not_occur context n nn
376 (subst_inductive_type_with_dummy_mutind source)&&
377 weakly_positive ((Some (name,(C.Decl source)))::context)
378 (n + 1) (nn + 1) uri dest
380 raise (TypeCheckerFailure "Malformed inductive constructor type")
382 (* instantiate_parameters ps (x1:T1)...(xn:Tn)C *)
383 (* returns ((x_|ps|:T_|ps|)...(xn:Tn)C){ps_1 / x1 ; ... ; ps_|ps| / x_|ps|} *)
384 and instantiate_parameters params c =
385 let module C = Cic in
386 match (c,params) with
388 | (C.Prod (_,_,ta), he::tl) ->
389 instantiate_parameters tl
390 (CicSubstitution.subst he ta)
391 | (C.Cast (te,_), _) -> instantiate_parameters params te
392 | (t,l) -> raise (AssertFailure "1")
394 and strictly_positive context n nn te =
395 let module C = Cic in
396 let module U = UriManager in
397 match CicReduction.whd context te with
400 (*CSC: bisogna controllare ty????*)
401 strictly_positive context n nn te
402 | C.Prod (name,so,ta) ->
403 does_not_occur context n nn so &&
404 strictly_positive ((Some (name,(C.Decl so)))::context) (n+1) (nn+1) ta
405 | C.Appl ((C.Rel m)::tl) when m > n && m <= nn ->
406 List.fold_right (fun x i -> i && does_not_occur context n nn x) tl true
407 | C.Appl ((C.MutInd (uri,i,exp_named_subst))::tl) ->
408 let (ok,paramsno,ity,cl,name) =
409 let o,_ = CicEnvironment.get_obj CicUniv.empty_ugraph uri in
411 C.InductiveDefinition (tl,_,paramsno,_) ->
412 let (name,_,ity,cl) = List.nth tl i in
413 (List.length tl = 1, paramsno, ity, cl, name)
415 raise (TypeCheckerFailure
416 ("Unknown inductive type:" ^ U.string_of_uri uri))
418 let (params,arguments) = split tl paramsno in
419 let lifted_params = List.map (CicSubstitution.lift 1) params in
423 instantiate_parameters lifted_params
424 (CicSubstitution.subst_vars exp_named_subst te)
429 (fun x i -> i && does_not_occur context n nn x)
431 (*CSC: MEGAPATCH3 (sara' quella giusta?)*)
436 ((Some (C.Name name,(Cic.Decl ity)))::context) (n+1) (nn+1) uri
439 | t -> does_not_occur context n nn t
441 (*CSC l'indice x dei tipi induttivi e' t.c. n < x <= nn *)
442 and are_all_occurrences_positive context uri indparamsno i n nn te =
443 let module C = Cic in
444 match CicReduction.whd context te with
445 C.Appl ((C.Rel m)::tl) when m = i ->
446 (*CSC: riscrivere fermandosi a 0 *)
447 (* let's check if the inductive type is applied at least to *)
448 (* indparamsno parameters *)
454 match CicReduction.whd context x with
455 C.Rel m when m = n - (indparamsno - k) -> k - 1
457 raise (TypeCheckerFailure
458 ("Non-positive occurence in mutual inductive definition(s) " ^
459 UriManager.string_of_uri uri))
463 List.fold_right (fun x i -> i && does_not_occur context n nn x) tl true
465 raise (TypeCheckerFailure
466 ("Non-positive occurence in mutual inductive definition(s) " ^
467 UriManager.string_of_uri uri))
468 | C.Rel m when m = i ->
469 if indparamsno = 0 then
472 raise (TypeCheckerFailure
473 ("Non-positive occurence in mutual inductive definition(s) " ^
474 UriManager.string_of_uri uri))
475 | C.Prod (C.Anonymous,source,dest) ->
476 strictly_positive context n nn source &&
477 are_all_occurrences_positive
478 ((Some (C.Anonymous,(C.Decl source)))::context) uri indparamsno
479 (i+1) (n + 1) (nn + 1) dest
480 | C.Prod (name,source,dest) when
481 does_not_occur ((Some (name,(C.Decl source)))::context) 0 n dest ->
482 (* dummy abstraction, so we behave as in the anonimous case *)
483 strictly_positive context n nn source &&
484 are_all_occurrences_positive
485 ((Some (name,(C.Decl source)))::context) uri indparamsno
486 (i+1) (n + 1) (nn + 1) dest
487 | C.Prod (name,source,dest) ->
488 does_not_occur context n nn source &&
489 are_all_occurrences_positive ((Some (name,(C.Decl source)))::context)
490 uri indparamsno (i+1) (n + 1) (nn + 1) dest
493 (TypeCheckerFailure ("Malformed inductive constructor type " ^
494 (UriManager.string_of_uri uri)))
496 (* Main function to checks the correctness of a mutual *)
497 (* inductive block definition. This is the function *)
498 (* exported to the proof-engine. *)
499 and typecheck_mutual_inductive_defs ~logger uri (itl,_,indparamsno) ugraph =
500 let module U = UriManager in
501 (* let's check if the arity of the inductive types are well *)
503 let ugrap1 = List.fold_left
504 (fun ugraph (_,_,x,_) -> let _,ugraph' =
505 type_of ~logger x ugraph in ugraph')
508 (* let's check if the types of the inductive constructors *)
509 (* are well formed. *)
510 (* In order not to use type_of_aux we put the types of the *)
511 (* mutual inductive types at the head of the types of the *)
512 (* constructors using Prods *)
513 let len = List.length itl in
515 List.map (fun (n,_,ty,_) -> Some (Cic.Name n,(Cic.Decl ty))) itl in
518 (fun (_,_,_,cl) (i,ugraph) ->
521 (fun ugraph (name,te) ->
522 let debrujinedte = debrujin_constructor uri len te in
525 (fun (name,_,ty,_) i -> Cic.Prod (Cic.Name name, ty, i))
528 let _,ugraph' = type_of ~logger augmented_term ugraph in
529 (* let's check also the positivity conditions *)
532 (are_all_occurrences_positive tys uri indparamsno i 0 len
536 (TypeCheckerFailure ("Non positive occurence in " ^
537 U.string_of_uri uri))
546 (* Main function to checks the correctness of a mutual *)
547 (* inductive block definition. *)
548 and check_mutual_inductive_defs uri obj ugraph =
550 Cic.InductiveDefinition (itl, params, indparamsno, _) ->
551 typecheck_mutual_inductive_defs uri (itl,params,indparamsno) ugraph
553 raise (TypeCheckerFailure (
554 "Unknown mutual inductive definition:" ^
555 UriManager.string_of_uri uri))
557 and type_of_mutual_inductive_defs ~logger uri i ugraph =
558 let module C = Cic in
559 let module R = CicReduction in
560 let module U = UriManager in
562 match CicEnvironment.is_type_checked ~trust:true ugraph uri with
563 CicEnvironment.CheckedObj (cobj,ugraph') -> cobj,ugraph'
564 | CicEnvironment.UncheckedObj uobj ->
565 logger#log (`Start_type_checking uri) ;
567 check_mutual_inductive_defs ~logger uri uobj ugraph
569 (* TASSI: FIXME: check ugraph1 == ugraph ritornato da env *)
571 CicEnvironment.set_type_checking_info uri ;
572 logger#log (`Type_checking_completed uri) ;
573 (match CicEnvironment.is_type_checked ~trust:false ugraph uri with
574 CicEnvironment.CheckedObj (cobj,ugraph') -> (cobj,ugraph')
575 | CicEnvironment.UncheckedObj _ -> raise CicEnvironmentError
578 Invalid_argument s ->
579 (*debug_print (lazy s);*)
583 C.InductiveDefinition (dl,_,_,_) ->
584 let (_,_,arity,_) = List.nth dl i in
587 raise (TypeCheckerFailure ("Unknown mutual inductive definition:" ^
588 U.string_of_uri uri))
590 and type_of_mutual_inductive_constr ~logger uri i j ugraph =
591 let module C = Cic in
592 let module R = CicReduction in
593 let module U = UriManager in
595 match CicEnvironment.is_type_checked ~trust:true ugraph uri with
596 CicEnvironment.CheckedObj (cobj,ugraph') -> cobj,ugraph'
597 | CicEnvironment.UncheckedObj uobj ->
598 logger#log (`Start_type_checking uri) ;
600 check_mutual_inductive_defs ~logger uri uobj ugraph
602 (* check ugraph1 validity ??? == ugraph' *)
604 CicEnvironment.set_type_checking_info uri ;
605 logger#log (`Type_checking_completed uri) ;
607 CicEnvironment.is_type_checked ~trust:false ugraph uri
609 CicEnvironment.CheckedObj (cobj,ugraph') -> cobj,ugraph'
610 | CicEnvironment.UncheckedObj _ ->
611 raise CicEnvironmentError)
613 Invalid_argument s ->
614 (*debug_print (lazy s);*)
618 C.InductiveDefinition (dl,_,_,_) ->
619 let (_,_,_,cl) = List.nth dl i in
620 let (_,ty) = List.nth cl (j-1) in
623 raise (TypeCheckerFailure ("Unknown mutual inductive definition:" ^
624 UriManager.string_of_uri uri))
626 and recursive_args context n nn te =
627 let module C = Cic in
628 match CicReduction.whd context te with
634 | C.Cast _ (*CSC ??? *) ->
635 raise (AssertFailure "3") (* due to type-checking *)
636 | C.Prod (name,so,de) ->
637 (not (does_not_occur context n nn so)) ::
638 (recursive_args ((Some (name,(C.Decl so)))::context) (n+1) (nn + 1) de)
641 raise (AssertFailure "4") (* due to type-checking *)
643 | C.Const _ -> raise (AssertFailure "5")
648 | C.CoFix _ -> raise (AssertFailure "6") (* due to type-checking *)
650 and get_new_safes ?(subst = []) context p c rl safes n nn x =
651 let module C = Cic in
652 let module U = UriManager in
653 let module R = CicReduction in
654 match (R.whd ~subst context c, R.whd ~subst context p, rl) with
655 (C.Prod (_,so,ta1), C.Lambda (name,_,ta2), b::tl) ->
656 (* we are sure that the two sources are convertible because we *)
657 (* have just checked this. So let's go along ... *)
659 List.map (fun x -> x + 1) safes
662 if b then 1::safes' else safes'
664 get_new_safes ~subst ((Some (name,(C.Decl so)))::context)
665 ta2 ta1 tl safes'' (n+1) (nn+1) (x+1)
666 | (C.Prod _, (C.MutConstruct _ as e), _)
667 | (C.Prod _, (C.Rel _ as e), _)
668 | (C.MutInd _, e, [])
669 | (C.Appl _, e, []) -> (e,safes,n,nn,x,context)
671 (* CSC: If the next exception is raised, it just means that *)
672 (* CSC: the proof-assistant allows to use very strange things *)
673 (* CSC: as a branch of a case whose type is a Prod. In *)
674 (* CSC: particular, this means that a new (C.Prod, x,_) case *)
675 (* CSC: must be considered in this match. (e.g. x = MutCase) *)
678 (Printf.sprintf "Get New Safes: c=%s ; p=%s"
679 (CicPp.ppterm c) (CicPp.ppterm p)))
681 and split_prods ?(subst = []) context n te =
682 let module C = Cic in
683 let module R = CicReduction in
684 match (n, R.whd context te) with
686 | (n, C.Prod (name,so,ta)) when n > 0 ->
687 split_prods ~subst ((Some (name,(C.Decl so)))::context) (n - 1) ta
688 | (_, _) -> raise (AssertFailure "8")
690 and eat_lambdas ?(subst = []) context n te =
691 let module C = Cic in
692 let module R = CicReduction in
693 match (n, R.whd ~subst context te) with
694 (0, _) -> (te, 0, context)
695 | (n, C.Lambda (name,so,ta)) when n > 0 ->
696 let (te, k, context') =
697 eat_lambdas ~subst ((Some (name,(C.Decl so)))::context) (n - 1) ta
699 (te, k + 1, context')
701 raise (AssertFailure (sprintf "9 (%d, %s)" n (CicPp.ppterm te)))
703 (*CSC: Tutto quello che segue e' l'intuzione di luca ;-) *)
704 and check_is_really_smaller_arg ?(subst = []) context n nn kl x safes te =
705 (*CSC: forse la whd si puo' fare solo quando serve veramente. *)
706 (*CSC: cfr guarded_by_destructors *)
707 let module C = Cic in
708 let module U = UriManager in
709 match CicReduction.whd context te with
710 C.Rel m when List.mem m safes -> true
717 (* | C.Cast (te,ty) ->
718 check_is_really_smaller_arg ~subst n nn kl x safes te &&
719 check_is_really_smaller_arg ~subst n nn kl x safes ty*)
720 (* | C.Prod (_,so,ta) ->
721 check_is_really_smaller_arg ~subst n nn kl x safes so &&
722 check_is_really_smaller_arg ~subst (n+1) (nn+1) kl (x+1)
723 (List.map (fun x -> x + 1) safes) ta*)
724 | C.Prod _ -> raise (AssertFailure "10")
725 | C.Lambda (name,so,ta) ->
726 check_is_really_smaller_arg ~subst context n nn kl x safes so &&
727 check_is_really_smaller_arg ~subst ((Some (name,(C.Decl so)))::context)
728 (n+1) (nn+1) kl (x+1) (List.map (fun x -> x + 1) safes) ta
729 | C.LetIn (name,so,ta) ->
730 check_is_really_smaller_arg ~subst context n nn kl x safes so &&
731 check_is_really_smaller_arg ~subst ((Some (name,(C.Def (so,None))))::context)
732 (n+1) (nn+1) kl (x+1) (List.map (fun x -> x + 1) safes) ta
734 (*CSC: sulla coda ci vogliono dei controlli? secondo noi no, ma *)
735 (*CSC: solo perche' non abbiamo trovato controesempi *)
736 check_is_really_smaller_arg ~subst context n nn kl x safes he
737 | C.Appl [] -> raise (AssertFailure "11")
739 | C.MutInd _ -> raise (AssertFailure "12")
740 | C.MutConstruct _ -> false
741 | C.MutCase (uri,i,outtype,term,pl) ->
743 C.Rel m when List.mem m safes || m = x ->
744 let (tys,len,isinductive,paramsno,cl) =
745 let o,_ = CicEnvironment.get_obj CicUniv.empty_ugraph uri in
747 C.InductiveDefinition (tl,_,paramsno,_) ->
750 (fun (n,_,ty,_) -> Some (Cic.Name n,(Cic.Decl ty))) tl
752 let (_,isinductive,_,cl) = List.nth tl i in
756 (id, snd (split_prods ~subst tys paramsno ty))) cl
758 (tys,List.length tl,isinductive,paramsno,cl')
760 raise (TypeCheckerFailure
761 ("Unknown mutual inductive definition:" ^
762 UriManager.string_of_uri uri))
764 if not isinductive then
767 i && check_is_really_smaller_arg ~subst context n nn kl x safes p)
774 Invalid_argument _ ->
775 raise (TypeCheckerFailure "not enough patterns")
780 let debrujinedte = debrujin_constructor uri len c in
781 recursive_args tys 0 len debrujinedte
783 let (e,safes',n',nn',x',context') =
784 get_new_safes ~subst context p c rl' safes n nn x
787 check_is_really_smaller_arg ~subst context' n' nn' kl x' safes' e
789 | C.Appl ((C.Rel m)::tl) when List.mem m safes || m = x ->
790 let (tys,len,isinductive,paramsno,cl) =
791 let o,_ = CicEnvironment.get_obj CicUniv.empty_ugraph uri in
793 C.InductiveDefinition (tl,_,paramsno,_) ->
794 let (_,isinductive,_,cl) = List.nth tl i in
796 List.map (fun (n,_,ty,_) ->
797 Some(Cic.Name n,(Cic.Decl ty))) tl
802 (id, snd (split_prods ~subst tys paramsno ty))) cl
804 (tys,List.length tl,isinductive,paramsno,cl')
806 raise (TypeCheckerFailure
807 ("Unknown mutual inductive definition:" ^
808 UriManager.string_of_uri uri))
810 if not isinductive then
813 i && check_is_really_smaller_arg ~subst context n nn kl x safes p)
820 Invalid_argument _ ->
821 raise (TypeCheckerFailure "not enough patterns")
823 (*CSC: supponiamo come prima che nessun controllo sia necessario*)
824 (*CSC: sugli argomenti di una applicazione *)
828 let debrujinedte = debrujin_constructor uri len c in
829 recursive_args tys 0 len debrujinedte
831 let (e, safes',n',nn',x',context') =
832 get_new_safes context p c rl' safes n nn x
835 check_is_really_smaller_arg ~subst context' n' nn' kl x' safes' e
840 i && check_is_really_smaller_arg ~subst context n nn kl x safes p
844 let len = List.length fl in
845 let n_plus_len = n + len
846 and nn_plus_len = nn + len
847 and x_plus_len = x + len
848 and tys = List.map (fun (n,_,ty,_) -> Some (C.Name n,(C.Decl ty))) fl
849 and safes' = List.map (fun x -> x + len) safes in
851 (fun (_,_,ty,bo) i ->
853 check_is_really_smaller_arg ~subst (tys@context) n_plus_len nn_plus_len kl
857 let len = List.length fl in
858 let n_plus_len = n + len
859 and nn_plus_len = nn + len
860 and x_plus_len = x + len
861 and tys = List.map (fun (n,ty,_) -> Some (C.Name n,(C.Decl ty))) fl
862 and safes' = List.map (fun x -> x + len) safes in
866 check_is_really_smaller_arg ~subst (tys@context) n_plus_len nn_plus_len kl
870 and guarded_by_destructors ?(subst = []) context n nn kl x safes =
871 let module C = Cic in
872 let module U = UriManager in
874 C.Rel m when m > n && m <= nn -> false
876 (match List.nth context (n-1) with
877 Some (_,C.Decl _) -> true
878 | Some (_,C.Def (bo,_)) ->
879 guarded_by_destructors context m nn kl x safes
880 (CicSubstitution.lift m bo)
881 | None -> raise (TypeCheckerFailure "Reference to deleted hypothesis")
885 | C.Implicit _ -> true
887 guarded_by_destructors context n nn kl x safes te &&
888 guarded_by_destructors context n nn kl x safes ty
889 | C.Prod (name,so,ta) ->
890 guarded_by_destructors context n nn kl x safes so &&
891 guarded_by_destructors ((Some (name,(C.Decl so)))::context)
892 (n+1) (nn+1) kl (x+1) (List.map (fun x -> x + 1) safes) ta
893 | C.Lambda (name,so,ta) ->
894 guarded_by_destructors context n nn kl x safes so &&
895 guarded_by_destructors ((Some (name,(C.Decl so)))::context)
896 (n+1) (nn+1) kl (x+1) (List.map (fun x -> x + 1) safes) ta
897 | C.LetIn (name,so,ta) ->
898 guarded_by_destructors context n nn kl x safes so &&
899 guarded_by_destructors ((Some (name,(C.Def (so,None))))::context)
900 (n+1) (nn+1) kl (x+1) (List.map (fun x -> x + 1) safes) ta
901 | C.Appl ((C.Rel m)::tl) when m > n && m <= nn ->
902 let k = List.nth kl (m - n - 1) in
903 if not (List.length tl > k) then false
907 i && guarded_by_destructors context n nn kl x safes param
909 check_is_really_smaller_arg ~subst context n nn kl x safes (List.nth tl k)
912 (fun t i -> i && guarded_by_destructors context n nn kl x safes t)
914 | C.Var (_,exp_named_subst)
915 | C.Const (_,exp_named_subst)
916 | C.MutInd (_,_,exp_named_subst)
917 | C.MutConstruct (_,_,_,exp_named_subst) ->
919 (fun (_,t) i -> i && guarded_by_destructors context n nn kl x safes t)
921 | C.MutCase (uri,i,outtype,term,pl) ->
922 (match CicReduction.whd context term with
923 C.Rel m when List.mem m safes || m = x ->
924 let (tys,len,isinductive,paramsno,cl) =
925 let o,_ = CicEnvironment.get_obj CicUniv.empty_ugraph uri in
927 C.InductiveDefinition (tl,_,paramsno,_) ->
928 let len = List.length tl in
929 let (_,isinductive,_,cl) = List.nth tl i in
931 List.map (fun (n,_,ty,_) ->
932 Some(Cic.Name n,(Cic.Decl ty))) tl
937 let debrujinedty = debrujin_constructor uri len ty in
938 (id, snd (split_prods ~subst tys paramsno ty),
939 snd (split_prods ~subst tys paramsno debrujinedty)
942 (tys,len,isinductive,paramsno,cl')
944 raise (TypeCheckerFailure
945 ("Unknown mutual inductive definition:" ^
946 UriManager.string_of_uri uri))
948 if not isinductive then
949 guarded_by_destructors context n nn kl x safes outtype &&
950 guarded_by_destructors context n nn kl x safes term &&
951 (*CSC: manca ??? il controllo sul tipo di term? *)
954 i && guarded_by_destructors context n nn kl x safes p)
961 Invalid_argument _ ->
962 raise (TypeCheckerFailure "not enough patterns")
964 guarded_by_destructors context n nn kl x safes outtype &&
965 (*CSC: manca ??? il controllo sul tipo di term? *)
967 (fun (p,(_,c,brujinedc)) i ->
968 let rl' = recursive_args tys 0 len brujinedc in
969 let (e,safes',n',nn',x',context') =
970 get_new_safes context p c rl' safes n nn x
973 guarded_by_destructors context' n' nn' kl x' safes' e
975 | C.Appl ((C.Rel m)::tl) when List.mem m safes || m = x ->
976 let (tys,len,isinductive,paramsno,cl) =
977 let o,_ = CicEnvironment.get_obj CicUniv.empty_ugraph uri in
979 C.InductiveDefinition (tl,_,paramsno,_) ->
980 let (_,isinductive,_,cl) = List.nth tl i in
983 (fun (n,_,ty,_) -> Some(Cic.Name n,(Cic.Decl ty))) tl
988 (id, snd (split_prods ~subst tys paramsno ty))) cl
990 (tys,List.length tl,isinductive,paramsno,cl')
992 raise (TypeCheckerFailure
993 ("Unknown mutual inductive definition:" ^
994 UriManager.string_of_uri uri))
996 if not isinductive then
997 guarded_by_destructors context n nn kl x safes outtype &&
998 guarded_by_destructors context n nn kl x safes term &&
999 (*CSC: manca ??? il controllo sul tipo di term? *)
1002 i && guarded_by_destructors context n nn kl x safes p)
1009 Invalid_argument _ ->
1010 raise (TypeCheckerFailure "not enough patterns")
1012 guarded_by_destructors context n nn kl x safes outtype &&
1013 (*CSC: manca ??? il controllo sul tipo di term? *)
1016 i && guarded_by_destructors context n nn kl x safes t)
1021 let debrujinedte = debrujin_constructor uri len c in
1022 recursive_args tys 0 len debrujinedte
1024 let (e, safes',n',nn',x',context') =
1025 get_new_safes context p c rl' safes n nn x
1028 guarded_by_destructors context' n' nn' kl x' safes' e
1031 guarded_by_destructors context n nn kl x safes outtype &&
1032 guarded_by_destructors context n nn kl x safes term &&
1033 (*CSC: manca ??? il controllo sul tipo di term? *)
1035 (fun p i -> i && guarded_by_destructors context n nn kl x safes p)
1039 let len = List.length fl in
1040 let n_plus_len = n + len
1041 and nn_plus_len = nn + len
1042 and x_plus_len = x + len
1043 and tys = List.map (fun (n,_,ty,_) -> Some (C.Name n,(C.Decl ty))) fl
1044 and safes' = List.map (fun x -> x + len) safes in
1046 (fun (_,_,ty,bo) i ->
1047 i && guarded_by_destructors context n nn kl x_plus_len safes' ty &&
1048 guarded_by_destructors (tys@context) n_plus_len nn_plus_len kl
1049 x_plus_len safes' bo
1051 | C.CoFix (_, fl) ->
1052 let len = List.length fl in
1053 let n_plus_len = n + len
1054 and nn_plus_len = nn + len
1055 and x_plus_len = x + len
1056 and tys = List.map (fun (n,ty,_) -> Some (C.Name n,(C.Decl ty))) fl
1057 and safes' = List.map (fun x -> x + len) safes in
1061 guarded_by_destructors context n nn kl x_plus_len safes' ty &&
1062 guarded_by_destructors (tys@context) n_plus_len nn_plus_len kl
1063 x_plus_len safes' bo
1066 (* the boolean h means already protected *)
1067 (* args is the list of arguments the type of the constructor that may be *)
1068 (* found in head position must be applied to. *)
1069 (*CSC: coInductiveTypeURI non cambia mai di ricorsione in ricorsione *)
1070 and guarded_by_constructors context n nn h te args coInductiveTypeURI =
1071 let module C = Cic in
1072 (*CSC: There is a lot of code replication between the cases X and *)
1073 (*CSC: (C.Appl X tl). Maybe it will be better to define a function *)
1074 (*CSC: that maps X into (C.Appl X []) when X is not already a C.Appl *)
1075 match CicReduction.whd context te with
1076 C.Rel m when m > n && m <= nn -> h
1084 (* the term has just been type-checked *)
1085 raise (AssertFailure "17")
1086 | C.Lambda (name,so,de) ->
1087 does_not_occur context n nn so &&
1088 guarded_by_constructors ((Some (name,(C.Decl so)))::context)
1089 (n + 1) (nn + 1) h de args coInductiveTypeURI
1090 | C.Appl ((C.Rel m)::tl) when m > n && m <= nn ->
1092 List.fold_right (fun x i -> i && does_not_occur context n nn x) tl true
1093 | C.Appl ((C.MutConstruct (uri,i,j,exp_named_subst))::tl) ->
1097 CicEnvironment.get_cooked_obj ~trust:false CicUniv.empty_ugraph uri
1098 with Not_found -> assert false
1101 C.InductiveDefinition (itl,_,_,_) ->
1102 let (_,_,_,cl) = List.nth itl i in
1103 let (_,cons) = List.nth cl (j - 1) in
1104 CicSubstitution.subst_vars exp_named_subst cons
1106 raise (TypeCheckerFailure ("Unknown mutual inductive definition:" ^
1107 UriManager.string_of_uri uri))
1109 let rec analyse_branch context ty te =
1110 match CicReduction.whd context ty with
1111 C.Meta _ -> raise (AssertFailure "34")
1115 does_not_occur context n nn te
1118 raise (AssertFailure "24")(* due to type-checking *)
1119 | C.Prod (name,so,de) ->
1120 analyse_branch ((Some (name,(C.Decl so)))::context) de te
1123 raise (AssertFailure "25")(* due to type-checking *)
1124 | C.Appl ((C.MutInd (uri,_,_))::_) as ty
1125 when uri == coInductiveTypeURI ->
1126 guarded_by_constructors context n nn true te [] coInductiveTypeURI
1127 | C.Appl ((C.MutInd (uri,_,_))::_) as ty ->
1128 guarded_by_constructors context n nn true te tl coInductiveTypeURI
1130 does_not_occur context n nn te
1131 | C.Const _ -> raise (AssertFailure "26")
1132 | C.MutInd (uri,_,_) when uri == coInductiveTypeURI ->
1133 guarded_by_constructors context n nn true te [] coInductiveTypeURI
1135 does_not_occur context n nn te
1136 | C.MutConstruct _ -> raise (AssertFailure "27")
1137 (*CSC: we do not consider backbones with a MutCase, Fix, Cofix *)
1138 (*CSC: in head position. *)
1142 raise (AssertFailure "28")(* due to type-checking *)
1144 let rec analyse_instantiated_type context ty l =
1145 match CicReduction.whd context ty with
1151 | C.Cast _ -> raise (AssertFailure "29")(* due to type-checking *)
1152 | C.Prod (name,so,de) ->
1157 analyse_branch context so he &&
1158 analyse_instantiated_type
1159 ((Some (name,(C.Decl so)))::context) de tl
1163 raise (AssertFailure "30")(* due to type-checking *)
1166 (fun i x -> i && does_not_occur context n nn x) true l
1167 | C.Const _ -> raise (AssertFailure "31")
1170 (fun i x -> i && does_not_occur context n nn x) true l
1171 | C.MutConstruct _ -> raise (AssertFailure "32")
1172 (*CSC: we do not consider backbones with a MutCase, Fix, Cofix *)
1173 (*CSC: in head position. *)
1177 raise (AssertFailure "33")(* due to type-checking *)
1179 let rec instantiate_type args consty =
1182 | tlhe::tltl as l ->
1183 let consty' = CicReduction.whd context consty in
1189 let instantiated_de = CicSubstitution.subst he de in
1190 (*CSC: siamo sicuri che non sia troppo forte? *)
1191 does_not_occur context n nn tlhe &
1192 instantiate_type tl instantiated_de tltl
1194 (*CSC:We do not consider backbones with a MutCase, a *)
1195 (*CSC:FixPoint, a CoFixPoint and so on in head position.*)
1196 raise (AssertFailure "23")
1198 | [] -> analyse_instantiated_type context consty' l
1199 (* These are all the other cases *)
1201 instantiate_type args consty tl
1202 | C.Appl ((C.CoFix (_,fl))::tl) ->
1203 List.fold_left (fun i x -> i && does_not_occur context n nn x) true tl &&
1204 let len = List.length fl in
1205 let n_plus_len = n + len
1206 and nn_plus_len = nn + len
1207 (*CSC: Is a Decl of the ty ok or should I use Def of a Fix? *)
1208 and tys = List.map (fun (n,ty,_) -> Some (C.Name n,(C.Decl ty))) fl in
1211 i && does_not_occur context n nn ty &&
1212 guarded_by_constructors (tys@context) n_plus_len nn_plus_len h bo
1213 args coInductiveTypeURI
1215 | C.Appl ((C.MutCase (_,_,out,te,pl))::tl) ->
1216 List.fold_left (fun i x -> i && does_not_occur context n nn x) true tl &&
1217 does_not_occur context n nn out &&
1218 does_not_occur context n nn te &&
1222 guarded_by_constructors context n nn h x args coInductiveTypeURI
1225 List.fold_right (fun x i -> i && does_not_occur context n nn x) l true
1226 | C.Var (_,exp_named_subst)
1227 | C.Const (_,exp_named_subst) ->
1229 (fun (_,x) i -> i && does_not_occur context n nn x) exp_named_subst true
1230 | C.MutInd _ -> assert false
1231 | C.MutConstruct (_,_,_,exp_named_subst) ->
1233 (fun (_,x) i -> i && does_not_occur context n nn x) exp_named_subst true
1234 | C.MutCase (_,_,out,te,pl) ->
1235 does_not_occur context n nn out &&
1236 does_not_occur context n nn te &&
1240 guarded_by_constructors context n nn h x args coInductiveTypeURI
1243 let len = List.length fl in
1244 let n_plus_len = n + len
1245 and nn_plus_len = nn + len
1246 (*CSC: Is a Decl of the ty ok or should I use Def of a Fix? *)
1247 and tys = List.map (fun (n,_,ty,_)-> Some (C.Name n,(C.Decl ty))) fl in
1249 (fun (_,_,ty,bo) i ->
1250 i && does_not_occur context n nn ty &&
1251 does_not_occur (tys@context) n_plus_len nn_plus_len bo
1254 let len = List.length fl in
1255 let n_plus_len = n + len
1256 and nn_plus_len = nn + len
1257 (*CSC: Is a Decl of the ty ok or should I use Def of a Fix? *)
1258 and tys = List.map (fun (n,ty,_) -> Some (C.Name n,(C.Decl ty))) fl in
1261 i && does_not_occur context n nn ty &&
1262 guarded_by_constructors (tys@context) n_plus_len nn_plus_len h bo
1263 args coInductiveTypeURI
1266 and check_allowed_sort_elimination ~subst ~metasenv ~logger context uri i
1267 need_dummy ind arity1 arity2 ugraph =
1268 let module C = Cic in
1269 let module U = UriManager in
1270 match (CicReduction.whd ~subst context arity1, CicReduction.whd ~subst context arity2) with
1271 (C.Prod (_,so1,de1), C.Prod (_,so2,de2)) ->
1273 CicReduction.are_convertible ~subst ~metasenv context so1 so2 ugraph in
1275 check_allowed_sort_elimination ~subst ~metasenv ~logger context uri i
1276 need_dummy (C.Appl [CicSubstitution.lift 1 ind ; C.Rel 1]) de1 de2
1280 | (C.Sort C.Prop, C.Sort C.Prop) when need_dummy -> true,ugraph
1281 | (C.Sort C.Prop, C.Sort C.Set)
1282 | (C.Sort C.Prop, C.Sort C.CProp)
1283 | (C.Sort C.Prop, C.Sort (C.Type _) ) when need_dummy ->
1284 (* TASSI: da verificare *)
1285 (*CSC: WRONG. MISSING CONDITIONS ON THE ARGUMENTS OF THE CONSTRUTOR *)
1286 (let o,_ = CicEnvironment.get_obj CicUniv.empty_ugraph uri in
1288 C.InductiveDefinition (itl,_,_,_) ->
1289 let (_,_,_,cl) = List.nth itl i in
1290 (* is a singleton definition or the empty proposition? *)
1291 (List.length cl = 1 || List.length cl = 0) , ugraph
1293 raise (TypeCheckerFailure
1294 ("Unknown mutual inductive definition:" ^
1295 UriManager.string_of_uri uri))
1297 | (C.Sort C.Set, C.Sort C.Prop) when need_dummy -> true , ugraph
1298 | (C.Sort C.CProp, C.Sort C.Prop) when need_dummy -> true , ugraph
1299 | (C.Sort C.Set, C.Sort C.Set) when need_dummy -> true , ugraph
1300 | (C.Sort C.Set, C.Sort C.CProp) when need_dummy -> true , ugraph
1301 | (C.Sort C.CProp, C.Sort C.Set) when need_dummy -> true , ugraph
1302 | (C.Sort C.CProp, C.Sort C.CProp) when need_dummy -> true , ugraph
1303 | ((C.Sort C.Set, C.Sort (C.Type _)) | (C.Sort C.CProp, C.Sort (C.Type _)))
1304 (* TASSI: da verificare *)
1306 (let o,_ = CicEnvironment.get_obj CicUniv.empty_ugraph uri in
1308 C.InductiveDefinition (itl,_,paramsno,_) ->
1310 List.map (fun (n,_,ty,_) -> Some (Cic.Name n,(Cic.Decl ty))) itl
1312 let (_,_,_,cl) = List.nth itl i in
1314 (fun (_,x) (i,ugraph) ->
1316 is_small ~logger tys paramsno x ugraph
1321 raise (TypeCheckerFailure ("Unknown mutual inductive definition:" ^
1322 UriManager.string_of_uri uri))
1324 | (C.Sort (C.Type _), C.Sort _) when need_dummy -> true , ugraph
1325 (* TASSI: da verificare *)
1326 | (C.Sort C.Prop, C.Prod (name,so,ta)) when not need_dummy ->
1328 CicReduction.are_convertible ~subst ~metasenv context so ind ugraph in
1332 (match CicReduction.whd ~subst ((Some (name,(C.Decl so)))::context) ta with
1333 C.Sort C.Prop -> true,ugraph1
1334 | (C.Sort C.Set | C.Sort C.CProp | C.Sort (C.Type _)) ->
1335 (let o,_ = CicEnvironment.get_obj CicUniv.empty_ugraph uri in
1337 C.InductiveDefinition (itl,_,_,_) ->
1338 let (_,_,_,cl) = List.nth itl i in
1339 (* is a singleton definition or the empty proposition? *)
1340 (List.length cl = 1 || List.length cl = 0),ugraph1
1342 raise (TypeCheckerFailure
1343 ("Unknown mutual inductive definition:" ^
1344 UriManager.string_of_uri uri)))
1345 | _ -> false,ugraph1)
1346 | ((C.Sort C.Set, C.Prod (name,so,ta))
1347 | (C.Sort C.CProp, C.Prod (name,so,ta)))
1348 when not need_dummy ->
1350 CicReduction.are_convertible ~subst ~metasenv context so ind ugraph in
1354 (match CicReduction.whd ~subst ((Some (name,(C.Decl so)))::context) ta with
1356 | C.Sort C.Set -> true,ugraph1
1357 | C.Sort C.CProp -> true,ugraph1
1358 | C.Sort (C.Type _) ->
1359 (* TASSI: da verificare *)
1360 (let o,_ = CicEnvironment.get_obj CicUniv.empty_ugraph uri in
1362 C.InductiveDefinition (itl,_,paramsno,_) ->
1363 let (_,_,_,cl) = List.nth itl i in
1366 (fun (n,_,ty,_) -> Some (Cic.Name n,(Cic.Decl ty))) itl
1369 (fun (_,x) (i,ugraph) ->
1371 is_small ~logger tys paramsno x ugraph
1374 ) cl (true,ugraph1))
1376 raise (TypeCheckerFailure
1377 ("Unknown mutual inductive definition:" ^
1378 UriManager.string_of_uri uri))
1380 | _ -> raise (AssertFailure "19")
1382 | (C.Sort (C.Type _), C.Prod (_,so,_)) when not need_dummy ->
1383 (* TASSI: da verificare *)
1384 CicReduction.are_convertible ~subst ~metasenv context so ind ugraph
1385 | (_,_) -> false,ugraph
1387 and type_of_branch context argsno need_dummy outtype term constype =
1388 let module C = Cic in
1389 let module R = CicReduction in
1390 match R.whd context constype with
1395 C.Appl [outtype ; term]
1396 | C.Appl (C.MutInd (_,_,_)::tl) ->
1397 let (_,arguments) = split tl argsno
1399 if need_dummy && arguments = [] then
1402 C.Appl (outtype::arguments@(if need_dummy then [] else [term]))
1403 | C.Prod (name,so,de) ->
1405 match CicSubstitution.lift 1 term with
1406 C.Appl l -> C.Appl (l@[C.Rel 1])
1407 | t -> C.Appl [t ; C.Rel 1]
1409 C.Prod (C.Anonymous,so,type_of_branch
1410 ((Some (name,(C.Decl so)))::context) argsno need_dummy
1411 (CicSubstitution.lift 1 outtype) term' de)
1412 | _ -> raise (AssertFailure "20")
1414 (* check_metasenv_consistency checks that the "canonical" context of a
1415 metavariable is consitent - up to relocation via the relocation list l -
1416 with the actual context *)
1419 and check_metasenv_consistency ~logger ?(subst=[]) metasenv context
1420 canonical_context l ugraph
1422 let module C = Cic in
1423 let module R = CicReduction in
1424 let module S = CicSubstitution in
1425 let lifted_canonical_context =
1429 | (Some (n,C.Decl t))::tl ->
1430 (Some (n,C.Decl (S.subst_meta l (S.lift i t))))::(aux (i+1) tl)
1431 | (Some (n,C.Def (t,None)))::tl ->
1432 (Some (n,C.Def ((S.subst_meta l (S.lift i t)),None)))::(aux (i+1) tl)
1433 | None::tl -> None::(aux (i+1) tl)
1434 | (Some (n,C.Def (t,Some ty)))::tl ->
1435 (Some (n,C.Def ((S.subst_meta l (S.lift i t)),Some (S.subst_meta l (S.lift i ty)))))::(aux (i+1) tl)
1437 aux 1 canonical_context
1443 | Some t,Some (_,C.Def (ct,_)) ->
1445 R.are_convertible ~subst ~metasenv context t ct ugraph
1450 (sprintf "Not well typed metavariable local context: expected a term convertible with %s, found %s" (CicPp.ppterm ct) (CicPp.ppterm t)))
1453 | Some t,Some (_,C.Decl ct) ->
1454 let type_t,ugraph1 =
1455 type_of_aux' ~logger ~subst metasenv context t ugraph
1458 R.are_convertible ~subst ~metasenv context type_t ct ugraph1
1461 raise (TypeCheckerFailure
1462 (sprintf "Not well typed metavariable local context: expected a term of type %s, found %s of type %s"
1463 (CicPp.ppterm ct) (CicPp.ppterm t)
1464 (CicPp.ppterm type_t)))
1468 raise (TypeCheckerFailure
1469 ("Not well typed metavariable local context: "^
1470 "an hypothesis, that is not hidden, is not instantiated"))
1471 ) ugraph l lifted_canonical_context
1475 type_of_aux' is just another name (with a different scope)
1479 and type_of_aux' ~logger ?(subst = []) metasenv context t ugraph =
1480 let rec type_of_aux ~logger context t ugraph =
1481 let module C = Cic in
1482 let module R = CicReduction in
1483 let module S = CicSubstitution in
1484 let module U = UriManager in
1488 match List.nth context (n - 1) with
1489 Some (_,C.Decl t) -> S.lift n t,ugraph
1490 | Some (_,C.Def (_,Some ty)) -> S.lift n ty,ugraph
1491 | Some (_,C.Def (bo,None)) ->
1492 debug_print (lazy "##### CASO DA INVESTIGARE E CAPIRE") ;
1493 type_of_aux ~logger context (S.lift n bo) ugraph
1495 (TypeCheckerFailure "Reference to deleted hypothesis")
1498 raise (TypeCheckerFailure "unbound variable")
1500 | C.Var (uri,exp_named_subst) ->
1503 check_exp_named_subst ~logger ~subst context exp_named_subst ugraph
1505 let ty,ugraph2 = type_of_variable ~logger uri ugraph1 in
1506 let ty1 = CicSubstitution.subst_vars exp_named_subst ty in
1511 let (canonical_context,term,ty) = CicUtil.lookup_subst n subst in
1513 check_metasenv_consistency ~logger
1514 ~subst metasenv context canonical_context l ugraph
1516 (* assuming subst is well typed !!!!! *)
1517 ((CicSubstitution.subst_meta l ty), ugraph1)
1518 (* type_of_aux context (CicSubstitution.subst_meta l term) *)
1519 with CicUtil.Subst_not_found _ ->
1520 let (_,canonical_context,ty) = CicUtil.lookup_meta n metasenv in
1522 check_metasenv_consistency ~logger
1523 ~subst metasenv context canonical_context l ugraph
1525 ((CicSubstitution.subst_meta l ty),ugraph1))
1526 (* TASSI: CONSTRAINTS *)
1527 | C.Sort (C.Type t) ->
1528 let t' = CicUniv.fresh() in
1529 let ugraph1 = CicUniv.add_gt t' t ugraph in
1530 (C.Sort (C.Type t')),ugraph1
1531 (* TASSI: CONSTRAINTS *)
1532 | C.Sort s -> (C.Sort (C.Type (CicUniv.fresh ()))),ugraph
1533 | C.Implicit _ -> raise (AssertFailure "21")
1534 | C.Cast (te,ty) as t ->
1535 let _,ugraph1 = type_of_aux ~logger context ty ugraph in
1536 let ty_te,ugraph2 = type_of_aux ~logger context te ugraph1 in
1538 R.are_convertible ~subst ~metasenv context ty_te ty ugraph2
1543 raise (TypeCheckerFailure
1544 (sprintf "Invalid cast %s" (CicPp.ppterm t)))
1545 | C.Prod (name,s,t) ->
1546 let sort1,ugraph1 = type_of_aux ~logger context s ugraph in
1548 type_of_aux ~logger ((Some (name,(C.Decl s)))::context) t ugraph1
1550 sort_of_prod ~subst context (name,s) (sort1,sort2) ugraph2
1551 | C.Lambda (n,s,t) ->
1552 let sort1,ugraph1 = type_of_aux ~logger context s ugraph in
1553 (match R.whd ~subst context sort1 with
1558 (TypeCheckerFailure (sprintf
1559 "Not well-typed lambda-abstraction: the source %s should be a type; instead it is a term of type %s" (CicPp.ppterm s)
1560 (CicPp.ppterm sort1)))
1563 type_of_aux ~logger ((Some (n,(C.Decl s)))::context) t ugraph1
1565 (C.Prod (n,s,type2)),ugraph2
1566 | C.LetIn (n,s,t) ->
1567 (* only to check if s is well-typed *)
1568 let ty,ugraph1 = type_of_aux ~logger context s ugraph in
1569 (* The type of a LetIn is a LetIn. Extremely slow since the computed
1570 LetIn is later reduced and maybe also re-checked.
1571 (C.LetIn (n,s, type_of_aux ((Some (n,(C.Def s)))::context) t))
1573 (* The type of the LetIn is reduced. Much faster than the previous
1574 solution. Moreover the inferred type is probably very different
1575 from the expected one.
1576 (CicReduction.whd context
1577 (C.LetIn (n,s, type_of_aux ((Some (n,(C.Def s)))::context) t)))
1579 (* One-step LetIn reduction. Even faster than the previous solution.
1580 Moreover the inferred type is closer to the expected one. *)
1583 ((Some (n,(C.Def (s,Some ty))))::context) t ugraph1
1585 (CicSubstitution.subst s ty1),ugraph2
1586 | C.Appl (he::tl) when List.length tl > 0 ->
1587 let hetype,ugraph1 = type_of_aux ~logger context he ugraph in
1588 let tlbody_and_type,ugraph2 =
1591 let ty,ugraph1 = type_of_aux ~logger context x ugraph in
1592 let _,ugraph1 = type_of_aux ~logger context ty ugraph1 in
1593 ((x,ty)::l,ugraph1))
1596 (* TASSI: questa c'era nel mio... ma non nel CVS... *)
1597 (* let _,ugraph2 = type_of_aux context hetype ugraph2 in *)
1598 eat_prods ~subst context hetype tlbody_and_type ugraph2
1599 | C.Appl _ -> raise (AssertFailure "Appl: no arguments")
1600 | C.Const (uri,exp_named_subst) ->
1603 check_exp_named_subst ~logger ~subst context exp_named_subst ugraph
1605 let cty,ugraph2 = type_of_constant ~logger uri ugraph1 in
1607 CicSubstitution.subst_vars exp_named_subst cty
1611 | C.MutInd (uri,i,exp_named_subst) ->
1614 check_exp_named_subst ~logger ~subst context exp_named_subst ugraph
1616 (* TASSI: da me c'era anche questa, ma in CVS no *)
1617 let mty,ugraph2 = type_of_mutual_inductive_defs ~logger uri i ugraph1 in
1618 (* fine parte dubbia *)
1620 CicSubstitution.subst_vars exp_named_subst mty
1624 | C.MutConstruct (uri,i,j,exp_named_subst) ->
1626 check_exp_named_subst ~logger ~subst context exp_named_subst ugraph
1628 (* TASSI: idem come sopra *)
1630 type_of_mutual_inductive_constr ~logger uri i j ugraph1
1633 CicSubstitution.subst_vars exp_named_subst mty
1636 | C.MutCase (uri,i,outtype,term,pl) ->
1637 let outsort,ugraph1 = type_of_aux ~logger context outtype ugraph in
1638 let (need_dummy, k) =
1639 let rec guess_args context t =
1640 let outtype = CicReduction.whd ~subst context t in
1642 C.Sort _ -> (true, 0)
1643 | C.Prod (name, s, t) ->
1645 guess_args ((Some (name,(C.Decl s)))::context) t in
1647 (* last prod before sort *)
1648 match CicReduction.whd ~subst context s with
1649 (*CSC: for _ see comment below about the missing named_exp_subst ?????????? *)
1650 C.MutInd (uri',i',_) when U.eq uri' uri && i' = i ->
1652 (*CSC: for _ see comment below about the missing named_exp_subst ?????????? *)
1653 | C.Appl ((C.MutInd (uri',i',_)) :: _)
1654 when U.eq uri' uri && i' = i -> (false, 1)
1662 "Malformed case analasys' output type %s"
1663 (CicPp.ppterm outtype)))
1666 let (parameters, arguments, exp_named_subst),ugraph2 =
1667 let ty,ugraph2 = type_of_aux context term ugraph1 in
1668 match R.whd context ty with
1669 (*CSC manca il caso dei CAST *)
1670 (*CSC: ma servono i parametri (uri,i)? Se si', perche' non serve anche il *)
1671 (*CSC: parametro exp_named_subst? Se no, perche' non li togliamo? *)
1672 (*CSC: Hint: nella DTD servono per gli stylesheet. *)
1673 C.MutInd (uri',i',exp_named_subst) as typ ->
1674 if U.eq uri uri' && i = i' then
1675 ([],[],exp_named_subst),ugraph2
1680 ("Case analysys: analysed term type is %s, but is expected to be (an application of) %s#1/%d{_}")
1681 (CicPp.ppterm typ) (U.string_of_uri uri) i))
1683 ((C.MutInd (uri',i',exp_named_subst) as typ):: tl) as typ' ->
1684 if U.eq uri uri' && i = i' then
1686 split tl (List.length tl - k)
1687 in (params,args,exp_named_subst),ugraph2
1692 ("Case analysys: analysed term type is %s, "^
1693 "but is expected to be (an application of) "^
1695 (CicPp.ppterm typ') (U.string_of_uri uri) i))
1701 "analysed term %s is not an inductive one")
1702 (CicPp.ppterm term)))
1704 let (b, k) = guess_args context outsort in
1705 if not b then (b, k - 1) else (b, k) in
1706 let (parameters, arguments, exp_named_subst),ugraph2 =
1707 let ty,ugraph2 = type_of_aux ~logger context term ugraph1 in
1708 match R.whd ~subst context ty with
1709 C.MutInd (uri',i',exp_named_subst) as typ ->
1710 if U.eq uri uri' && i = i' then
1711 ([],[],exp_named_subst),ugraph2
1715 ("Case analysys: analysed term type is %s (%s#1/%d{_}), but is expected to be (an application of) %s#1/%d{_}")
1716 (CicPp.ppterm typ) (U.string_of_uri uri') i' (U.string_of_uri uri) i))
1718 ((C.MutInd (uri',i',exp_named_subst) as typ):: tl) as typ' ->
1719 if U.eq uri uri' && i = i' then
1721 split tl (List.length tl - k)
1722 in (params,args,exp_named_subst),ugraph2
1726 ("Case analysys: analysed term type is %s (%s#1/%d{_}), but is expected to be (an application of) %s#1/%d{_}")
1727 (CicPp.ppterm typ) (U.string_of_uri uri') i' (U.string_of_uri uri) i))
1732 "Case analysis: analysed term %s is not an inductive one"
1733 (CicPp.ppterm term)))
1736 let's control if the sort elimination is allowed:
1739 let sort_of_ind_type =
1740 if parameters = [] then
1741 C.MutInd (uri,i,exp_named_subst)
1743 C.Appl ((C.MutInd (uri,i,exp_named_subst))::parameters)
1745 let type_of_sort_of_ind_ty,ugraph3 =
1746 type_of_aux ~logger context sort_of_ind_type ugraph2 in
1748 check_allowed_sort_elimination ~subst ~metasenv ~logger context uri i
1749 need_dummy sort_of_ind_type type_of_sort_of_ind_ty outsort ugraph3
1753 (TypeCheckerFailure ("Case analasys: sort elimination not allowed"));
1754 (* let's check if the type of branches are right *)
1758 CicEnvironment.get_cooked_obj ~trust:false CicUniv.empty_ugraph uri
1759 with Not_found -> assert false
1762 C.InductiveDefinition (_,_,parsno,_) -> parsno
1764 raise (TypeCheckerFailure
1765 ("Unknown mutual inductive definition:" ^
1766 UriManager.string_of_uri uri))
1768 let (_,branches_ok,ugraph5) =
1770 (fun (j,b,ugraph) p ->
1773 if parameters = [] then
1774 (C.MutConstruct (uri,i,j,exp_named_subst))
1777 (C.MutConstruct (uri,i,j,exp_named_subst)::parameters))
1779 let ty_p,ugraph1 = type_of_aux ~logger context p ugraph in
1780 let ty_cons,ugraph3 = type_of_aux ~logger context cons ugraph1 in
1783 type_of_branch context parsno need_dummy outtype cons
1787 ~subst ~metasenv context ty_p ty_branch ugraph3
1791 ("#### " ^ CicPp.ppterm ty_p ^
1792 " <==> " ^ CicPp.ppterm ty_branch));
1796 ) (1,true,ugraph4) pl
1798 if not branches_ok then
1800 (TypeCheckerFailure "Case analysys: wrong branch type");
1802 if not need_dummy then outtype::arguments@[term]
1803 else outtype::arguments in
1805 if need_dummy && arguments = [] then outtype
1806 else CicReduction.head_beta_reduce (C.Appl arguments')
1810 let types_times_kl,ugraph1 =
1811 (* WAS: list rev list map *)
1813 (fun (l,ugraph) (n,k,ty,_) ->
1814 let _,ugraph1 = type_of_aux ~logger context ty ugraph in
1815 ((Some (C.Name n,(C.Decl ty)),k)::l,ugraph1)
1818 let (types,kl) = List.split types_times_kl in
1819 let len = List.length types in
1822 (fun ugraph (name,x,ty,bo) ->
1824 type_of_aux ~logger (types@context) bo ugraph
1827 R.are_convertible ~subst ~metasenv (types@context)
1828 ty_bo (CicSubstitution.lift len ty) ugraph1 in
1831 let (m, eaten, context') =
1832 eat_lambdas ~subst (types @ context) (x + 1) bo
1835 let's control the guarded by
1836 destructors conditions D{f,k,x,M}
1838 if not (guarded_by_destructors context' eaten
1839 (len + eaten) kl 1 [] m) then
1842 ("Fix: not guarded by destructors"))
1847 raise (TypeCheckerFailure ("Fix: ill-typed bodies"))
1849 (*CSC: controlli mancanti solo su D{f,k,x,M} *)
1850 let (_,_,ty,_) = List.nth fl i in
1855 (fun (l,ugraph) (n,ty,_) ->
1857 type_of_aux ~logger context ty ugraph in
1858 (Some (C.Name n,(C.Decl ty))::l,ugraph1)
1861 let len = List.length types in
1864 (fun ugraph (_,ty,bo) ->
1866 type_of_aux ~logger (types @ context) bo ugraph
1869 R.are_convertible ~subst ~metasenv (types @ context) ty_bo
1870 (CicSubstitution.lift len ty) ugraph1
1874 (* let's control that the returned type is coinductive *)
1875 match returns_a_coinductive context ty with
1879 ("CoFix: does not return a coinductive type"))
1882 let's control the guarded by constructors
1885 if not (guarded_by_constructors (types @ context)
1886 0 len false bo [] uri) then
1889 ("CoFix: not guarded by constructors"))
1895 (TypeCheckerFailure ("CoFix: ill-typed bodies"))
1898 let (_,ty,_) = List.nth fl i in
1901 and check_exp_named_subst ~logger ?(subst = []) context ugraph =
1902 let rec check_exp_named_subst_aux ~logger esubsts l ugraph =
1905 | ((uri,t) as item)::tl ->
1906 let ty_uri,ugraph1 = type_of_variable ~logger uri ugraph in
1908 CicSubstitution.subst_vars esubsts ty_uri in
1909 let typeoft,ugraph2 = type_of_aux ~logger context t ugraph1 in
1911 CicReduction.are_convertible ~subst ~metasenv
1912 context typeoft typeofvar ugraph2
1915 check_exp_named_subst_aux ~logger (esubsts@[item]) tl ugraph3
1918 CicReduction.fdebug := 0 ;
1920 (CicReduction.are_convertible
1921 ~subst ~metasenv context typeoft typeofvar ugraph2) ;
1923 debug typeoft [typeofvar] ;
1924 raise (TypeCheckerFailure "Wrong Explicit Named Substitution")
1927 check_exp_named_subst_aux ~logger [] ugraph
1929 and sort_of_prod ?(subst = []) context (name,s) (t1, t2) ugraph =
1930 let module C = Cic in
1931 let t1' = CicReduction.whd ~subst context t1 in
1932 let t2' = CicReduction.whd ~subst ((Some (name,C.Decl s))::context) t2 in
1933 match (t1', t2') with
1934 (C.Sort s1, C.Sort s2)
1935 when (s2 = C.Prop or s2 = C.Set or s2 = C.CProp) ->
1936 (* different from Coq manual!!! *)
1938 | (C.Sort (C.Type t1), C.Sort (C.Type t2)) ->
1939 (* TASSI: CONSRTAINTS: the same in doubletypeinference, cicrefine *)
1940 let t' = CicUniv.fresh() in
1941 let ugraph1 = CicUniv.add_ge t' t1 ugraph in
1942 let ugraph2 = CicUniv.add_ge t' t2 ugraph1 in
1943 C.Sort (C.Type t'),ugraph2
1944 | (C.Sort _,C.Sort (C.Type t1)) ->
1945 (* TASSI: CONSRTAINTS: the same in doubletypeinference, cicrefine *)
1946 C.Sort (C.Type t1),ugraph (* c'e' bisogno di un fresh? *)
1947 | (C.Meta _, C.Sort _) -> t2',ugraph
1948 | (C.Meta _, (C.Meta (_,_) as t))
1949 | (C.Sort _, (C.Meta (_,_) as t)) when CicUtil.is_closed t ->
1951 | (_,_) -> raise (TypeCheckerFailure (sprintf
1952 "Prod: expected two sorts, found = %s, %s" (CicPp.ppterm t1')
1953 (CicPp.ppterm t2')))
1955 and eat_prods ?(subst = []) context hetype l ugraph =
1956 (*CSC: siamo sicuri che le are_convertible non lavorino con termini non *)
1960 | (hete, hety)::tl ->
1961 (match (CicReduction.whd ~subst context hetype) with
1964 CicReduction.are_convertible
1965 ~subst ~metasenv context hety s ugraph
1969 CicReduction.fdebug := -1 ;
1970 eat_prods ~subst context
1971 (CicSubstitution.subst hete t) tl ugraph1
1972 (*TASSI: not sure *)
1976 CicReduction.fdebug := 0 ;
1977 ignore (CicReduction.are_convertible
1978 ~subst ~metasenv context s hety ugraph) ;
1984 ("Appl: wrong parameter-type, expected %s, found %s")
1985 (CicPp.ppterm hetype) (CicPp.ppterm s)))
1988 raise (TypeCheckerFailure
1989 "Appl: this is not a function, it cannot be applied")
1992 and returns_a_coinductive context ty =
1993 let module C = Cic in
1994 match CicReduction.whd context ty with
1995 C.MutInd (uri,i,_) ->
1996 (*CSC: definire una funzioncina per questo codice sempre replicato *)
1999 CicEnvironment.get_cooked_obj ~trust:false CicUniv.empty_ugraph uri
2000 with Not_found -> assert false
2003 C.InductiveDefinition (itl,_,_,_) ->
2004 let (_,is_inductive,_,_) = List.nth itl i in
2005 if is_inductive then None else (Some uri)
2007 raise (TypeCheckerFailure
2008 ("Unknown mutual inductive definition:" ^
2009 UriManager.string_of_uri uri))
2011 | C.Appl ((C.MutInd (uri,i,_))::_) ->
2012 (let o,_ = CicEnvironment.get_obj CicUniv.empty_ugraph uri in
2014 C.InductiveDefinition (itl,_,_,_) ->
2015 let (_,is_inductive,_,_) = List.nth itl i in
2016 if is_inductive then None else (Some uri)
2018 raise (TypeCheckerFailure
2019 ("Unknown mutual inductive definition:" ^
2020 UriManager.string_of_uri uri))
2022 | C.Prod (n,so,de) ->
2023 returns_a_coinductive ((Some (n,C.Decl so))::context) de
2028 debug_print (lazy ("INIZIO TYPE_OF_AUX " ^ CicPp.ppterm t)) ; flush stderr ;
2031 type_of_aux ~logger context t ugraph
2033 in debug_print (lazy "FINE TYPE_OF_AUX") ; flush stderr ; res
2036 (* is a small constructor? *)
2037 (*CSC: ottimizzare calcolando staticamente *)
2038 and is_small ~logger context paramsno c ugraph =
2039 let rec is_small_aux ~logger context c ugraph =
2040 let module C = Cic in
2041 match CicReduction.whd context c with
2043 (*CSC: [] is an empty metasenv. Is it correct? *)
2044 let s,ugraph1 = type_of_aux' ~logger [] context so ugraph in
2045 let b = (s = C.Sort C.Prop || s = C.Sort C.Set || s = C.Sort C.CProp) in
2047 is_small_aux ~logger ((Some (n,(C.Decl so)))::context) de ugraph1
2050 | _ -> true,ugraph (*CSC: we trust the type-checker *)
2052 let (context',dx) = split_prods context paramsno c in
2053 is_small_aux ~logger context' dx ugraph
2055 and type_of ~logger t ugraph =
2057 debug_print (lazy ("INIZIO TYPE_OF_AUX' " ^ CicPp.ppterm t)) ; flush stderr ;
2060 type_of_aux' ~logger [] [] t ugraph
2062 in debug_print (lazy "FINE TYPE_OF_AUX'") ; flush stderr ; res
2066 let typecheck_obj0 ~logger uri ugraph =
2067 let module C = Cic in
2069 C.Constant (_,Some te,ty,_,_) ->
2070 let _,ugraph = type_of ~logger ty ugraph in
2071 let ty_te,ugraph = type_of ~logger te ugraph in
2072 let b,ugraph = (CicReduction.are_convertible [] ty_te ty ugraph) in
2074 raise (TypeCheckerFailure
2075 ("the type of the body is not the one expected"))
2078 | C.Constant (_,None,ty,_,_) ->
2079 (* only to check that ty is well-typed *)
2080 let _,ugraph = type_of ~logger ty ugraph in
2082 | C.CurrentProof (_,conjs,te,ty,_,_) ->
2085 (fun (metasenv,ugraph) ((_,context,ty) as conj) ->
2087 type_of_aux' ~logger metasenv context ty ugraph
2089 metasenv @ [conj],ugraph
2092 let _,ugraph = type_of_aux' ~logger conjs [] ty ugraph in
2093 let type_of_te,ugraph =
2094 type_of_aux' ~logger conjs [] te ugraph
2096 let b,ugraph = CicReduction.are_convertible [] type_of_te ty ugraph in
2098 raise (TypeCheckerFailure (sprintf
2099 "the current proof is not well typed because the type %s of the body is not convertible to the declared type %s"
2100 (CicPp.ppterm type_of_te) (CicPp.ppterm ty)))
2103 | C.Variable (_,bo,ty,_,_) ->
2104 (* only to check that ty is well-typed *)
2105 let _,ugraph = type_of ~logger ty ugraph in
2109 let ty_bo,ugraph = type_of ~logger bo ugraph in
2110 let b,ugraph = CicReduction.are_convertible [] ty_bo ty ugraph in
2112 raise (TypeCheckerFailure
2113 ("the body is not the one expected"))
2117 | (C.InductiveDefinition _ as obj) ->
2118 check_mutual_inductive_defs ~logger uri obj ugraph
2121 let module C = Cic in
2122 let module R = CicReduction in
2123 let module U = UriManager in
2124 let logger = new CicLogger.logger in
2125 (* ??? match CicEnvironment.is_type_checked ~trust:true uri with ???? *)
2126 match CicEnvironment.is_type_checked ~trust:false CicUniv.empty_ugraph uri with
2127 CicEnvironment.CheckedObj (cobj,ugraph') ->
2128 (* debug_print (lazy ("NON-INIZIO A TYPECHECKARE " ^ U.string_of_uri uri));*)
2130 | CicEnvironment.UncheckedObj uobj ->
2131 (* let's typecheck the uncooked object *)
2132 logger#log (`Start_type_checking uri) ;
2133 (* debug_print (lazy ("INIZIO A TYPECHECKARE " ^ U.string_of_uri uri)); *)
2134 let ugraph = typecheck_obj0 ~logger uri CicUniv.empty_ugraph uobj in
2136 CicEnvironment.set_type_checking_info uri;
2137 logger#log (`Type_checking_completed uri);
2138 match CicEnvironment.is_type_checked ~trust:false ugraph uri with
2139 CicEnvironment.CheckedObj (cobj,ugraph') -> cobj,ugraph'
2140 | _ -> raise CicEnvironmentError
2143 this is raised if set_type_checking_info is called on an object
2144 that has no associated universe file. If we are in univ_maker
2145 phase this is OK since univ_maker will properly commit the
2148 Invalid_argument s ->
2149 (*debug_print (lazy s);*)
2153 let typecheck_obj ~logger uri obj =
2154 let ugraph = typecheck_obj0 ~logger uri CicUniv.empty_ugraph obj in
2155 let ugraph, univlist, obj = CicUnivUtils.clean_and_fill uri obj ugraph in
2156 CicEnvironment.add_type_checked_obj uri (obj,ugraph,univlist)
2158 (** wrappers which instantiate fresh loggers *)
2160 let type_of_aux' ?(subst = []) metasenv context t ugraph =
2161 let logger = new CicLogger.logger in
2162 type_of_aux' ~logger ~subst metasenv context t ugraph
2164 let typecheck_obj uri obj =
2165 let logger = new CicLogger.logger in
2166 typecheck_obj ~logger uri obj