None -> None
| Some term -> Some (CicMetaSubst.apply_subst subst term) in
let u,typ,term =
- match terms_with_context, term with
- [], None ->
- raise UnableToDetectTheTermThatMustBeGeneralizedYouMustGiveItExplicitly
- | _, Some term
- | (_,term)::_, None ->
- let typ,u =
- CicTypeChecker.type_of_aux' ~subst metasenv context term u
- in
- u,typ,term
+ let context_of_t,t =
+ match terms_with_context, term with
+ [], None ->
+ raise
+ UnableToDetectTheTermThatMustBeGeneralizedYouMustGiveItExplicitly
+ | _, Some t -> context,t
+ | (context_of_t,t)::_, None -> context_of_t,t
+ in
+ let t,subst,metasenv' =
+ try
+ CicMetaSubst.delift_rels [] metasenv
+ (List.length context_of_t - List.length context) t
+ with
+ CicMetaSubst.DeliftingARelWouldCaptureAFreeVariable ->
+ raise TheSelectedTermsMustLiveInTheGoalContext in
+ (*CSC: I am not sure about the following two assertions;
+ maybe I need to propagate the new subst and metasenv *)
+ assert (subst = []);
+ assert (metasenv' = metasenv);
+ let typ,u = CicTypeChecker.type_of_aux' ~subst metasenv context t u in
+ u,typ,t
in
(* We need to check:
1. whether they live in the context of the goal;
List.fold_left
(fun u (context_of_t,t) ->
(* 1 *)
- begin
+ let t,subst,metasenv' =
try
- ignore
- (CicMetaSubst.delift_rels [] metasenv
- (List.length context_of_t - List.length context) t)
+ CicMetaSubst.delift_rels [] metasenv
+ (List.length context_of_t - List.length context) t
with
CicMetaSubst.DeliftingARelWouldCaptureAFreeVariable ->
- raise TheSelectedTermsMustLiveInTheGoalContext
- end;
+ raise TheSelectedTermsMustLiveInTheGoalContext in
+ (*CSC: I am not sure about the following two assertions;
+ maybe I need to propagate the new subst and metasenv *)
+ assert (subst = []);
+ assert (metasenv' = metasenv);
(* 2 *)
let b,u1 = CicReduction.are_convertible ~subst context term t u in
if not b then