* http://cs.unibo.it/helm/.
*)
-exception NotImplemented;;
exception Impossible of int;;
exception NotWellTyped of string;;
exception WrongUriToConstant of string;;
exception NotWellFormedTypeOfInductiveConstructor of string;;
exception WrongRequiredArgument of string;;
-let log =
- let module U = UriManager in
- let indent = ref 0 in
- function
- `Start_type_checking uri ->
- print_string (
- (String.make !indent ' ') ^
- "<div style=\"margin-left: " ^
- string_of_float (float_of_int !indent *. 0.5) ^ "cm\">" ^
- "Type-Checking of " ^ (U.string_of_uri uri) ^ " started</div>\n"
- ) ;
- flush stdout ;
- incr indent
- | `Type_checking_completed uri ->
- decr indent ;
- print_string (
- (String.make !indent ' ') ^
- "<div style=\"color: green ; margin-left: " ^
- string_of_float (float_of_int !indent *. 0.5) ^ "cm\">" ^
- "Type-Checking of " ^ (U.string_of_uri uri) ^ " completed.</div>\n"
- ) ;
- flush stdout
-;;
-
let fdebug = ref 0;;
-let debug t env =
+let debug t context =
let rec debug_aux t i =
let module C = Cic in
let module U = UriManager in
CicPp.ppobj (C.Variable ("DEBUG", None, t)) ^ "\n" ^ i
in
if !fdebug = 0 then
- raise (NotWellTyped ("\n" ^ List.fold_right debug_aux (t::env) ""))
- (*print_endline ("\n" ^ List.fold_right debug_aux (t::env) "") ; flush stdout*)
+ raise (NotWellTyped ("\n" ^ List.fold_right debug_aux (t::context) ""))
+ (*print_endline ("\n" ^ List.fold_right debug_aux (t::context) "") ; flush stdout*)
;;
let rec split l n =
match CicEnvironment.is_type_checked uri cookingsno with
CicEnvironment.CheckedObj cobj -> cobj
| CicEnvironment.UncheckedObj uobj ->
- log (`Start_type_checking uri) ;
+ Logger.log (`Start_type_checking uri) ;
(* let's typecheck the uncooked obj *)
(match uobj with
C.Definition (_,te,ty,_) ->
| C.Axiom (_,ty,_) ->
(* only to check that ty is well-typed *)
let _ = type_of ty in ()
- | C.CurrentProof (_,_,te,ty) ->
- let _ = type_of ty in
- if not (R.are_convertible (type_of te) ty) then
+ | C.CurrentProof (_,conjs,te,ty) ->
+ let _ = type_of_aux' conjs [] ty in
+ if not (R.are_convertible (type_of_aux' conjs [] te) ty) then
raise (NotWellTyped ("CurrentProof" ^ (U.string_of_uri uri)))
| _ -> raise (WrongUriToConstant (U.string_of_uri uri))
) ;
CicEnvironment.set_type_checking_info uri ;
- log (`Type_checking_completed uri) ;
+ Logger.log (`Type_checking_completed uri) ;
match CicEnvironment.is_type_checked uri cookingsno with
CicEnvironment.CheckedObj cobj -> cobj
| CicEnvironment.UncheckedObj _ -> raise CicEnvironmentError
match CicEnvironment.is_type_checked uri 0 with
CicEnvironment.CheckedObj (C.Variable (_,_,ty)) -> ty
| CicEnvironment.UncheckedObj (C.Variable (_,bo,ty)) ->
- log (`Start_type_checking uri) ;
+ Logger.log (`Start_type_checking uri) ;
(* only to check that ty is well-typed *)
let _ = type_of ty in
(match bo with
raise (NotWellTyped ("Variable " ^ (U.string_of_uri uri)))
) ;
CicEnvironment.set_type_checking_info uri ;
- log (`Type_checking_completed uri) ;
+ Logger.log (`Type_checking_completed uri) ;
ty
| _ -> raise (WrongUriToVariable (UriManager.string_of_uri uri))
match CicEnvironment.is_type_checked uri cookingsno with
CicEnvironment.CheckedObj cobj -> cobj
| CicEnvironment.UncheckedObj uobj ->
- log (`Start_type_checking uri) ;
+ Logger.log (`Start_type_checking uri) ;
cooked_mutual_inductive_defs uri uobj ;
CicEnvironment.set_type_checking_info uri ;
- log (`Type_checking_completed uri) ;
+ Logger.log (`Type_checking_completed uri) ;
(match CicEnvironment.is_type_checked uri cookingsno with
CicEnvironment.CheckedObj cobj -> cobj
| CicEnvironment.UncheckedObj _ -> raise CicEnvironmentError
match CicEnvironment.is_type_checked uri cookingsno with
CicEnvironment.CheckedObj cobj -> cobj
| CicEnvironment.UncheckedObj uobj ->
- log (`Start_type_checking uri) ;
+ Logger.log (`Start_type_checking uri) ;
cooked_mutual_inductive_defs uri uobj ;
CicEnvironment.set_type_checking_info uri ;
- log (`Type_checking_completed uri) ;
+ Logger.log (`Type_checking_completed uri) ;
(match CicEnvironment.is_type_checked uri cookingsno with
CicEnvironment.CheckedObj cobj -> cobj
| CicEnvironment.UncheckedObj _ -> raise CicEnvironmentError
(* type_of_aux' is just another name (with a different scope) for type_of_aux *)
-and type_of_aux' env t =
- let rec type_of_aux env =
+and type_of_aux' metasenv context t =
+ let rec type_of_aux context =
let module C = Cic in
let module R = CicReduction in
let module S = CicSubstitution in
C.Rel n ->
let t =
try
- List.nth env (n - 1)
+ List.nth context (n - 1)
with
_ -> raise (NotWellTyped "Not a close term")
in
let ty = type_of_variable uri in
decr fdebug ;
ty
- | C.Meta n -> raise NotImplemented
+ | C.Meta n -> List.assoc n metasenv
| C.Sort s -> C.Sort C.Type (*CSC manca la gestione degli universi!!! *)
| C.Implicit -> raise (Impossible 21)
| C.Cast (te,ty) ->
let _ = type_of ty in
- if R.are_convertible (type_of_aux env te) ty then ty
+ if R.are_convertible (type_of_aux context te) ty then ty
else raise (NotWellTyped "Cast")
| C.Prod (_,s,t) ->
- let sort1 = type_of_aux env s
- and sort2 = type_of_aux (s::env) t in
+ let sort1 = type_of_aux context s
+ and sort2 = type_of_aux (s::context) t in
sort_of_prod (sort1,sort2)
| C.Lambda (n,s,t) ->
- let sort1 = type_of_aux env s
- and type2 = type_of_aux (s::env) t in
- let sort2 = type_of_aux (s::env) type2 in
+ let sort1 = type_of_aux context s
+ and type2 = type_of_aux (s::context) t in
+ let sort2 = type_of_aux (s::context) type2 in
(* only to check if the product is well-typed *)
let _ = sort_of_prod (sort1,sort2) in
C.Prod (n,s,type2)
| C.LetIn (n,s,t) ->
let t' = CicSubstitution.subst s t in
- type_of_aux env t'
+ type_of_aux context t'
| C.Appl (he::tl) when List.length tl > 0 ->
- let hetype = type_of_aux env he
- and tlbody_and_type = List.map (fun x -> (x, type_of_aux env x)) tl in
+ let hetype = type_of_aux context he
+ and tlbody_and_type = List.map (fun x -> (x, type_of_aux context x)) tl in
eat_prods hetype tlbody_and_type
| C.Appl _ -> raise (NotWellTyped "Appl: no arguments")
| C.Const (uri,cookingsno) ->
in
cty
| C.MutCase (uri,cookingsno,i,outtype,term,pl) ->
- let outsort = type_of_aux env outtype in
+ let outsort = type_of_aux context outtype in
let (need_dummy, k) =
let rec guess_args t =
match CicReduction.whd t with
if not b then (b, k - 1) else (b, k)
in
let (parameters, arguments) =
- match R.whd (type_of_aux env term) with
+ match R.whd (type_of_aux context term) with
(*CSC manca il caso dei CAST *)
C.MutInd (uri',_,i') ->
(*CSC vedi nota delirante sui cookingsno in cicReduction.ml*)
C.Appl ((C.MutInd (uri,cookingsno,i))::parameters)
in
if not (check_allowed_sort_elimination uri i need_dummy
- sort_of_ind_type (type_of_aux env sort_of_ind_type) outsort)
+ sort_of_ind_type (type_of_aux context sort_of_ind_type) outsort)
then
raise (NotWellTyped "MutCase: not allowed sort elimination") ;
(C.Appl (C.MutConstruct (uri,cookingsno,i,j)::parameters))
in
(j + 1, b &&
- R.are_convertible (type_of_aux env p)
+ R.are_convertible (type_of_aux context p)
(type_of_branch parsno need_dummy outtype cons
- (type_of_aux env cons))
+ (type_of_aux context cons))
)
) (1,true) (List.combine pl cl)
in
| C.Fix (i,fl) ->
let types_times_kl =
List.rev
- (List.map (fun (_,k,ty,_) -> let _ = type_of_aux env ty in (ty,k)) fl)
+ (List.map
+ (fun (_,k,ty,_) -> let _ = type_of_aux context ty in (ty,k)) fl)
in
let (types,kl) = List.split types_times_kl in
let len = List.length types in
List.iter
(fun (name,x,ty,bo) ->
- if (R.are_convertible (type_of_aux (types @ env) bo)
+ if (R.are_convertible (type_of_aux (types @ context) bo)
(CicSubstitution.lift len ty))
then
begin
ty
| C.CoFix (i,fl) ->
let types =
- List.rev (List.map (fun (_,ty,_) -> let _ = type_of_aux env ty in ty) fl)
+ List.rev
+ (List.map (fun (_,ty,_) -> let _ = type_of_aux context ty in ty) fl)
in
let len = List.length types in
List.iter
(fun (_,ty,bo) ->
- if (R.are_convertible (type_of_aux (types @ env) bo)
+ if (R.are_convertible (type_of_aux (types @ context) bo)
(CicSubstitution.lift len ty))
then
begin
| _ -> None
in
- type_of_aux env t
+ type_of_aux context t
(* is a small constructor? *)
(*CSC: ottimizzare calcolando staticamente *)
and is_small paramsno c =
- let rec is_small_aux env c =
+ let rec is_small_aux context c =
let module C = Cic in
match CicReduction.whd c with
C.Prod (_,so,de) ->
- let s = type_of_aux' env so in
+ (*CSC: [] is an empty metasenv. Is it correct? *)
+ let s = type_of_aux' [] context so in
(s = C.Sort C.Prop || s = C.Sort C.Set) &&
- is_small_aux (so::env) de
+ is_small_aux (so::context) de
| _ -> true (*CSC: we trust the type-checker *)
in
let (sx,dx) = split_prods paramsno c in
is_small_aux (List.rev sx) dx
and type_of t =
- type_of_aux' [] t
+ type_of_aux' [] [] t
;;
let typecheck uri =
CicEnvironment.CheckedObj _ -> ()
| CicEnvironment.UncheckedObj uobj ->
(* let's typecheck the uncooked object *)
- log (`Start_type_checking uri) ;
+ Logger.log (`Start_type_checking uri) ;
(match uobj with
C.Definition (_,te,ty,_) ->
let _ = type_of ty in
| C.Axiom (_,ty,_) ->
(* only to check that ty is well-typed *)
let _ = type_of ty in ()
- | C.CurrentProof (_,_,te,ty) ->
- (*CSC [] wrong *)
- let _ = type_of ty in
- debug (type_of te) [] ;
- if not (R.are_convertible (type_of te) ty) then
- raise (NotWellTyped ("CurrentProof" ^ (U.string_of_uri uri)))
+ | C.CurrentProof (_,conjs,te,ty) ->
+ (*CSC [] wrong *)
+ let _ = type_of_aux' conjs [] ty in
+ debug (type_of_aux' conjs [] te) [] ;
+ if not (R.are_convertible (type_of_aux' conjs [] te) ty) then
+ raise (NotWellTyped ("CurrentProof" ^ (U.string_of_uri uri)))
| C.Variable (_,bo,ty) ->
(* only to check that ty is well-typed *)
let _ = type_of ty in
cooked_mutual_inductive_defs uri uobj
) ;
CicEnvironment.set_type_checking_info uri ;
- log (`Type_checking_completed uri)
+ Logger.log (`Type_checking_completed uri)
+;;
+
+(*******************************************************)
+(*CSC: Da qua in avanti deve sparire tutto *)
+exception NotImplemented
+let wrong_context_of_context context =
+ let module C = Cic in
+ List.map
+ (function
+ C.Decl bt -> bt
+ | C.Def bt -> raise NotImplemented
+ ) context
+;;
+
+let type_of_aux' metasenv context t =
+ let context' = wrong_context_of_context context in
+ type_of_aux' metasenv context' t
;;