+ let subst_g direction i t =
+ let rewrite pattern =
+ let tactic = lift_rewrite_tac ~context ~direction ~pattern what in
+ try_tactic ~tactic
+ in
+ let var = match PEH.get_name context i with
+ | Some name -> name
+ | None -> raise (PET.Fail msg0)
+ in
+ if DTI.does_not_occur i t then () else raise (PET.Fail msg2);
+ let map self = function
+ | Some (C.Name s, _) when s <> self ->
+ Some (rewrite (None, [(s, hole)], None))
+ | _ -> None
+ in
+ let rew_hips = HEL.list_rev_map_filter (map hyp) context in
+ let rew_concl = rewrite (None, [], Some hole) in
+ let clear = PESR.clear ~hyps:[hyp; var] in
+ List.rev_append (rew_concl :: rew_hips) [clear]
+ in
+ let destruct_g () =
+ [lift_destruct_tac ~context ~what; PESR.clear ~hyps:[hyp]]
+ in
+ let whd_g () =
+ let whd_pattern = C.Appl [meta; meta; hole; hole] in
+ let pattern = None, [hyp, whd_pattern], None in
+ [RT.whd_tac ~pattern; subst_tac ~try_tactic ~hyp]
+ in
+ let tactics = match ty with