我正在尝试使用有充分根据的定位点来定义递归谓词,当用F_ext进行重写时,必须显示Fix_eq。 CPDT说,大多数这样的义务都可以通过简单明了的自动化证明而免除,但不幸的是,对于我的谓词而言,这似乎并非如此。
我已将问题简化为以下引理(来自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}}的应用。怎么能分辨出内涵上的差异?
我错过了一个简单的证明还是引理不可证明?
答案 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
,那么x
和y
是可转换的。让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实际上并没有严格归一化,因为共归有一些问题。但是,以模为单位,它是高度规范化的。