虽然在类型检查的情况下效果很好,但是这里确实确实有一个细微之处。我将在这里写下该问题,因为它似乎出现在许多相关的线程中,并尝试解释为什么在“标准”依赖类型理论中进行类型检查时一切正常。因为无论如何这些问题都会出现):
事实1:如果是的派生,那么对于某种和每个子项,都有的派生。,有一些类型,上下文和推导的。dΓ ⊢ 吨:甲d′Γ ⊢ 一:小号sü ≤ Ť乙Δd′Δ ⊢ û :乙
这个好事实很难证明,并且被一个非常讨厌的反事实所抵消:
事实2:在一般情况下,和是不是子推导!d′d′ dd
这在某种程度上取决于类型系统的精确表述,但是实际上实施的大多数“操作”系统确实符合事实2。
这意味着,在对派生进行归纳推理时,您不能“传递给子术语”,也不能得出关于您要证明某事的术语类型的归纳陈述是正确的。
当试图证明看似无害的语句时,这一事实非常刺耳,例如,具有类型转换的系统等同于具有无类型转换的系统。
但是,在类型推断的情况下,您可以通过对术语的结构进行归纳来给出同时的类型和排序(类型的推断)推断算法,这可能涉及到Andrej建议的类型导向算法。对于给定的术语(和上下文,您要么失败要么找到,使得和。您无需使用归纳假设来找到后者)推导,因此尤其可以避免上述问题。ŤΓ一,小号Γ ⊢ 吨:甲Γ ⊢ 一:小号
关键情况(也是唯一真正需要转换的情况)是应用程序:
infer(t u):
type_t, sort_t <- infer(t)
type_t' <- normalize(type_t)
type_u, sort_u <- infer(u)
type_u' <- normalize(type_u)
if (type_t' = Pi(A, B) and type_u' = A' and alpha_equal(A, A') then
return B, sort_t (or the appropriate sort)
else fail
每次对normalize的调用都以类型明确的条件完成,因为这是infer
的成功的不变条件。
顺便说一句,在实现时,Coq没有可判定的类型检查,因为它fix
在尝试对语句进行类型检查之前对语句主体进行了标准化。
无论如何,正常类型的名词的界线是如此天文数字,以至于在这一点上可判定性定理在大多数情况下都是学术性的。实际上,只要有耐心,就可以运行类型检查算法,如果还没有完成,则尝试其他方法。