Coq 中的反例证明

jaa*_*aam 4 proof negation coq quantifiers

在命题和谓词演算中证明了数十个引理之后(有些比其他的更具挑战性,但通常仍然可以在intro-apply-destruct自动驾驶仪上证明),我从一开始就打了一个~forall,并立即被抓住了。显然,我对 Coq 的理解和知识缺乏。所以,我要求使用低级 Coq 技术来证明一般形式的语句

~forall A [B].., C -> D.  
exists A [B].., ~(C -> D).
Run Code Online (Sandbox Code Playgroud)

换句话说,我希望有一个通用的 Coq 方法来设置和触发反例。(量化上述函数的主要原因是它是 Coq 中的(或)原始连接词。)如果你想要例子,我建议例如

~forall P Q: Prop, P -> Q.
~forall P: Prop, P -> ~P.
Run Code Online (Sandbox Code Playgroud)

有一个相关的问题既没有提出也没有回答我的问题,所以我认为它不是重复的。

Art*_*rim 5

回想一下,它~ P被定义为P -> False。换句话说,为了表明这样的陈述,假设P并推导出矛盾就足够了。关键是你可以以P任何你喜欢的方式用作假设。在普遍量化的陈述的特殊情况下,该specialize策略可能会派上用场。这种策略允许我们实例化具有特定值的通用量化变量。例如,

Goal ~ forall P Q, P -> Q.
Proof.
  intros contra.
  specialize (contra True False). (* replace the hypothesis 
                                     by [True -> False] *)
  apply contra. (* At this point the goal becomes [True] *)
  trivial.
Qed. 
Run Code Online (Sandbox Code Playgroud)

  • 您不需要“专业化”,因为它可以做一些您已经无法做到的特殊事情。在上面的解决方案中,`contra` 是一个类型为 `forall PQ, P->Q` 的三个参数的函数。您可以使用它来构建一个可以应用的值。因此,在这种情况下,您可以使用 `intro C; 来解决所有问题。apply (C True False I).` 甚至(使用 Coq 的类型推断)`intro C; apply (C _ _ I).` 其中 `I` 是 `True` 的构造函数。 (2认同)