证明等式在Coq中是对称的

时间:2019-05-02 07:22:48

标签: coq

我只是从Coq开始,现在想证明“ Little Prover”中的某些内容。 我遇到的定理之一是:

Theorem equal_swap : forall (A: Type) (x:A) (y:A),
    (x = y) = (y = x).

但是,我无法证明这一点。我尝试找出如何用eq_sym重写方程式的右侧,但是我无法将其仅应用于目标的一个表达式。

我将如何证明这个定理?

1 个答案:

答案 0 :(得分:1)

Coq普遍使用的一件事是“命题作为类型”的概念。直观上,类型是对象的集合。那么这些收藏的元素是什么?他们是证明。可证明的命题是包含元素的类型,不可证明的命题是不包含证明的类型。

因此a = b是一种类型的证明,而b = a也是一种类型的证明,但是它们不能证明相同的陈述。 Coq中逻辑的目的是关于语句非常精确。我们可以说a = bb = 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)策略也得到了扩展,因此您也可以用一个定理来重写它是等价的,而不是等价的。