用基本策略证明不是(如果是(不是))

时间:2018-01-20 13:26:50

标签: logic coq

我在Coq中证明矛盾的经验非常有限,我找不到用基本策略证明以下定理的明确方法:

Theorem thrm : forall a, not (iff a (not a)).

我可以立即用firstorderintuition证明这一点,但这些策略对我来说就像魔术一样,我的印象是它们涉及一些复杂的自动化。用rewritedestructapplyassert等简单明确的策略证明这个定理的更明确的方法是什么?

1 个答案:

答案 0 :(得分:5)

为了证明否定命题not something,可以使用intros策略将预期错误的假设添加到上下文中,然后证明上下文确实是不一致的。这是因为not somethingsomething -> False的缩写。您可以通过输入Print not.或在证明unfold not.期间相应地替换目标来注意到这一点。

然后,为了实现如此获得的目标,可以根据具体情况使用几种策略,例如:

  • 战术introsapplyexactassumption用于最小的命题逻辑;
  • 在归纳类型存在的情况下,destructinversiondiscriminateinjection等策略;
  • 等,请参阅Coq reference manual

在您的示例中,introsdestructapplyassumption就足够了:

Theorem thrm : forall a, not (iff a (not a)).
Proof.
intros a Hiff; destruct Hiff as [H1 H2].
apply H1; apply H2; intros Ha; apply H1; assumption.
Qed.

请注意,证明也可缩短为此等效版本:

Theorem thrm : forall a, not (iff a (not a)).
Proof. now intros a [H1 H2]; apply H1; apply H2; intros Ha; apply H1. Qed.

其中now somethingsomething; easy的表示法(参见doc)。

希望这有帮助