为什么在依赖类型系统中将递归类型用作证明的原语?


10

我是类型理论和依赖编程的新手。我一直在研究构造(CoC)和其他纯类型系统的演算。我对将其用作编译器系统的保存证明中间表示特别感兴趣。

据我所知,(共)递归类型表示的在计算上,使用作为唯一的类型构造函数。不过,我已经读过,它们不能用于归纳构建证明(请原谅,我现在找不到位置!),例如,我无法在普通CoC中证明(即使可以键入)。Π01NatΠ(N:).Π(S:NN).Π(Z:N).N

我认为这就是为什么他们建立了归纳结构(CIC)的原因。它是否正确?但为什么?我找不到任何材料来解释为什么不使用(共)归纳类型作为原语就无法表示这样的证明。如果不是这样,那么为什么要在CIC中将它们添加为原语?

Answers:


7

我不是专家,但是我将通过一个示例分享到目前为止我所了解的内容。

让我们考虑使用CoC的布尔类型,使用其标准编码: 我们可能期望能够证明 实际上,这很快就从我们在CiC中具有依赖消除/归纳原理

B=Πτ:τττtt=λτ:,x:τ,y:τ. xff=λτ:,x:τ,y:τ. y
Πb:Bb=ttb=ff()
Bind:ΠP:BP(tt)P(ff)Πb:BP(b)

但是,我们不能真正期望(*)在所有CoC模型中都适用!直观地,的值应该大致是函数的函数族, 为每种类型分配解释中的值。但这不会强制为的值之间的一个。例如,我们可以(非正式地)有 B{fτ}τττττfτtt,ff

fN(n)(m)=n+m

为了确保的值是唯一可能的值,我们需要将自己限于参数模型。确实(我认为)可以从与多型相关的自由定理证明性质。tt,ff()B

但是,据我了解,CoC并不排除参数不成立的临时模型。在某些情况下,只是错误的。根据健全性,在存在对等模型的情况下,我们得出结论在CoC中不存在。因此,CoC中也没有术语。()()Bind


我不确定是否要遵循。例如,给定表达式为,我可以通过多种方式为Nat构造构造函数,但最终,不是所有的构造函数都可以由任一构建或?(λ(Nat:).(...))(Π(N:).Π(S:NN).Π(Z:N).N)SZ
paulotorrens

@paulotorrens在逻辑内部,是的,我相信这些是唯一的选择。但是在CoC模型(即席模型)中,可能存在无法通过定义的值。考虑一个自然值,使得所有类型,除了,其中。在大多数类型上,值表现为“零”,对于布尔值,其表现为“一”。我们不能写在CoC中定义该值,但是在临时模型中该值仍可能存在。NatS,Znn(T)(ST)(ZT)=ZTTT=Bn(B)(S)(Z)=S(Z)nλT:.if T=B then n

@paulotorrens如果您考虑也许可以更轻松地理解问题。这种类型仅由(多态的)同一性所占据,并且在参数模型中确实是该类型术语的唯一可能值。但是,在临时模型中,我们可以为所有类型定义一个值,但对于,其中。ΠT:TTv(T)(x)=xTT=Nv(N)(x)=x+1
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.