Coq具有类型Prop的证明无关命题,在提取过程中将其丢弃。如果我们仅将Coq用于证明,则有此原因是什么?Prop是强制性的,因此Prop:Prop可自动推论Universe索引,我们可以在任何地方使用Type(i)代替。道具似乎使所有事情变得非常复杂。
我读到,在Luo的书中将Set和Prop分开是有哲学原因的,但是,我在书中没有找到它们。这些是什么?
Coq具有类型Prop的证明无关命题,在提取过程中将其丢弃。如果我们仅将Coq用于证明,则有此原因是什么?Prop是强制性的,因此Prop:Prop可自动推论Universe索引,我们可以在任何地方使用Type(i)代替。道具似乎使所有事情变得非常复杂。
我读到,在Luo的书中将Set和Prop分开是有哲学原因的,但是,我在书中没有找到它们。这些是什么?
Answers:
对于程序提取, P r o p非常有用,因为它使我们可以删除无用的部分代码。例如,要提取排序算法,我们将证明以下语句:“对于每个列表 ℓ,都有一个列表 k使得 k被排序,而 k是 ℓ的置换”。如果我们在Coq中写下并提取而不使用 P r o p,则会得到:
sort
verify
pi
pi
尽管多余的东西并非完全没有用,但在许多应用程序中,我们希望摆脱它并保持公正sort
。如果我们使用声明“ k是有序的”并且“ k是ℓ的排列”,而不是 “对于所有ℓ都有k ”,则可以实现此目的。
在一般情况下,提取代码的常用方法是考虑形式的语句其中 x是输入, y是输出, ϕ (x ,y )说明 y是正确的输出的含义。(在上面的示例中, A和 B是列表的类型,而 ϕ (ℓ ,k )是“ k有序,而 k是 ℓ的排列。”)如果 ϕ在 P r o p中,则提取将得出映射 f :使得 φ (X ,˚F (X ))适用于所有 X ∈ 甲。如果 φ是小号Ë 牛逼那么我们也得到了功能摹,使得 g ^ (X )是证明 φ (X ,˚F (X ))成立,所有 X ∈ 一。通常,该证明在计算上是无用的,我们希望摆脱它,尤其是当它深深地嵌套在其他语句中时。给了我们这样做的可能性。
2015年7月29日添加:存在一个问题,我们是否可以通过自动优化掉“无用的提取代码”来完全避免。在某种程度上,我们可以做到这一点,例如,从逻辑的否定片段(从空类型,单元类型,乘积生成的东西)中提取的所有代码都是无用的,因为它们只是在单元周围乱码。但是,使用P r o p时,必须做出真正的设计决策。这是一个简单的示例,其中Σ表示我们在T y p e中,∃表示我们在P r o p中。如果我们从中提取 ,我们将得到一个程序,它分解 Ñ到其最低位 b和剩余位 ķ,即,它计算的所有内容。如果我们从提取 Π Ñ :Ñ Σ b :{ 0 ,1 } ∃ ķ :Ñ
是强制性的,它创建了一个非常有表现力的证明系统。但是,它在以下意义上“过于”表达:
是不一致的。通常,您希望保留添加排除的中间语的可能性,因此一种解决方案是保留较大的消除数并将Prop用作谓语。另一个是抑制大消除。
Coq都做到了!他们将谓词Prop重命名为Set,并禁用了Prop中的大型消除。
泛用性获得的表现力是“令人放心的”,因为99%的“合理”数学可以用它来形式化,并且相对于集合论,它是一致的。这使得他们很可能不会削弱它到像Agda这样的只有谓语宇宙的东西。
Prop : Prop
,这将是不一致的。相反,对所有命题的量化都是命题。