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

时间:2012-07-22 12:33:27

标签: coq

假设我有两个函数fg,我知道f = g。是否有正向推理“函数应用程序”策略,允许我将f a = g a添加到其公共域中某些a的上下文中?在这个人为的例子中,我可以使用assert (f a = g a)后跟f_equal。但我想在更复杂的情况下做这样的事情;如,

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.

2 个答案:

答案 0 :(得分:1)

我对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.

答案 1 :(得分:1)

我认为,鉴于您的描述和示例,我无法正确推断出您遇到的一般问题。

如果您已经知道H : f = g,则可以将rewrite H用于f,以显示有关gelim Hassert的任何内容一次重写一切。你不需要assert辅助定理,如果你这样做,你显然需要像pose proofintros A B P Q a H. assert (P = Q) as H0 by apply H. rewrite H0; reflexivity. 这样的东西。

如果在某些eta扩展下隐藏了相等性,就像在您的示例中一样,请删除该图层,然后按上述步骤操作。以下是两种(在众多中)可能的方法:

assert

这通过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. 平等,然后重写来解决您的示例证明。另一种可能性是定义eta减少助手(没有找到预定义的助手)并使用它们。这将更加冗长,但可能适用于更复杂的情况。

如果你定义

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

您可以执行以下操作:

pattern

(这个符号是一个松散的大炮,可能会在错误的地方重写。不要依赖它,如果出现异常,请手动执行rewrite和{{1}}。)