是的,胎儿检查器可以对Goedel T中的所有内容进行类型检查。您可以通过使用检查器显示T中的迭代运算符正在终止来显示此内容。例如,以下定义将起作用:
iteriterif0iterif(n+1):==A→(A→A)→N→Aif(iterifn)
对于胎儿检查器(或大多数其他任何终止检查器)来说,这很容易检查,因为它显然是结构上递归的定义。
Agda和Coq都允许证明终止的功能远远超出一阶算术中证明的总和。启用此功能的功能是它们允许通过递归数据来定义类型,这称为“大消除”。(在ZF集理论中,替换的公理方案具有大致相同的目的。)
一个超越T的简单例子就是Goedel T本身的一致性!我们可以将语法作为数据类型给出:
data T : Set where
N : T
_⇒_ : T → T → T
data Term : T → Set where
zero : Term N
succ : Term (N ⇒ N)
k : {A B : T} → Term (A ⇒ B ⇒ A)
s : {A B C : T} → Term ((A ⇒ B ⇒ C) ⇒ (A ⇒ B) ⇒ A ⇒ C)
r : {A : T} → Term (A ⇒ (A ⇒ A) ⇒ N ⇒ A)
_·_ : {A B : T} → Term (A ⇒ B) → Term A → Term B
请注意,类型依赖项允许我们定义仅包含T的类型良好的术语的术语数据类型。然后,我们可以为这些类型提供解释功能:
interp-T : T → Set
interp-T N = Nat
interp-T (A ⇒ B) = (interp-T A) → (interp-T B)
这表示N
应该是Agda自然数,而T的箭头应解释为Agda函数空间。这是一个“大”消除,因为我们通过递归定义了数据类型T的结构的集合。
然后,我们可以定义一个解释函数,表明Goedel T的每个术语都可以用一个Agda术语来解释:
interp-term : {A : T} → Term A → interp-T A
interp-term zero = 0
interp-term succ = \n → n + 1
interp-term k = \x y → x
interp-term s = \x y z → x z (y z)
interp-term r = Data.Nat.fold
interp-term (f · t) = (interp-term f) (interp-term t)
(我的机器上没有Agda,因此毫无疑问会缺少一些导入,固定性声明和错别字。对于那些愿意的人,他们也可以是编辑者),这是读者的一项练习。)
我不知道Agda的一致性强度是多少,但是Benjamin Werner已经证明归纳构造的微积分(Coq的内核微积分)与ZFC以及许多不可访问的基数相等。