在 Coq 中重写假设,保持蕴涵
Rewrite hypothesis in Coq, keeping implication
我正在做一个 Coq 证明。我有 P -> Q
作为假设,(P -> Q) -> (~Q -> ~P)
作为引理。如何将假设转换为 ~Q -> ~P
?
当我尝试 apply
它时,我只是产生了新的子目标,这没有帮助。
换句话说,我希望开始于:
P : Prop
Q : Prop
H : P -> Q
并以
结束
P : Prop
Q : Prop
H : ~Q -> ~P
鉴于上述引理 - 即 (P -> Q) -> (~Q -> ~P)
.
这不像 apply
那样优雅,但您可以使用 pose proof (lemma _ _ H) as H0
,其中 lemma
是引理的名称。这将向上下文添加另一个具有正确类型的假设,名称为 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.
我正在做一个 Coq 证明。我有 P -> Q
作为假设,(P -> Q) -> (~Q -> ~P)
作为引理。如何将假设转换为 ~Q -> ~P
?
当我尝试 apply
它时,我只是产生了新的子目标,这没有帮助。
换句话说,我希望开始于:
P : Prop
Q : Prop
H : P -> Q
并以
结束P : Prop
Q : Prop
H : ~Q -> ~P
鉴于上述引理 - 即 (P -> Q) -> (~Q -> ~P)
.
这不像 apply
那样优雅,但您可以使用 pose proof (lemma _ _ H) as H0
,其中 lemma
是引理的名称。这将向上下文添加另一个具有正确类型的假设,名称为 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.