假设我有两个函数f
和g
,我知道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.
答案 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
,以显示有关g
和elim H
或assert
的任何内容一次重写一切。你不需要assert
辅助定理,如果你这样做,你显然需要像pose proof
或intros 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}}。)