我只是从Coq开始,现在想证明“ Little Prover”中的某些内容。 我遇到的定理之一是:
Theorem equal_swap : forall (A: Type) (x:A) (y:A),
(x = y) = (y = x).
但是,我无法证明这一点。我尝试找出如何用eq_sym重写方程式的右侧,但是我无法将其仅应用于目标的一个表达式。
我将如何证明这个定理?
答案 0 :(得分:1)
Coq普遍使用的一件事是“命题作为类型”的概念。直观上,类型是对象的集合。那么这些收藏的元素是什么?他们是证明。可证明的命题是包含元素的类型,不可证明的命题是不包含证明的类型。
因此a = b
是一种类型的证明,而b = a
也是一种类型的证明,但是它们不能证明相同的陈述。 Coq中逻辑的目的是关于语句非常精确。我们可以说a = b
和b = a
是相同的吗?好吧,从某种意义上讲它们不是。如果我的目标形式为C(a, b)
,并且用a = b
的证明重写,那么我得到C(a, a)
;如果我用b = a
的证明重写,那么我得到{ {1}},这两个看起来不一样。一个使自己辩称它们是相同的(因为假设C(b, b)
和a
是相同的),但也有人可能辩称它们是不相同的(因为您使用的方式不同) )。
在设计类似Coq的逻辑系统时,即使您不尝试讨论命题之间的相等性,而专注于仅使用命题之间的等效性,您也可以做很多逻辑。因此,人们试图在平等概念中添加最少的属性。特别是,类型之间的相等性一无所有。您将看到,在讨论一阶数据之间的相等时使用相等是实用的,在谈论高阶数据(例如函数之间的相等)时,它不太方便,而在讨论类型之间的相等时,它很尴尬。>
另一方面,如果他们想研究两个命题之间的关系,他们只会尝试检查一个命题是否隐含着另一个命题,如果想要更精确一点,他们会尝试查看它们是否相互暗示。出于大多数实际目的,这已经足够了,我建议您只要坚持自己是初学者,就坚持这一纪律。
在这里,我们可能要证明b
。如果我们使用战术来证明这一点,那么a = b -> b = a
将帮助我们为intro
命名(例如a = b
),而H
将有助于我们转变{{1} }插入rewrite H
。现在,最后的证明可以通过反射来完成。但是当我说将b = a
转换为a = a
时。我只是说b = a
有一个证明,换句话说,“有一个函数,当输入a = a
作为证明时,它会产生a = a -> b = a
证明作为输出。一个证明,我们的印象是a = a
的证明在保持相同的同时被转换为b = a
的证明,但事实并非如此:这里观察到两个不同的证明。
最后,a = a
只是b = a
和(a = b) <-> (b = a)
的和。 (a = b) -> (b = a)
策略也得到了扩展,因此您也可以用一个定理来重写它是等价的,而不是等价的。