| C.Var (uri,exp_named_subst) ->
incr fdebug ;
let ugraph1 =
- check_exp_named_subst ~logger ~subst context exp_named_subst ugraph
+ check_exp_named_subst uri ~logger ~subst context exp_named_subst ugraph
in
let ty,ugraph2 = type_of_variable ~logger uri ugraph1 in
let ty1 = CicSubstitution.subst_vars exp_named_subst ty in
| C.Const (uri,exp_named_subst) ->
incr fdebug ;
let ugraph1 =
- check_exp_named_subst ~logger ~subst context exp_named_subst ugraph
+ check_exp_named_subst uri ~logger ~subst context exp_named_subst ugraph
in
let cty,ugraph2 = type_of_constant ~logger uri ugraph1 in
let cty1 =
| C.MutInd (uri,i,exp_named_subst) ->
incr fdebug ;
let ugraph1 =
- check_exp_named_subst ~logger ~subst context exp_named_subst ugraph
+ check_exp_named_subst uri ~logger ~subst context exp_named_subst ugraph
in
- (* TASSI: da me c'era anche questa, ma in CVS no *)
let mty,ugraph2 = type_of_mutual_inductive_defs ~logger uri i ugraph1 in
- (* fine parte dubbia *)
let cty =
CicSubstitution.subst_vars exp_named_subst mty
in
cty,ugraph2
| C.MutConstruct (uri,i,j,exp_named_subst) ->
let ugraph1 =
- check_exp_named_subst ~logger ~subst context exp_named_subst ugraph
+ check_exp_named_subst uri ~logger ~subst context exp_named_subst ugraph
in
- (* TASSI: idem come sopra *)
let mty,ugraph2 =
type_of_mutual_inductive_constr ~logger uri i j ugraph1
in
let (_,ty,_) = List.nth fl i in
ty,ugraph2
- and check_exp_named_subst ~logger ~subst context =
+ and check_exp_named_subst uri ~logger ~subst context ens ugraph =
+ let params =
+ let obj,_ = CicEnvironment.get_obj CicUniv.empty_ugraph uri in
+ (match obj with
+ Cic.Constant (_,_,_,params,_) -> params
+ | Cic.Variable (_,_,_,params,_) -> params
+ | Cic.CurrentProof (_,_,_,_,params,_) -> params
+ | Cic.InductiveDefinition (_,params,_,_) -> params
+ ) in
+ let rec check_same_order params ens =
+ match params,ens with
+ | _,[] -> ()
+ | [],_::_ ->
+ raise (TypeCheckerFailure (lazy "Bad explicit named substitution"))
+ | uri::tl,(uri',_)::tl' when UriManager.eq uri uri' ->
+ check_same_order tl tl'
+ | _::tl,l -> check_same_order tl l
+ in
let rec check_exp_named_subst_aux ~logger esubsts l ugraph =
match l with
[] -> ugraph
raise (TypeCheckerFailure (lazy "Wrong Explicit Named Substitution"))
end
in
- check_exp_named_subst_aux ~logger []
+ check_same_order params ens ;
+ check_exp_named_subst_aux ~logger [] ens ugraph
and sort_of_prod ~subst context (name,s) (t1, t2) ugraph =
let module C = Cic in