Coq 中的条件证明策略
Conditional Proof Tactic in Coq
我相信标题很容易解释:https://en.wikipedia.org/wiki/Conditional_proof
我想有一个策略,我假设一个命题然后继续寻找另一个命题,如果成功,那么我发现第一个命题 蕴含 第二个命题并且这是作为上下文中的假设提出的。
因此,例如 Ltac cp P Q
创建一个子目标 Q
并将 P
放入上下文中。如果我确实可以达到子目标 Q,那么子目标就会被排出,并且 P->Q
被添加到上下文中。我怎样才能做到这一点?
编辑:显然在证明
assert (P->Q).
intro.
完成工作,但我无法将它们组合成 Ltac 策略,它给出了 No focused proof (No proof-editing in progress).
的错误
要定义新战术,您需要用;
组合它们。
Ltac cp P Q := assert (P -> Q); [ intro | ].
(* Use intro in the first subgoal of assert *)
已经有这样的战术了,叫enough
,叫"it is enough to show that P"。它假定 P
,您现在可以使用 P
完成证明。完成后,您必须证明 P
。
如果容易完成,可以用by
(同assert
)。我经常做 enough (bla bla) by (subst; auto).
或类似的事情,这让我的目标是 bla bla
.
您可能还会发现这种策略很有用,也就是说,如果您不想将整个复杂的前提输入到 enough
语句中:
Ltac postpone_antecedent H :=
match type of H with ?A -> _ =>
let Q := fresh in enough A as Q ; [specialize (H Q) | ]
end.
我相信标题很容易解释:https://en.wikipedia.org/wiki/Conditional_proof
我想有一个策略,我假设一个命题然后继续寻找另一个命题,如果成功,那么我发现第一个命题 蕴含 第二个命题并且这是作为上下文中的假设提出的。
因此,例如 Ltac cp P Q
创建一个子目标 Q
并将 P
放入上下文中。如果我确实可以达到子目标 Q,那么子目标就会被排出,并且 P->Q
被添加到上下文中。我怎样才能做到这一点?
编辑:显然在证明
assert (P->Q).
intro.
完成工作,但我无法将它们组合成 Ltac 策略,它给出了 No focused proof (No proof-editing in progress).
要定义新战术,您需要用;
组合它们。
Ltac cp P Q := assert (P -> Q); [ intro | ].
(* Use intro in the first subgoal of assert *)
已经有这样的战术了,叫enough
,叫"it is enough to show that P"。它假定 P
,您现在可以使用 P
完成证明。完成后,您必须证明 P
。
如果容易完成,可以用by
(同assert
)。我经常做 enough (bla bla) by (subst; auto).
或类似的事情,这让我的目标是 bla bla
.
您可能还会发现这种策略很有用,也就是说,如果您不想将整个复杂的前提输入到 enough
语句中:
Ltac postpone_antecedent H :=
match type of H with ?A -> _ =>
let Q := fresh in enough A as Q ; [specialize (H Q) | ]
end.