当我证明某些定理时,我的目标随着我应用越来越多的策略而演变。一般来说,目标往往分为子目标,子目标更简单。在最后一点,Coq决定目标得到证实。这个“经证实”的目标可能如何?这些目标似乎很好:
a = a. (* Any object is identical to itself (?) *)
myFunc x y = myFunc x y. (* Result of the same function with the same params
is always the same (?) *)
还有什么可以在这里,或者可能是例子从根本上是错误的?
换句话说,当我最终申请reflexivity
时,Coq只是说** Got it **
而没有任何解释。有没有办法获得更多关于它实际做了什么的细节,或者为什么它决定目标被证明了?
答案 0 :(得分:6)
你实际上面对的是一个看似不那么普遍的非常普遍的概念,因为Coq有一些用户友好的设施,特别是平等的推理。
一般来说,Coq接受一个目标,只要它收到一个类型是目标类型的术语就解决了:它已经确信命题是真的,因为它已经确信这个命题所描述的类型是有人居住的,并且确信这是你在证明中帮助建立的实际证人。
对于归纳数据类型的特定情况,您将能够证明命题P a b c
的两种方式是:
通过使用归纳类型P a b c
的构造函数构造类型P
的术语,并提供所有必要的参数。
或重复使用您可以匹配P a b c
类型的环境中的现有证明或公理。
对于更公当的等式证明(等于只是 Coq中的归纳数据类型),我在上面列出的两种方式退化为:
唯一的平等构造函数是eq_refl
,要应用它,你需要证明双方判断相等。在大多数情况下,这对应于看起来像T a b c = T a b c
的目标,但它实际上是一个稍微宽泛的平等概念(见下文)。对于这些,您所要做的就是应用eq_refl
构造函数。简而言之,这就是reflexivity
的作用!
第二种情况包括证明平等成立,因为你在你的背景中有其他的平等,这里没什么特别的。
现在问题的一部分是:Coq何时接受平等的两个方面是否反身?
如果我没有弄错的话,答案是当平等的两边是αβδιζ-可兑换时。 这个粗略意味着有一种方法可以通过重复应用来使它们在语法上相等:
[如果有更多规则适用或者我错了,请有人纠正我]
例如,这些规则未捕获的一些内容是:
以不同方式执行或多或少相同的函数的相等性:
(fun x => 0 + x) = (fun x => x + 0)
quicksort = mergesort
等同于减少但相等的术语的相等性:
forall n, 0 + n = n + 0