为什么Coq有Prop?


35

Coq具有类型Prop的证明无关命题,在提取过程中将其丢弃。如果我们仅将Coq用于证明,则有此原因是什么?Prop是强制性的,因此Prop:Prop可自动推论Universe索引,我们可以在任何地方使用Type(i)代替。道具似乎使所有事情变得非常复杂。

我读到,在Luo的书中将Set和Prop分开是有哲学原因的,但是,我在书中没有找到它们。这些是什么?


6
“如果我们仅将Coq用于证明”:我认为您已经在此处确定了关键点。Coq不仅用于证明。
吉尔斯(Gillles)“所以别再作恶了”

Answers:


34

对于程序提取, P r o p非常有用,因为它使我们可以删除无用的部分代码。例如,要提取排序算法,我们将证明以下语句:“对于每个列表 ℓ,都有一个列表 k使得 k被排序,而 k的置换”。如果我们在Coq中写下并提取而不使用 P r o p,则会得到:PropkkkProp

  1. “对于所有都有k ”将为我们提供一张地图,其中包含列表到列表,ksort
  2. “使排序”将给出一个遍历k并检查其是否已排序的函数,并且kverifyk
  3. 是的置换 ”将给置换这需要ķ。请注意,这不仅是映射,而且是逆映射以及用于验证两个映射确实为逆的程序。kpikpi

尽管多余的东西并非完全没有用,但在许多应用程序中,我们希望摆脱它并保持公正sort。如果我们使用声明“ k是有序的”并且“ k的排列”,而不是 “对于所有都有k ”,则可以实现此目的。Propkkk

在一般情况下,提取代码的常用方法是考虑形式的语句其中 x是输入, y是输出, ϕ x y 说明 y是正确的输出的含义。(在上面的示例中, A B是列表的类型,而 ϕ k 是“ k有序,而 k的排列。”)如果 ϕ P r o p中,则提取将得出映射 f x:A.y:B.ϕ(x,y)xyϕ(x,y)yABϕ(,k)kkϕProp使得 φ X ˚F X 适用于所有 X 。如果 φ小号Ë 牛逼那么我们也得到了功能,使得 g ^ X 是证明 φ X ˚F X 成立,所有 X f:ABϕ(x,f(x))xAϕSetgg(x)ϕ(x,f(x))xA。通常,该证明在计算上是无用的,我们希望摆脱它,尤其是当它深深地嵌套在其他语句中时。给了我们这样做的可能性。Prop

2015年7月29日添加:存在一个问题,我们是否可以通过自动优化掉“无用的提取代码”来完全避免。在某种程度上,我们可以做到这一点,例如,从逻辑的否定片段(从空类型,单元类型,乘积生成的东西)中提取的所有代码都是无用的,因为它们只是在单元周围乱码。但是,使用P r o p时,必须做出真正的设计决策。这是一个简单的示例,其中Σ表示我们在T y p e中表示我们在P r o p中。如果我们从中提取 PropPropΣTypeProp ,我们将得到一个程序,它分解 Ñ到其最低位 b和剩余位 ķ,即,它计算的所有内容。如果我们从提取 Π Ñ Ñ Σ b { 0 1 }ķ Ñ

Πn:NΣb:{0,1}Σk:Nn=2k+b
nbk 那么程序将只计算最低位 b。机器无法分辨出哪台机器是正确的,用户必须告诉机器他想要什么。
Πn:NΣb:{0,1}k:Nn=2k+b
b

1
我有点困惑。您是否在说没有,就不可能在提取的程序中识别出g x 对输出没有贡献(即,它只是验证了输出)?是否存在无法通过代码优化器可用的常用方法提取出这种无用代码的场景?Propg(x)
用户

1
从提取的程序中,人们可以说“我想要 ”,然后从那里回溯。我一直无法提出一个如此纠缠的场景,以至于我们无法优化掉任何对确定排列没有直接贡献的东西,而实际上却不是计算所述排列所必需的(无论如何从全局优化的角度来看) )。k
用户

1
您没有信息“我想要 ”。这是一个额外的假设,很明显,一旦他们告诉您他们想要哪个特定结果,您就可以优化废弃代码。实际上,我想到了一个更好的答案:这是一个设计问题,需要在P r o p中放入什么。您需要知道用户想要什么,然后他会使用P r o p告诉您他想要什么。可以很容易地找到存在多个选项的示例。我将在答案中添加一个。kPropProp
Andrej Bauer

2
据我所知,没有人能真正说出如何从-类型中提取任何东西。显然,它们包含一些计算内容,但可能不包含这些内容。(1)
Andrej Bauer

3
啊好吧。与删除无用代码的方式相比,使用作为指定设计决策的方式对我来说更有意义。Prop
用户

19

强制性的,它创建了一个非常有表现力的证明系统。但是,它在以下意义上“过于”表达:Prop

impredicative Prop+large elimination+excluded middle

是不一致的。通常,您希望保留添加排除的中间语的可能性,因此一种解决方案是保留较大的消除数并将Prop用作谓语。另一个是抑制大消除。

Coq都做到了!他们将谓词Prop重命名为Set,并禁用了Prop中的大型消除。

泛用性获得的表现力是“令人放心的”,因为99%的“合理”数学可以用它来形式化,并且相对于集合论,它是一致的。这使得他们很可能不会削弱它到像Agda这样的只有谓语宇宙的东西。


8
哦,我忘了提:并非如此Prop : Prop,这将是不一致的。相反,对所有命题的量化都是命题。
cody 2014年

您能否指出我有关此的更多资源?我所能找到的一切似乎都很分散。
user833970

1
@ user833970您想要指针指向什么特定的东西?恐怕对于依赖类型的元理论并没有真正的全面参考。这个讨论(指的是这里!)可能是有用的:github.com/FStarLang/FStar/issues/360
cody

谢谢,我现在正在研究Berardi悖论论文,我认为这将消除我的困惑。
user833970

14

即使您对提取程序不感兴趣,Prop强制性的事实也使您可以构建某些模型,而这些模型是无法使用谓词性塔构建的。IIRC Thorsten Altenkirch使用Coq的对等性建立了系统F的模型。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.