将函数应用于Coq假设中等式的两侧

将函数应用于Coq假设中等式的两侧,coq,coq-tactic,Coq,Coq Tactic,我的问题与下面的链接中的问题非常相似,但是是基于假设而不是目标 假设我有以下定义: Definition make_couple (a:nat) (b:nat) := (a, b). 用下面的引理来证明: a, b : nat H : (a, b) = make_couple a b ------------------------------- (some goal to prove) 我想提出以下假设: new_H : fst (a, b) = fst (make_couple a b

我的问题与下面的链接中的问题非常相似,但是是基于假设而不是目标

假设我有以下定义:

Definition make_couple (a:nat) (b:nat) := (a, b).
用下面的引理来证明:

a, b : nat
H : (a, b) = make_couple a b
-------------------------------
(some goal to prove)
我想提出以下假设:

new_H : fst (a, b) = fst (make_couple a b)
Goal forall a b : nat, (a, b) = (a, b) -> True.
  intros a b H.
  apply (f_equal fst) in H.
一种方法是显式写入断言,然后使用eapply f_equal:

assert (fst (a, b) = fst (make_couple a b)). eapply f_equal; eauto.
但是,如果可能的话,我希望避免显式地编写断言。我希望有一些策略或类似的策略可以像这样工作:

apply_in_hypo fst H as new_H
Coq中有什么东西可以接近这一点吗


谢谢您的回答。

您可以使用
f_equal
引理来实现这一点

About f_equal.
以下是如何将其应用于假设:

new_H : fst (a, b) = fst (make_couple a b)
Goal forall a b : nat, (a, b) = (a, b) -> True.
  intros a b H.
  apply (f_equal fst) in H.
可以使用以下方法以更简洁的方式重写上述代码段:


这是一个很好的例子。谢谢!正是我想要的