reference variables that are local to the term that is going to be
replaced. To fix this we should parse with_what in the context of the
term(s) to be replaced. *)
-let change_tac ~pattern with_what =
+let change_tac ?(with_cast=false) ~pattern with_what =
let change_tac ~pattern ~with_what (proof, goal) =
let curi,metasenv,_subst,pbo,pty, attrs = proof in
let (metano,context,ty) as conjecture = CicUtil.lookup_meta goal metasenv in
| _ as t -> t)
metasenv
in
- (curi,metasenv',_subst,pbo,pty, attrs), [metano]
+ let proof,goal = (curi,metasenv',_subst,pbo,pty, attrs), metano in
+ if with_cast then
+ let metano' = ProofEngineHelpers.new_meta_of_proof ~proof in
+ let (newproof,_) =
+ let irl= CicMkImplicit.identity_relocation_list_for_metavariable context'
+ in
+ ProofEngineHelpers.subst_meta_in_proof
+ proof metano
+ (Cic.Cast (Cic.Meta(metano',irl),ty')) [metano',context',ty']
+ in
+ newproof, [metano']
+ else
+ proof,[goal]
in
mk_tactic (change_tac ~pattern ~with_what)