Coq中的条件证明策略

时间:2018-10-21 23:09:00

标签: coq coq-tactic ltac

我相信标题很容易解释: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).

的错误

2 个答案:

答案 0 :(得分:2)

要定义新策略,您需要将其与;组合在一起。

Ltac cp P Q := assert (P -> Q); [ intro | ].
  (* Use intro in the first subgoal of assert *) 

答案 1 :(得分:2)

已经有一种策略,称为enough,因为“足以显示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.