Logic 用Coq进行案例证明
我有一个简单的定理,我想用案例证明。下面给出了一个例子 Goal forall a b : Set, a = b \/ a <> b. Proof intros a b. ... 所有a b的目标:设定,a=b\/a b。 证明 介绍a b。 ... 我将如何着手解决这个问题。那么,我究竟如何使用等式的两个可能值(真或假)来定义案例证明呢 任何帮助都将不胜感激。Logic 用Coq进行案例证明,logic,coq,theorem-proving,Logic,Coq,Theorem Proving,我有一个简单的定理,我想用案例证明。下面给出了一个例子 Goal forall a b : Set, a = b \/ a <> b. Proof intros a b. ... 所有a b的目标:设定,a=b\/a b。 证明 介绍a b。 ... 我将如何着手解决这个问题。那么,我究竟如何使用等式的两个可能值(真或假)来定义案例证明呢 任何帮助都将不胜感激。 谢谢,我很确定,Sets的相等性在Coq中是不可判定的。原因(据我有限的理解)是它不是一个归纳定义的集合(因此,您
谢谢,我很确定,
Set
s的相等性在Coq中是不可判定的。原因(据我有限的理解)是它不是一个归纳定义的集合(因此,您没有案例分析…),它也不是一个封闭的集合:每次您定义一个新的数据类型时,您都会创建一个新的集合
的居民族。因此,证明您所展示目标的术语需要更新以反映这些新居民
正如@hardmath在他的评论中提到的,您可以使用classic
假设来证明您的目标(Axiom classic:forall p:Prop,p\/~p.
)
正如@Robin Green在这里的评论中提到的,你可以证明这种类型的目标是绝对平等的。为此,您可能希望从
决定平等
策略中获得帮助。请参阅:您的问题触及了Coq的一个有趣方面:命题(即Prop
的成员)和布尔(即bool
的成员)之间的差异。详细解释这一差异有点技术性太强,所以我将只关注您的特定示例
粗略地说,Coq中的Prop
与常规布尔运算不同,其计算结果不是True
或False
。相反,Prop
s具有可以组合起来推断事实的推理规则。利用这些,我们可以证明一个命题成立,或者证明它是矛盾的。让事情变得微妙的是,还有第三种可能性,即我们无法证明或反驳这个命题。这是因为Coq是一种建设性的逻辑。其中一个最广为人知的后果是,众所周知的被称为排除中间的推理原则(forall P:Prop,P\/~P
)无法在Coq中得到证明:如果你断言P\/~P
,这意味着你要么能够证明P
,要么能够证明~P
。你不能在不知道谁持有的情况下断言这一点
对于某些命题,我们可以证明p\/~p
成立。例如,对于所有n m:nat,n=m\/n m,显示并不困难。根据上面的注释,这意味着对于每一对自然数,我们都能够证明它们相等或不相等
另一方面,如果我们将nat
更改为Set
,就像在您的示例中一样,那么我们将永远无法证明定理。想知道为什么,考虑自然代码对的<代码>设置<代码>代码> nAT*NAT <代码>。如果我们能够证明你的定理,那么它将遵循nat=nat*nat\/nat-nat*nat
。同样,通过上面的评论,这意味着我们要么能够证明nat=nat*nat
要么nat-nat*nat
。然而,由于这两种类型之间都有一个双射,我们不能说假设nat=nat*nat
是矛盾的,但是因为这两种类型在语法上不相等,所以假设它们是不同的也是可以的。从技术上讲,命题nat=nat*nat
的有效性与Coq的逻辑无关
如果你真的需要你提到的事实,那么你需要将排除在外的中间作为一个公理(axiom-classic:forall p,p\/~p.
),这将允许你产生\/
的证明,而不需要任何一方的明确证明,也不需要逐案推理。然后你就可以证明你的例子定理,比如
intros a b. destruct (classical (a = b)).
left. assumption.
right. assumption.
介绍a b。自毁(经典(a=b))。
左边假设。
正确的。假设。
希望这能有所帮助。您使用的是什么版本的Coq?你是在要求根据同义反复法a\/~a
进行证明,还是在想一个假设你的具体解释a=b\/a b
的例子?稍微详细说明一下这个答案,对于某些类型的T(这里T是Set
),有两种主要的方法来证明这个结果。如果T有一个已知的等式可判定过程,那么只需证明该过程是可判定的。如果没有,人们就不得不求助于古典逻辑;Coq的默认逻辑是直观的。