将参数应用于Coq中的相等函数

将参数应用于Coq中的相等函数,coq,Coq,假设我有两个函数f和g,我知道f=g。是否有一种正向推理的“功能应用”策略,允许我将fa=ga添加到一些a公共域中的上下文中?在这个精心设计的示例中,我可以使用assert(fa=ga)后跟f_equal。但我想在更复杂的情况下做类似的事情;e、 g Lemma fapp : forall (A B : Type) (P Q : A -> B) (a : A), (fun (a : A) => P a) = (fun (a : A) => Q a

假设我有两个函数
f
g
,我知道
f=g
。是否有一种正向推理的“功能应用”策略,允许我将
fa=ga
添加到一些
a
公共域中的上下文中?在这个精心设计的示例中,我可以使用
assert(fa=ga)
后跟
f_equal
。但我想在更复杂的情况下做类似的事情;e、 g

Lemma fapp : forall (A B : Type) (P Q : A -> B) (a : A), 
               (fun (a : A) => P a) = (fun (a : A) => Q a) -> 
               P a = Q a.

我对Coq或其策略没有太多经验,但为什么不使用辅助定理呢

Theorem fapp': forall (t0 t1: Type) (f0 f1: t0 -> t1),
  f0 = f1 -> forall (x0: t0), f0 x0 = f1 x0.
Proof.
intros.
rewrite H.
trivial.
Qed.

Lemma fapp : forall (A B : Type) (P Q : A -> B) (a : A), 
               (fun (a : A) => P a) = (fun (a : A) => Q a) -> 
               P a = Q a.
Proof.
intros.
apply fapp' with (x0 := a) in H.
trivial.
Qed.

根据你的描述和例子,我想我不能正确地推断出你的一般问题

如果你已经知道
H:f=g
,你可以用它来
重写H
,无论你想在哪里展示
f
g
,或者干脆
elim H
一次重写一切。你不需要断言辅助定理,如果你这样做了,你显然需要像断言或姿势证明这样的东西

如果该相等性隐藏在某个eta扩展下面,如您的示例中所示,请删除该层,然后按上面所述进行操作。以下是两种(多种)可能的方法:

intros A B P Q a H. assert (P = Q) as H0 by apply H. rewrite H0; reflexivity.
这通过
assert
ing等式,然后重写来解决示例证明问题。另一种可能是定义eta减少帮助器(尚未找到预定义的帮助器)并使用这些帮助器。这将更加冗长,但可能适用于更复杂的情况

如果你定义

Lemma eta_reduce : forall (A B : Type) (f : A -> B),
    (fun x => f x) = f.
  intros. reflexivity.
Defined.

Tactic Notation "eta" constr(f) "in" ident(H) :=
  pattern (fun x => f x) in H;
  rewrite -> eta_reduce in H.
您可以执行以下操作:

intros A B P Q a H. eta P in H. eta Q in H. rewrite H; reflexivity.

(这个符号有点松散,可能会在错误的地方重写。不要依赖它,如果出现异常,请手动执行
模式和
重写)。

谢谢。我也不太了解Coq。我希望有一个更通用的、内置的解决方案。直觉上,这似乎是一件很简单的事情。这与函数的可扩展性有点相反。如果你想要(AFAIK)与
f\u equal
完全相反,那么有
equal\u f
。如果
需要导入Coq.Logic.FunctionalExtensionality.
,您可以通过
引入A B P Q A H来解决您的示例。在H.精确H.中应用与A相等的值。
。请注意,本模块添加了函数扩展性公理,它可能与您选择的公理兼容,也可能与您选择的公理不兼容。;-)谢谢我想这就是我想要的:)