- let _,context,_ = CicUtil.lookup_meta goal metasenv in
- let wty,u = (* TASSI: FIXME *)
- CicTypeChecker.type_of_aux' metasenv context what CicUniv.empty_ugraph in
- let wwty,_ = CicTypeChecker.type_of_aux' metasenv context with_what u in
- try
- if (wty = wwty) then
+ let (_,context,_) as conjecture = CicUtil.lookup_meta goal metasenv in
+ assert (hyps_pat = []); (*CSC: not implemented yet *)
+ let context_len = List.length context in
+ let _,selected_terms_with_context =
+ ProofEngineHelpers.select ~metasenv ~conjecture ~pattern in
+ let ty_of_with_what,u =
+ CicTypeChecker.type_of_aux'
+ metasenv context with_what CicUniv.empty_ugraph in
+ let whats =
+ match selected_terms_with_context with
+ [] -> raise (ProofEngineTypes.Fail "Replace: no term selected")
+ | l ->
+ List.map
+ (fun (context_of_t,t) ->
+ let t_in_context =
+ try
+ let context_of_t_len = List.length context_of_t in
+ if context_of_t_len = context_len then t
+ else
+ (let t_in_context,subst,metasenv' =
+ CicMetaSubst.delift_rels [] metasenv
+ (context_of_t_len - context_len) t
+ in
+ assert (subst = []);
+ assert (metasenv = metasenv');
+ t_in_context)
+ with
+ CicMetaSubst.DeliftingARelWouldCaptureAFreeVariable ->
+ (*CSC: we could implement something stronger by completely changing
+ the semantics of the tactic *)
+ raise (ProofEngineTypes.Fail
+ "Replace: one of the selected terms is not closed") in
+ let ty_of_t_in_context,u = (* TASSI: FIXME *)
+ CicTypeChecker.type_of_aux' metasenv context t_in_context
+ CicUniv.empty_ugraph in
+ let b,u = CicReduction.are_convertible ~metasenv context
+ ty_of_with_what ty_of_t_in_context u in
+ if b then t_in_context
+ else
+ raise
+ (ProofEngineTypes.Fail
+ "Replace: one of the selected terms and the term to be replaced with have not convertible types")
+ ) l
+ in
+ let rec aux whats status =
+ match whats with
+ [] -> ProofEngineTypes.apply_tactic T.id_tac status
+ | what::tl ->