in
(proof',goals)
with (* FG: this should be PET.Fail _ *)
- TC.TypeCheckerFailure _ -> PET.apply_tactic (P.letout_tac ()) status
+ TC.TypeCheckerFailure _ -> PET.apply_tactic P.letout_tac status
in
ProofEngineTypes.mk_tactic (_rewrite_tac ~direction ~pattern equality)
ProofEngineTypes.mk_tactic (transitivity_tac ~term)
;;
-(* FG *)
+(* FG: subst tactic *********************************************************)
let msg0 = lazy "Subst: not found in context"
let msg1 = lazy "Subst: not a simple equality"
PET.apply_tactic tac status
in
PET.mk_tactic subst_tac
+
+(* FG: This should be replaced by T.try_tactic *)
+let try_tactic ~tactic =
+ let try_tactic status =
+ try PET.apply_tactic tactic status with
+ | PET.Fail _ -> PET.apply_tactic T.id_tac status
+ in
+ PET.mk_tactic try_tactic
+
+let subst_tac =
+ let subst hyp = try_tactic ~tactic:(subst_tac hyp) in
+ let map = function
+ | Some (C.Name s, _) -> Some (subst s)
+ | _ -> None
+ in
+ let subst_tac status =
+ let (proof, goal) = status in
+ let (_, metasenv, _, _) = proof in
+ let _, context, _ = CicUtil.lookup_meta goal metasenv in
+ let tactics = PEH.list_rev_map_filter map context in
+ PET.apply_tactic (T.seq ~tactics) status
+ in
+ PET.mk_tactic subst_tac