在Coq中重写假设,保留含义

在Coq中重写假设,保留含义,coq,coq-tactic,Coq,Coq Tactic,我正在做Coq验证。我把P->Q作为假设,把(P->Q)->(~Q->~P)作为引理。如何将假设转换为~Q->~P 当我尝试应用它时,我只是产生了新的子目标,这是没有帮助的 换言之,我想从以下几点开始: P : Prop Q : Prop H : P -> Q 结果是 P : Prop Q : Prop H : ~Q -> ~P 考虑到上面的引理,也就是说,(p->Q)->(~Q->~p)这不像一个应用程序那样优雅,但是你可以像H0一样使用姿势证明(引理),其中引理是引理的名字。

我正在做Coq验证。我把
P->Q
作为假设,把
(P->Q)->(~Q->~P)
作为引理。如何将假设转换为
~Q->~P

当我尝试应用它时,我只是产生了新的子目标,这是没有帮助的

换言之,我想从以下几点开始:

P : Prop
Q : Prop
H : P -> Q
结果是

P : Prop
Q : Prop
H : ~Q -> ~P

考虑到上面的引理,也就是说,
(p->Q)->(~Q->~p)
这不像一个
应用程序那样优雅,但是你可以像H0
一样使用
姿势证明(引理),其中
引理是引理的名字。这将为上下文添加另一个具有正确类型的假设,名称为
H0

这是ssreflect视图确实有用的一种情况:

From Coq Require Import ssreflect.

Variable (P Q : Prop).
Axiom u : (P -> Q) -> (~Q -> ~P).

Lemma test (H : P -> Q) : False.
Proof. move/u in H. Abort.

apply u in H
也可以,但是它太聪明了,而且做的太多了。

如果我想将
H
转换到位,我会选择@ejgallego的答案,因为SSReflect现在(从Coq 8.7.0开始)是标准Coq的一部分,但这里有另一个选项:

Ltac dumb_apply_in f H := generalize (f H); clear H; intros H.

Tactic Notation "dumb" "apply" constr(f) "in" hyp(H) := dumb_apply_in f H.
一个简单的测试:

Variable (P Q : Prop).
Axiom u : (P -> Q) -> (~Q -> ~P).

Lemma test (H : P -> Q) : False.
Proof. dumb apply u in H. Abort.