我在Coq中证明矛盾的经验非常有限,我找不到用基本策略证明以下定理的明确方法:
Theorem thrm : forall a, not (iff a (not a)).
我可以立即用firstorder
或intuition
证明这一点,但这些策略对我来说就像魔术一样,我的印象是它们涉及一些复杂的自动化。用rewrite
,destruct
,apply
,assert
等简单明确的策略证明这个定理的更明确的方法是什么?
答案 0 :(得分:5)
为了证明否定命题not something
,可以使用intros
策略将预期错误的假设添加到上下文中,然后证明上下文确实是不一致的。这是因为not something
是something -> False
的缩写。您可以通过输入Print not.
或在证明unfold not.
期间相应地替换目标来注意到这一点。
然后,为了实现如此获得的目标,可以根据具体情况使用几种策略,例如:
intros
,apply
,exact
和assumption
用于最小的命题逻辑; destruct
,inversion
,discriminate
或injection
等策略; 在您的示例中,intros
,destruct
,apply
和assumption
就足够了:
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 something
是something; easy
的表示法(参见doc)。
希望这有帮助