使用Coq的案例证明

时间:2013-03-05 06:32:17

标签: logic coq theorem-proving

我有一个简单的定理,我想用案例证明来证明。下面给出一个例子。

Goal forall a b : Set, a = b \/ a <> b.
Proof
  intros a b.
  ...

我将如何解决这个问题。而且,我究竟如何使用两个可能的相等值(真或假)来定义证明?

任何帮助将不胜感激。 谢谢,

2 个答案:

答案 0 :(得分:6)

我很确定Set s的相等性在Coq中是不可判定的。原因(我的理解有限)将是它不是一个归纳定义的集合(因此,对你来说没有案例分析......),它也不是一个封闭的集合:每当你定义一个新的数据类型时,你创造Set的新一族居民。因此,证明你所展示目标的术语需要更新以反映这些新居民。

正如@hardmath在评论中提到的那样,你可以使用Classical假设(Axiom classic : forall P:Prop, P \/ ~ P.)证明你的目标。

正如@Robin Green在这里的评论中提到的那样,你可以证明这种目标对于可判无法相等的类型。为此,您可能希望从decide equality策略中获得帮助。请参阅:http://coq.inria.fr/distrib/V8.4/refman/Reference-Manual011.html#@tactic121

答案 1 :(得分:4)

你的问题触及了Coq的一个有趣的方面:​​命题(即Prop的成员)和布尔(即bool的成员)之间的区别。详细解释这些差异在某种程度上太技术性,所以我只想集中讨论你的特定例子。

粗略地说,Coq中的Prop不是评估为TrueFalse的东西,就像常规布尔值一样。相反,Prop具有可以组合以推断事实的推理规则。使用这些,我们可以证明命题成立,或表明它是矛盾的。使事情变得微妙的是,存在第三种可能性,即我们无法证明或驳斥命题。这是因为Coq是建设性逻辑。其中一个最着名的后果是,熟悉的推理原理称为排除中间forall P : Prop, P \/ ~ P)无法在Coq中证明:如果你断言{{1 }},这意味着您要么能够证明P \/ ~ P要么证明P。你不能在不知道哪一个持有的情况下断言。

事实证明,对于某些命题,我们可以证明~ P成立。例如,显示P \/ ~ P并不困难。根据上述说法,这意味着对于每对自然数,我们都能够证明它们是相同的或证明它们不相同。

另一方面,如果我们将forall n m : nat, n = m \/ n <> m更改为nat,就像在您的示例中一样,那么我们永远无法证明该定理。要了解原因,请考虑Set Set对自然数。如果我们能够证明你的定理,那么它将遵循nat * nat。再次,通过上述评论,这意味着我们要么能够证明nat = nat * nat \/ nat <> nat * natnat = nat * nat。但是,因为两种类型之间存在双射,我们不能说假设nat <> nat * nat是矛盾的,但是因为类型在语法上不相等,所以也可以假设它们是不同的。从技术上讲,命题nat = nat * nat的有效性是独立的Coq逻辑。

如果你真的需要你提到的这个事实,那么你需要将被排除的中间断言为公理(nat = nat * nat),这样你就可以在没有明确证明的情况下生成Axiom classical : forall P, P \/ ~ P.的证据任何一方和案件的理由。然后你就可以用

之类的东西来证明你的例子定理
intros a b. destruct (classical (a = b)).
  left. assumption.
  right. assumption.

希望这有帮助。