我有一个简单的定理,我想用案例证明来证明。下面给出一个例子。
Goal forall a b : Set, a = b \/ a <> b. Proof intros a b. ...
我将如何解决这个问题。而且,我究竟如何使用两个可能的相等值(真或假)来定义证明?
任何帮助将不胜感激。 谢谢,
答案 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
不是评估为True
或False
的东西,就像常规布尔值一样。相反,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 * nat
或nat = 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.
希望这有帮助。