谓词相等的谓词和通用量化应用程序的相等

时间:2018-07-24 20:35:29

标签: coq theorem-proving

我正在尝试使用有充分根据的定位点来定义递归谓词,当用F_ext进行重写时,必须显示Fix_eqCPDT说,大多数这样的义务都可以通过简单明了的自动化证明而免除,但不幸的是,对于我的谓词而言,这似乎并非如此。

我已将问题简化为以下引理(来自Lemma ext_fa: forall (A : Type) (f g : A -> Prop), (forall x, f x = g x) -> (forall x, f x) = (forall x, g x). )。没有additional axioms的Coq是否可以证明?

f = g

可以用谓词或函数的可扩展性来显示它,但是由于结论比通常的结论(f弱,我天真地认为可以在不使用附加公理的情况下产生证明。毕竟,平等的两面都只涉及g和{{1}}的应用。怎么能分辨出内涵上的差异?

我错过了一个简单的证明还是引理不可证明?

1 个答案:

答案 0 :(得分:4)

您可能对this code I wrote a while ago感兴趣,其中包括Fix_eq的各种参数变体,并且不依赖于函数扩展性。请注意,您无需更改Fix_F,而只需证明Fix_eq的变体即可。


要回答您提出的问题,而不是解决您的上下文,您所说的引理称为“整体可扩展性”。

它存在于Coq.Logic.FunctionalExtensionality中,其中使用了函数扩展性公理来证明这一点。标准库版本使用公理来证明该引理的事实至少是有力的证据,证明没有Coq中的公理就无法证明它。

这是该事实的证明草图。由于Coq严格归一化*,因此x = y在空上下文中的每个证明在判断上都等于eq_refl。也就是说,如果您可以在空上下文中证明x = y,那么xy是可转换的。让f x := inhabited (Vector.t (x + 1))g x := inhabited (Vector.t (1 + x))。通过对forall x, f x = g x进行归纳来证明x很简单。因此,如果您的引理是正确的而没有公理,我们可以得到的证明

(forall x, inhabited (Vector.t (x + 1))) = (forall x, inhabited (Vector.t (1 + x)))

在空上下文中,因此eq_refl应该证明这一说法。我们可以轻松地检查并发现eq_refl不能证明这一说法。因此,没有公理就无法证明您的引理ext_fa

请注意,在Coq中,函数的相等性和类型的相等性严重不足。本质上,您可以在Coq中证明相等的唯一类型(或函数)是判断上相等的类型(或更准确地说,可以表示为两个证明相等的lambda表示为适用于可证明相等的闭项的类型)。您可以证明不相等的唯一类型是证明不是同构的类型。您可以证明不相等的唯一功能是,在您提供的域的某些具体元素上可证明不同的功能。可以证明的平等与可以证明的不平等之间有很大的距离,而且在没有公理的情况下,您也无话可说。

* Coq实际上并没有严格归一化,因为共归有一些问题。但是,以模为单位,它是高度规范化的。