Logic 用Coq进行案例证明

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中是不可判定的。原因(据我有限的理解)是它不是一个归纳定义的集合(因此,您

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

Goal forall a b : Set, a = b \/ a <> b. Proof intros a b. ... 所有a b的目标:设定,a=b\/a b。 证明 介绍a b。 ... 我将如何着手解决这个问题。那么,我究竟如何使用等式的两个可能值(真或假)来定义案例证明呢

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

我很确定,
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的默认逻辑是直观的。