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.