Curry-Howard同构讲义

前言

Curry-Howard同构, 也被称为"命题作为类型"范式, 陈述了形式逻辑系统与计算性演算之间惊人的联系. 它自这样的观察开始, 一个推论AB与一类从AB的函数有关 [译注: 这里强调的是一个推论和一类有关, 一类也就是一个类型], 因为从ABA推出B可以被视为将第一个假设应用于第二个, 正如将一个从AB的函数应用于A的一个元素产生B的一个元素. 类似地, 可以说通过实际从B推出A来证明推论AB就像构造一个函数, 其将定义域A的任意元素都映射至B的元素.

实际上, 这是一个很老的想法了, 应该归功于Brouwer, Kolmogorov和Heyting, 即从AB的推论的一个构造性证明, 是一个将A的证明变换为B的证明的过程. Curry-Howard同构形式化了这个想法, 例如命题直觉主义逻辑中的证明可以被表示为简单类型λ项. 可证明的定理不外乎是非空类型.

这种类比, 最初由Haskell Brooks Curry于1930年代发现, 也适用于其他的逻辑系统. 似乎所有和证明相关的概念都可以基于计算来解释, 而各种lambda演算和相近系统的一切句法特征都可以用证明论的语言来陈述. 例如, 谓词逻辑中的量化对应于依赖积, 二阶逻辑与多态有关, 而古典逻辑中的反证法是控制运算符 (例如异常) 的近亲. 而且, 各种逻辑形式化 (Hilbert风格, 自然演绎, 相继式演算) 可由相对应的计算模型 (组合子逻辑, λ演算, 显式替换演算) 来模拟.

自William Howard的1969年的工作起人们理解到这种命题作为类型的对应不仅仅是意外得来的珍品, 而且是一种根本性的原理. 证明正规化和切消是另一种计算的模型, 等价于β规约. 证明论和计算理论不过是一体两面而已.

第1章 无类型λ演算

λ演算是一种计算的模型, 它在另一种这样的模型Turing机器出现数年之前被发明出来. 对于后者而言, 计算被表达为读写纸带, 以及根据纸带的内容施行操作. Turing机器就像命令式语言 (比如Java或C) 的程序.
与之相对地, 在λ演算中, 人们关心函数, 而函数可以将函数作为参数, 以及返回函数作为结果. 用编程的术语来说, λ演算是一个极其简单的高阶函数式编程语言.
本章我们只讨论无类型λ演算, 之后我们将引入诸多变体, 其中λ项被归为各种类型.

第1.1节 温和的引入

λ演算之中计算以λ项表达. 它们类似于数学中使用的匿名函数记号nn2. 然而, 数学家使用这样的记号来指称作为数学对象的函数 (被定义为序对的集合). 与之相对地, λ项是形式表达式 (字符串), 从直觉上说, 以最纯粹的形式表达了函数和函数的应用. 因此, 一个λ项是如下形式之一:

在一个抽象λx.M中, 变量x代表函数参数 (或者说形式参数), 它可能出现在函数的体M之中, 但不必总是如此. 在一个应用MN之中, 运算符M和参数N的形状没有限制, 它们都可以是任意的λ项.

举个例子, λI=λx.x从直觉上表示了一个将任意的参数映射至自身的函数, 即恒等函数. 再举一个, K=λxλyx代表了这样的一个函数, 其将任意的参数x映射至总是返回x的常函数. 最后一个例子, IK表达了将函数I应用于参数K.

在数学中, 我们通常将函数应用的参数写在括号里, 例如若函数是f, 参数是4, 那么就记成f(4). 在λ演算中, 我们则会将其记成f4. 尽管如此, 括号的运用并不能被完全消除. 例如, 记号λxxy是有歧义的. 如果我们想要表达的是将I应用于y, 那么就应该写成(λxx)y. 或者, 可以用λx(xy)来表示一个x上的抽象, 其体为xy. 后一种情况下, 按照惯例是使用点记号的, 即写作λx.xy. 类似地, 我们也需要使用括号来消除应用的歧义. 例如, I(KK)表达了将I应用于KK.

如果λxM代表一个函数, N代表一个参数, 那么应用(λxM)N的"值"可以通过将M中的x替换为N计算得到. 这样一个替换的结果以M[xN]表示, 而我们可以用β规约规则来形式化这个计算: (λxM)NβM[xN]. 例如,(IK)z=((λxx)K)zβx[xK]z=Kz=(λyλxy)zβλxz.这个计算表达式的值的过程与通常的数学实践是类似的. 如果f(n)=n2, 那么f(4)=42, 并且我们是通过在f定义的体中将n替换为4从应用f(4)得到结果42的. 编程语言上的类比即按名调用的参数传递机制, 其中过程的形式参数被全部替换以实际的参数表达式.

一个λ抽象λxM中的变量xM中被绑定 (或者说局部于), 就非常类似于一个过程的形式参数被认为局部于该过程. 与之相对的是, 一个变量y, 若没有与其对应的抽象, 则被称为自由的 (或者全局的), 这就类似于大多数编程语言中的全局变量. 因此, 在λx.xy之中, x是绑定的, 而y是自由的.

当绑定变量和自由变量重名时会引起一些混乱. 例如, 在x(λx.xy)中, 显然有两个不同的x: 自由的 (全局的) x和绑定的 (局部的) x, 绑定的x"遮住了"体内自由的x. [译注: 换言之, 若体内的x没有λ绑定的包裹, 则会是一个自由变量.] 若我们转而考虑λx(λz.zy), 那就没有歧义了. 再举另外一种引起混乱的例子, (λx.xy)[yx]应该将(λx.xy)中的y替换为自由变量x, 但是λx.xx并非预期的结果. 在后一个项中, 我们失去了形式参数x和自由变量x之间的区别 (自由变量已被lambda捕获). 如果我们使用一个绑定变量z, 那么混乱就消失了: (λz.zy)[yx]=λz.zx.

过程的局部变量总可以被换名而不影响程序的含义. 类似地, 在λ演算中我们也不在乎绑定变量的名字. λλxxλyy都代表着恒等函数. 正因如此, 通常假定只有绑定变量不同的项是等同的. 这给了我们选取绑定变量以避免混乱 (比如说变量捕获) 的自由.

第1.2节 预项和λ

现在我们定义预项的概念, 并将λ项作为预项的等价类引入. 本节相当乏味, 但对于使得我们的形式化精确而言是必要的. 然而, 为了理解本书的大部分内容, 前一节对于λ项的非形式化理解就足够了.

1.2.1. 定义.Υ代表一个可数无穷的符号集合, 之后就将其称为变量 (当其他种类的变量可能造成歧义的时候, 也将其称为对象变量或者λ变量). 我们通过归纳定义预项的概念如下:所有预项构成的集合记作Λ.
评注. 这个定义可以被总结为以下语法:Mx|(MM)|(λxM).在本书的剩余部分里, 我们将时常使用这种简短的定义风格.

预项, 正如上面所定义的那样, 是完全括号化的. 如预项(λf((λu(f(uu)))(λv(f(vv)))))所呈现的, 括号的重度使用是相当笨拙的. 因此, 我们引入一些记号上的约定, 每当不致引起歧义时我们非正式地使用它们.

1.2.2. 约定.
  1. 一个项最外部的括号被省略.
  2. 应用向左结合: ((PQ)R)被缩略为(PQR).
  3. 抽象向右结合: (λx(λyP))被缩略为(λxλyP).
  4. 一个抽象的序列(λx1(λx2(λxnP)))可以被记成(λx1x2xn.P), 在这种情形之下P最外面的括号 (如果有的话) 通常被省略. [原注: 这个点代表了一个辖域尽可能向右延伸的左括号.]
例子.
1.2.3. 定义. 定义M的自由变量的集合FV(M)如下.FV(x)={x};FV(λxP)=FV(P){x};FV(PQ)=FV(P)FV(Q).
例子.x,y,z是不同的变量, 那么FV((λxx)(λy.xyz))={x,z}. 这里有两种x的出现: 一个在λx下, 一个在λy下. M中一个x的出现被称为绑定的, 如果它在形状为λxLM的一部分中, 反之则被称为自由的. 于是, xFV(M)当且仅当M中存在x的一个自由出现.
1.2.4. 定义.M中的x替换为N, 记作M[xN], 是有定义的当且仅当不存在Mx的自由出现满足其在形式为λyLM的一部分中, 并且yFV(N). [译注: 直觉就是N中的自由变量不能被y捕获.] 在这样的情况下, M[xN]由下列等式给出:x[xN]=N;y[xN]=y, 如果xy;(PQ)[xN]=P[xN]Q[xN];(λxP)[xN]=λxP;(λyP)[xN]=λyP[xN], 如果xy.[原注: 在我们的元记号中, 替换绑定得比其他任何东西都要强, 所以说在第三行, 最右边的替换是应用于Q的, 而不是应用于P[xN]Q的. (译注: 补充说一句, 真要是后一种情况, 那这个定义是否良定都很可疑了, 因为P[xN]Q不比PQ小.)]
[译注: 读者应该注意到在这个定义里, 如果(PQ)[xN]有定义, 那么P[xN]Q[xN]也就有定义, 并且如果(λyP)[xN]有定义, 其中xy, 那么P[xN]也就有定义. 否则的话, 替换就不是良定的了.]
评注. 在最后一行, yFV(N)或者xFV(P).
1.2.5. 引理.
  1. 如果xFV(M), 那么M[xN]有定义, 并且M[xN]=M.
  2. 如果M[xN]有定义, 那么yFV(M[xN])当且仅当要么yFV(M)xy, 要么yFV(N)xFV(M).
  3. 替换M[xx]有定义, 且M[xx]=M.
  4. 如果M[xy]有定义, 那么M[xy]M拥有相同的长度.
证明.M上施行归纳. 作为例子, 我们细致地证明i. 显然M[xN]是有定义的. 为了证明M[xN]=M我们考虑以下情形. 如果M是一个变量y, 那么必有yx, 并且y[xN]=y. 如果M=PQ, 那么xFV(P)xFV(Q), 于是根据归纳假设有P[xN]=PQ[xN]=Q, 因此(PQ)[xN]=P[xN]Q[xN]=PQ. 最后, 如果M是一个抽象, 要么M=λxP要么M=λyP, 其中xy. 在前一种情况下, (λxP)[xN]=λxP. 在后一种情况下, 我们有xFV(P), 于是根据归纳假设, (λyP)[xN]=λyP[xN]=λyP.
1.2.6. 引理. 假定M[xN]是有定义的, 并且N[yL]M[xN][yL]也都是有定义的, 其中xy. 如果xFV(L)或者yFV(M), 那么M[yL]是有定义的, M[yL][xN[yL]]也是有定义的, 并且M[xN][yL]=M[yL][xN[yL]].
证明.
1.2.7. 引理.
1.2.8. 定义. 关系=α (α变换) 是Λ上满足下列条件的最小的传递自反关系:[译注: 后三条是在说=α是一个兼容关系.]
例子.x,y是不同的变量, 那么λxy.xy=αλyx.yx, 但是λx.xyαλy.yx.
1.2.9. 引理. α变换的关系是一个等价关系.
1.2.10. 引理. 如果M=αN, 那么FV(M)=FV(N).
证明.
定义1.2.14. 定义λ项的集合Λ=α的商集:Λ={[M]α|MΛ},其中[M]α={NΛ|M=αN}.
例子.
定义1.2.15. 一个λM的自由变量FV(M)定义如下. 令M=[M]α, 那么FV(M)=FV(M).如果FV(M)=, 那么就称M是封闭的或者它是一个组合子.
引理1.2.10确保了任何对于M的选择都会产生相同的结果.
定义1.2.16.
记号1.2.17.
引理1.2.18. 以下等式是合理的:FV(x)={x};FV(λxP)=FV(P){x};FV(PQ)=FV(P)FV(Q).
引理1.2.19.
引理1.2.20.
定义1.2.21.

第1.3节 规约

1.3.1. 定义. 一个Λ上的关系是兼容的当且仅当它对于所有的M,N,ZΛ满足下列条件.
  1. 对于所有的变量x, 如果MN, 那么λx.Mλx.N.
  2. 如果MN, 那么MZNZ.
  3. 如果MN, 那么ZMZN.
[译注: 兼容的直觉就是上下文中的关系.]
1.3.2. 定义. Λ上满足(λx.P)QβP[xQ]的最小兼容关系β被称为β规约. 具有形式(λxP)Q的项被称为β可规约项, 而P[xQ]被称为是由收缩这个可规约项产生的. 一个项Mβ规范形式 (记号MNFβ) 当且仅当不存在这样的N满足MβN, 即M并不包含一个β可规约项.
1.3.3. 定义.
  1. 关系β (多步β规约) 是β的传递且自反闭包. β的传递闭包记作β+.
  2. 关系=β (被称为β等价或者β变换) 是包含β的最小等价关系.
  3. 一个β规约序列是一个有限或无限的序列M0βM1βM2β
1.3.4. 评注.
例子1.3.5.
  1. (λx.xx)(λzz)β(xx)[xλzz]=(λzz)(λyy).
  2. (λzz)(λyy)βz[zλyy]=λyy.
  3. (λx.xx)(λzz)βλyy.
  4. (λxx)yz=βy((λxx)z).
例子1.3.6. (一些常见的λ项).
  1. I=λxx, K=λxy.x以及S=λxyz.xz(yz), 那么SKKβI.
  2. ω=λx.xx以及Ω=ωω, 那么ΩβΩβΩβ.
  3. Y=λf.(λx.f(xx))(λx.f(xx)), 那么YβYβYβ, 其中Y,Y,Y,各不相同.
评注1.3.7.
引理1.3.8.
定义1.3.9.
命题1.3.10.=ext是满足下列条件的最小关系:那么, M=extN当且仅当M=βηN. [译注: =ext即所谓的外延相等的概念.]
证明.
引理1.3.11.

第1.4节 Church-Rosser定理

既然一个λM可能包含数个β可规约项, 那么可能存在多个N满足MβN. 例如, K(II)βλx.IIK(II)βKI.

定义1.4.1.β是满足下列条件的Λ上的最小关系:
引理1.4.2.
  1. 如果MβN, 那么MβN.
证明.
定义1.4.3.M (M的complete development) 定义为:x=x;(λxM)=λxM;(MN)=MN, 如果M不是一个抽象;((λxM)N)=M[xN].

第1.5节 最左规约是正规化

定义1.5.1. 一个项M是正规化的 (记号MWNβ) 当且仅当存在一个从M开始的规约序列终于正规形式N, 那么我们称M有正规形式N. 一个项M是强正规化的 (MSNβ或者仅仅MSN) 如果从M开始的规约序列都是有限的. 如果MSNβ, 那么我们记Mβ. 类似的记号也用于其他规约概念.

任何强正规化的项也是正规化的, 反之则不然, 如KIΩ. 但是, 定理1.5.8陈述了一个正规形式, 如果存在的话, 总是可由重复规约最左可规约项得到, 最左可规约项即其λ向左走得最远的可规约项. 以下记号和定义对于证明定理1.5.8而言是方便的.

向量记号.n0. 如果P=P1,,Pn, 那么我们记MP1PnMP. 特别地, 如果n=0, 即P为空, 那么MP就是M. 类似地, 如果z=z1,,zn, 那么我们记λz1zn.Mλz.M. 又一次, 如果n=0, 即z为空, 那么λz.M就是M.

评注. 任何项都恰具有以下两种形式之中的一种: λz.xR或者λz.(λxP)QR, 在后一种情况下(λxP)Q被称为头部可规约项 (在前一种情况下, 不存在头部可规约项).
定义1.5.2. 对于不是正规形式的项M, 我们记
引理1.5.3.
  1. 如果MhβN, 那么λxMhβλxN.
定义1.5.4.

第1.6节 永恒规约和守恒定理

第1.7节 可表达性和不可判定性

无类型λ演算是如此之简单, 以至于它的强大是令人惊讶的. 本节我们将展示实际上λ演算可以被视为递归论的另一种形式化.

我们可以使用λ项表示各种各样的构造, 例如真值:true=λxy.xfalse=λxy.yif P then Q else R=PQR.很容易看出来if true then P else QβPif false then P else QβQ.另一种有用的构造是序对M,N=λx.xMNπ1=λp.p(λxy.x)π2=λp.p(λxy.y)正如所期望的我们有πiM1,M2βMi

定义1.7.1.λ中我们可以将自然数表示为Church数码:cn=λfx.fn(x)其中fn(x)f(f((x)))的缩略形式, f出现了n次. 有时我们将cn记成n, 于是0=λfx.x1=λfx.fx2=λfx.f(fx)
定义1.7.2. 一个部分函数f:kλ可定义的当且仅当存在FΛ满足:我们称项F定义了函数f.
例子1.7.3. 下列项定义了一些常见函数.
命题1.7.4. 原始递归函数是λ可定义的.

第1.8节 注记

λ演算和与之相关的组合子逻辑是在1930年左右分别由Alonzo Church [9, 10]和Haskell B. Curry引入的. 起初, 这种演算是某意图作为逻辑基础的系统的一部分. 不幸的是, Church的学生Kleene和Rosser发现原始的系统是不一致的, 而Curry简化了这个结果, 其现在被称为Curry悖论. 最终, 仅处理λ项, 规约以及变换的子系统, 也就是我们称之为λ演算的东西, 被单独进行研究.

λ绑定和α变换的概念在直觉上是非常清晰的, 然而在第1.2节我们看到为了正确地处理它们, 许多技术性的困难必须被克服. 当人们遇到实际实现的问题时, 这个事情就变得尤为重要了. 一种古典的解决方案是使用变量的匿名表示 (所谓的de Bruijn索引). 想要了解更多此方面内容和相关主题, 见例如[18, 19, 24].

第1.9节 练习

练习1.2. 修改定义1.2.4以使得操作M[xN]对于所有的M, Nx都有定义, 然后证明M[xN]=αM[xN]对于所有的M=αMN=αN均成立 (参照引理1.2.11).

第2章 直觉主义逻辑

"逻辑"一词具有多种含义, 从日常推理到复杂的形式系统. 在大多数情况下, 逻辑被用来将陈述划分为"真"和"假". 也就是说, 人们所说的逻辑通常指的是二值古典逻辑的诸多变种之一.

第2.1节 BHK解释

直觉主义命题逻辑, 也被称为直觉主义命题演算 (缩写为IPC), 其语言和古典命题逻辑相同 [译注: 即句法相同].

定义2.1.1. 给定一个命题变量的无限集合PV, 我们将公式的集合Φ定义为满足下列条件的最小集合:变量和被称为原子公式. 一个公式φ的子公式是φ的一部分 (未必proper), 其自身是也是一个公式.

也就是说, 我们基本的联结词是: 推出, 析取, 合取, 以及常量 (谬). 否定¬和等价是缩略形式, 常量 (真) 也是如此:

Brouwer-Heyting-Kolmogorov解释:

例子2.1.3. 考虑以下公式:
  1. p;
  2. pqp;
  3. (pqr)(pq)pr;
  4. p¬¬p;
  5. ¬¬¬p¬p;
  6. (pq)(¬q¬p);
  7. ¬(pq)(¬p¬q);
  8. ((pq)r)(p(qr));
  9. ¬¬(p¬p);
  10. (p¬p)¬¬pp.
以上公式都可被赋予一个BHK解释.
例子2.1.4. 以下每个公式都是一个古典重言, 但是并不存在一个构造, 尽管其中一些与前一个例子中的公式类似或者"对偶".
  1. ((pq)p)p;
  2. p¬p;
  3. ¬¬pp;
  4. (¬q¬p)(pq);
  5. ¬(pq)(¬p¬q);
  6. (pq)(¬pq)q;
  7. ((pq)r)(p(qr));
  8. (pq)(¬pq);
  9. (pqp)(pqq);
  10. (¬¬pp)p¬p.

第2.2节 自然演绎

为了形式化直觉主义命题逻辑, 我们定义了一个被称为自然演绎的证明系统, 用NJ(,,,)表示, 或者就简单地记作NJ.

定义2.2.1.
  1. 自然演绎中的一个判断是一个序对, 被记作Γφ (读作"Γ证明了φ"), 其由一个有限的公式集合Γ和一个公式φ构成.
  2. 我们在书写判断的时候使用了多种简化, 例如记φ1,φ2ψ而不是{φ1,φ2}ψ, 记Γ,Δ而不是ΓΔ, 记Γ,φ而不是Γ{φ}. 特别地, 记号φ代表φ.
  3. Γφ的一个形式证明或推导是一个有限的判断的树, 满足以下条件:
    • 根标签是Γφ;
    • 所有的叶子都是公理, 例如具有形式Γ,φφ的判断;
    • 每个母结点的标签都由其女之标签由图2.1的规则得到.
    如果这样一个证明存在, 那么我们称Γφ是可证明的或可推导的, 记作ΓNφ. 对于无限的Γ, ΓNφ的意思是对于某个Γ的有限子集Γ0Γ0Nφ.
  4. 通常我们省略N中的标记N. 注意到若是如此那么记号Γφ就过载了. 它既表达一个判断的可证明性, 也代表判断本身. 然而, 其用意在上下文中总是明确的.
  5. 如果φ, 那么我们称φ是一个定理.

第2.3节 古典逻辑的代数语义

定义2.3.1. 一个格是一个偏序(A,), 其满足对于每个A的二元素子集{a,b}, A中存在它的最小上界和最大下界. 我们记supA{a,b}ab, infA{a,b}ab. 与集合论的运算相类比, 我们称为并 (或者join), 为交 (或者meet). 格的top (相应地, bottom) 若存在, 通常被记为1 (相应地, 0).
引理2.3.2. 在一个格中, 以下条件等价:
  1. ab;
  2. ab=a;
  3. ab=b.
例子2.3.3. 每个线序, 例如真值的集合𝔹, 是一个格. 每个在集合的并与交下封闭的集族也是一个格. 但是, 相对于的封闭性并不是集族成为格的必要条件. 一个例子是Euclid平面的所有凸子集的族. (一个集合A是凸的当且仅当对于所有的a,bA, 连接ab的线段被包含在A中.)
引理2.3.4. 以下等式在每个格中都是成立的:
  1. aa=aaa=a;
  2. ab=baab=ba;
  3. (ab)c=a(bc)(ab)c=a(bc);
  4. (ab)a=a(ab)a=a.
定义2.3.5.
  1. A被称为分配的, 如果以下等式在A中成立:
    1. (ab)c=(ac)(bc);
    2. (ab)c=(ac)(bc).
  2. 假定格A拥有top元素1和bottom元素0, 我们称ba的补当且仅当ab=1ab=0.
引理2.3.6.ba在某分配格A中的补, 那么bA中满足ab=0的最大元素. 特别地, a最多只有一个补.
证明.ac=0, 那么cb, 因为c=1c=(ab)c=(ac)(bc)=0(bc)=bc.
定义2.3.7. 一个布尔代数是一个带有top和bottom元素的分配格B, 其满足每个B的元素a都有一个补 (记作a).

布尔代数经常以形式为=B,,,,0,1的代数结构呈现. 在这种情况下, 偏序可以在abab=a的等价性 (见引理2.3.2) 的帮助之下被重新构造出来.

例子2.3.8.X是任意的集合. 一个集合域 (X上的) 是一个非空的X的子集族, 其在集合论的并, 交, 补 (相对于X) 下封闭. 每个集合域都是一个布尔代数. 集合域的例子如下:
  1. 𝒫(X), X的幂集;
  2. {,X};
  3. {AX|A有限或者XA有限}.
注意到真值的代数𝔹 (暂时忘却) 同构于ii.
定理2.3.9. 每个布尔代数同构于一个集合域.
定义2.3.10. 布尔代数=B,,,,0,1中的一个赋值是任意的从命题变量PVB的映射v. 一个公式φ相对于赋值v (在中) 的值由归纳定义.pv=v(p), 对于pPV;v=0;φψv=φvψv;φψv=φvψv;φψv=φvψv.φv=1时, 记,vφ. 若对于所有的v,vφ, 记φ.

显然, 这种布尔代数语义是通常二值语义的一种泛化. 的确, 一个公式φ是一个古典重言当且仅当𝔹φ. 实际上, 这种泛化不是本质性的.

定理2.3.11. 一个命题公式φ是一个古典重言当且仅当对于所有的布尔代数φ.
证明. 自右向左是即得的. 为了证明另一个方向, 我们假设对于某个φ. 根据Stone表示定理我们不妨设是某个X上的一个集合域.
既然φ, 那么存在某个中的赋值v满足φvX. 因此, 存在xX满足xφv. 定义一个二元赋值w (即𝔹中的一个赋值) 满足w(p)=1当且仅当xpv. 根据归纳, 可以证明对于所有的公式ψ:ψw=1当且仅当xψv.那么, φw1.

第2.4节 Heyting代数

现在我们将建立直觉主义命题逻辑的一种语义. 出于这样的目的我们检视了公式相对于可证明性的代数性质. 我们首先观察到可证明的推论表现得几乎就像一个公式上的序关系, 即它是自反的和传递的. 更确切地说, 对于每个Γ我们有:

然而, 这个关系并不是反对称的. 但是, 我们可以通过将等价的公式视为等同的来将其转化为一个偏序关系. 为了使之精确, 我们令Γ是一个固定的命题公式集合 (特别地, Γ可以为空). 我们按照以下方式定义一个关系Γ:φΓψ当且仅当ΓφψΓψφ.不难看出Γ是所有公式构成的集合Φ上的一个等价关系, 并且有 (我们省略Γ中的下标Γ):[]={φ|Γ¬φ}[]={φ|Γφ}.

第2.5节 Kripke语义

定义2.5.1. 一个Kripke模型是一个具有形式𝒞=C,,的三元组, 其中C是一个非空集合, 它的元素被称为状态或者可能世界, 是一个C中的偏序, 而C的元素和命题变量之间的一个二元关系. 关系 (读作"力迫") 必须满足以下单调性条件.如果cccp那么cp.直觉在于模型的元素代表了知识的状态. 关系与通过获得更多知识来扩展状态有关. 关系决定了在一个给定的状态下哪些命题变量被认为是真的. 以下, 我们延拓这个关系来为命题公式提供含义.
定义2.5.2. 如果𝒞=C,,是一个Kripke模型, 那么注意到上述定义推出了以下否定的法则:记号可以按照多种方式被运用. 有时我们记𝒞,cφ以明确使用了哪个模型. 当对于所有的cCcφ时, 我们记𝒞φ. 记号cΓ的意思是对于所有的φΓcφ, 对于记号𝒞Γ也是类似的. 最后, 若对于每个Kripke模型𝒞和每个𝒞的状态c, 条件𝒞,cΓ能够推出𝒞,cφ, 那么记Γφ.
引理2.5.3. 如果cccφ那么cφ.
例子2.5.4.C={c,c,c}, 其中cccc是不可比较的. 一个Kripke模型𝒞=C,,, 其中

第2.6节 推论片段

第2.7节 注记

数学中的构造主义深深地根植于19世纪, 甚至是更加遥远的过去. 例如, 直觉主义者他们自己也承认受到Immanuel Kant (1724-1804) 的哲学的启发. 根据Kant, 数学认知的领域诸如时间和空间可直达人类的直觉而并非经验上所"观察"到的. 因此, 数学可被视为纯粹的心灵上的构造.

Leopold Kronecker (1823-1891) 通常被引为第一个显式将构造主义的想法应用于数学的作者. 根据Kronecker, 一个数字的正确定义, 可在有限步骤之内被验证. 而一个存在性陈述的证明, 应该提供一个能够见证这个陈述的显式对象.

为了寻找数学的坚实基础, 许多其他人也加入了Kronecker. 19世纪下半叶, 数学正发生着相当重要的改变. 随着新分支的发展, 包括数理逻辑, 数学研究的主题变得愈发抽象而与现实经验无关. 数学家的活动从探索"真实"世界的性质转移到了创造一个抽象世界. 这引发了关于数学基础的重要问题. 随着悖论的发现, 特别是Russell发现的知名悖论, 这些问题变得紧急起来.

第2.8节 练习

第3章 简单类型λ演算

在逻辑学中, 判断一个公式相对于某个特定的语义是否有效 (valid) 总是核心议题. 或者, 更一般地, 一集假设是否在所有模型中都蕴涵一个公式. 在古典逻辑的"语义传统"之中, 这种问题总是最重要的主题, 而可靠 (sound) 且完备 (complete) 的证明系统的构造主要被视为判断有效性的工具. 在这种情况下, 公式和判断的可证明性是和证明相关的问题之中唯一令人感兴趣的. 人们会问证明是否存在, 但是不必问是哪一个证明.

在证明论中, 视角变得有所不同. 我们想要研究证明的结构, 比较各种证明, 从中选出一些, 以与其他的证明进行区分. 这对于构造性逻辑而言是尤为重要的, 其中证明 (构造) 而不是语义是最终的标准.

因此, 寻求一种简便的证明记号是非常自然的. 例如, 我们可以用M:φ来表示Mφ的一个证明. 若有额外假设Γ, 那么我们或许可以扩展这个记号为ΓM:φ现在, 如果MN分别是φψφ的证明, 那么由(E)得到的ψ的证明可以表示为@(M,N):ψ, 或者就简单地记作MN:ψ. 这给出了一种"带注解的"(E)规则ΓM:φψΓN:φΓMN:ψ当试着为(Ax)设计一种带注解的版本时, 读者或许会发现给假设命名也是很方便的事情, 例如x:φ,y:ψx:φ代表使用第一个假设. 这个想法在我们想要注解(I)规则时也派得上用场, 那么discharge一个证明M中的假设x可以被记成诸如x.M, ξx.M, ... 我们为什么不试试lambda呢?Γ,x:φM:ψΓλx.M:φψ是的, 我们得到的就是lambda记号. 用一位著名作家的话来说, 虽然是在完全不同的上下文中, 那就是相似并非刻意也并非偶然, 而是不可避免的. 的确, 一个推论的一个证明代表了一个构造, 而根据BHK解释, 一个推论的一个构造是一个函数.

然而, 不是每个lambda项都可以被用作证明的记号. 例如, 自应用xx似乎并不代表任何命题的证明, 不论由x注解的假设为何. 所以, 在我们探索证明和项的类似之处 (第4章的事情) 之前, 我们必须寻找合适的lambda演算的子系统.

正如我们所说, BHK解释将推论的构造和函数视为等同的. 在数学中, 一个函数f总是定义在一个特定的定义域 (domain) A上, 而值落在一个陪域 (codomain) B中. 这被记作f:AB. 类似地, 一个公式φψ的一个构造也只能被应用于指定的参数上来, 也就是前提 (premise) 的构造. 那么, 其结果是结论 (conclusion) 的构造, 它当然也只能具有特定的类型.

在lambda演算中, 我们可以引入类型来描述项的函数行为. 一个应用MN只有当M具有形式为στ的函数类型而N具有类型σ时才是可能的. 其结果具有类型τ. 这是一种相当类似于严格定型的编程语言所具有的类型原则.

几乎从一开始表达项的函数性的类型赋予的概念就被纳入了组合子逻辑和lambda演算之中, 自那时起各种类型化演算就得到了全面的研究. 本章我们将引入对于类型概念最基本的形式化: 系统λ.

第3.1节 Curry风格的简单类型λ演算

我们从Curry风格的简单类型λ演算开始, 其中我们处理和第1章相同的通常的lambda项.

定义3.1.1.
  1. 一个推论命题公式被称为一个简单类型. 所有简单类型构成的集合记作Φ.
  2. 一个环境是具有形式{x1:τ1,,xn:τn}的一个有限的序对集合, 其中xi是不同的λ变量, τi是类型. 也就是说, 环境是从变量到类型的有限的部分函数. 因此, 如果(x:τ)Γ, 我们也可以将其写成Γ(x)=τ. 我们也定义:dom(Γ)={xΥ|(x:τ)Γ, 对于某个τ}rg(Γ)={τΦ|(x:τ)Γ, 对于某个x}.

在其他文献中, 考虑简单类型lambda演算的一种变体是相当常见的, 其中所有的类型都从唯一的一个类型变量构造而来 (因而其被称为类型常量). 这样一种lambda演算的计算性质类似于我们的λ. 但是, 从"逻辑"角度而言这种限制于一个类型常量的情况并不是同样有趣的, 参见练习4.10.

记号. ττσ被缩略为τnσ, 其中τ出现了n次. 环境{x1:τ1,,xn:τn}经常被简记作x1:τ1,,xn:τn. 如果dom(Γ)dom(Γ)=, 那么我们也将ΓΓ记作Γ,Γ. 特别地, Γ,x:τ代表Γ{x:τ}, 其中假定xdom(Γ). 类似的约定也适用于之后的章节.
定义3.1.2. 一个判断由一个环境, 一个lambda项和一个类型构成, 记作ΓM:τ. 图3.1中的规则定义了系统λ的可推导的规则的概念. (读者必须记住规则(Var)(Abs)中变量x不在Γ的定义域之中.) 如果ΓM:τ是可推导的, 那么我们称MΓ中具有类型τ, 记作ΓλM:τ或者就记成ΓM:τ (参考定义2.2.1).
(Var)Γ,x:τx:τ(Abs)Γ,x:σM:τΓ(λx.M):στ(App)ΓM:στΓN:σΓ(MN):τ
图3.1: 简单类型lambda演算λ
例子3.1.3.σ,τ,ρ是任意的类型, 那么:
  1. I:σσ;
  2. K:στσ;
  3. S:(στρ)(στ)σρ.

一个形式为M:τσ的类型赋予当然可以被解释为"M是一个以τ为定义域σ为陪域的函数". 但是我们必须明白这里对于"定义域"和"陪域"的理解不是集合论性质的. 在Curry风格的类型化演算中, 类型被更适切地描述为(由项满足的)谓词或者规格 (specification) 而不是集合论性质的函数空间. 在集合论中f:AB的含义为f的参数恰是A的元素, 而所有的值都必须属于B. 与之相对地, M:τσ仅意味着将M应用于一个类型为τ的参数必须产生一个类型为σ的结果.

引理3.1.4.
  1. 如果ΓM:τ, 那么FV(M)dom(Γ).
  2. 如果Γ,x:τM:σ并且ydom(Γ){x}, 那么Γ,y:τM[xy]:σ.
证明.
引理3.1.5. (Generation lemma).ΓM:τ.
  1. 如果M是一个变量x, 那么Γ(x)=τ.
  2. 如果M是一个应用PQ, 那么对于某个σ, ΓP:στΓQ:σ.
  3. 如果M是一个抽象λxN并且xdom(Γ), 那么τ=τ1τ2, 其中Γ,x:τ1N:τ2.
证明.
引理3.1.6.
  1. 如果ΓM:σ并且对于所有的xFV(M)Γ(x)=Γ(x), 那么ΓM:σ.
  2. 如果Γ,x:τM:σ并且ΓN:τ, 那么ΓM[xN]:σ.
证明. 我们对于M的大小进行归纳.
定理3.1.7. (Subject reduction). 如果ΓM:σ并且MβN, 那么ΓN:σ.
证明.
定义3.1.8. 将类型σ中的类型变量p替换为类型τ, 记作σ[pτ], 被定义为:p[pτ]=τ;q[pτ]=q, 如果qp;(σ1σ2)[pτ]=σ1[pτ]σ2[pτ].记号Γ[pτ]代表{(x:σ[pτ])|(x:τ)Γ}, 类似的记号还可应用于等式, 等式的集合, 诸如此类.
命题3.1.9. 如果ΓM:σ, 那么Γ[pτ]M:σ[pτ].

第3.2节 类型重构算法

一个项MΛ是可定型的, 如果存在Γσ满足ΓM:σ. 可定型项的集合是所有λ项的集合的一个真子集. 因此, 判断系统λ中到底哪些项可被赋予类型以及如何有效地找出这些类型成了根本性的问题. 实际上, 从对于三元谓词"ΓM:τ"的分析之中我们可以提出许多判定问题. 以下的定义对于每个能够导出具有这种形式的判断的类型赋予系统都是有意义的.

定义3.2.1.
  1. 类型检查问题指的是对于一个给定的环境Γ, 一个项M和一个类型τ, 判断ΓM:τ是否成立.
  2. 可定型问题, 又称类型重构问题, 指的是判断一个给定项M是否是可定型的.
  3. 类型居留问题, 又称类型是否为空问题, 指的是对于一个给定的类型τ, 判断是否存在一个封闭项M满足M:τ成立. (那么, 我们称τ是非空的, 并拥有居民M.)

类型居留问题将在第4章讨论, 本节我们先考虑可定型问题和类型检查问题. 第一眼看上去, 似乎判断一个给定项在一个给定环境之中是否拥有一个给定的类型可能要比判断它到底是否拥有类型来得容易. 然而, 这种印象一般而言是错误的. 对于许多类型赋予系统而言, 可定型问题很容易被规约为类型检查问题. 的确, 为了判断一个项M是否是可定型的, 其中FV(M)={x1,,xn}, 我们可以问是否有x0:pKx0(λx1xn.M):p而这就将可定型问题化为了类型检查问题. 实际上, 在简单类型的情况下, 这两者是等价的 (练习3.11), 尽管将后一个问题规约为前一个问题就不那么简单了. 但是, 对于某些类型赋予系统, 这两个问题并非等价: 比较一下命题13.4.3和定理13.4.4.

现在我们展示可定型问题是如何能够被规约为仅包含二元函数符号的签名上的合一 (unification) 的. 这个签名上的项被视为与简单类型是等同的. 对于每个项M我们根据归纳定义

想法如下: EM有解当且仅当M是可定型的, 而τMM的 (非形式化的) 类型的模式. 出现在EM中的类型变量 (未知元) 分为两种: 其中一些对应于M的自由变量x的类型, 记作px, 而其他变量是辅助性的.

定义3.2.2.
  1. 如果M是一个变量x, 那么EM=τM=px, 其中px是一个新鲜 (fresh) 的类型变量.
  2. M是一个应用PQ. 首先,

第3.3节 Church风格的简单类型λ演算

定义3.3.5.
(Var)Γ,x:τx:τ(Abs)Γ,x:σM:τΓ(λx:σ.M):στ(App)ΓM:στΓN:σΓ(MN):τ
图3.2: Church风格的简单类型lambda演算

第3.4节 Church定型 vs Curry定型

第3.5节 正规化

第3.6节 Church-Rosser性质

第3.7节 可表达性

第3.8节 注记

类型经常被视为一种避免无类型世界中因各种各样的自应用而产生的悖论的方法. 无疑, 悖论给予了20世纪之初创造各种类型理论的动力. 然而, 正如[11, 12]所指出的那样, 在数学中将对象划分为不同的范畴或者"类型"是自然的, 并且远在这些悖论被发现之前.

形式类型论的历史起源于Russell. Chwistek, Ramsey, Hilbert等其他人的工作对于该主题的建立做出了贡献. 对于简单类型论的一份有影响力的呈现由1940年Church的论文[13]给出. 为此Church引入了简单类型lambda演算, 其为他的类型论的核心语言.

组合子逻辑的类型化版本在数年之前由Curry提出, 在1934年的论文[14]中, 尽管Curry肯定在1928年就已经有想法了, 见[20, 21]. Curry完整的"theory of functionality"后来被证明是不一致的[15]但是随即就由[16]修正. 很快类型就成为组合子理论和lambda演算中的标准概念.

之后类型被证明在编程语言中很有用. 就像无类型的λ演算为无类型的编程语言提供了基础, 各种类型化的λ演算为带有类型的编程语言提供了基础. 实际上, 诸如ML [23]等语言的设计启发了类型检查问题和可定型问题的研究. 然而, 正如[22, pp. 103-104]所指出的那样, 类型重构算法的主要想法可以追溯至1920年代.

第3.9节 练习

第4章 Curry-Howard同构

既已在第2章讨论了直觉主义逻辑, 在第3章讨论了带类型的lambda演算, 现在开始我们将关注这二者之间的关系, 也就是Curry-Howard同构.

第4.1节 证明和项

第4.2节 类型居留

第4.3节 并非确切的同构

第4.4节 证明正规化

第4.5节 和与积

第4.6节 证明者怀疑者对话

回忆一下第2章的BHK解释. 我们可以将一个公式的构造的建立过程想象成一个证明者和一个怀疑者之间的对话, 证明者产生构造, 而怀疑者质疑构造是否存在.

证明者1: 我断言((pp)(qrq)s)s成立.
怀疑者1: 真的吗? 让我们假设我给了你一个(pp)(qrq)s的构造, 那么你能给我一个s的构造吗?
证明者2: 通过将你的构造应用于pp的一个构造, 然后再将结果应用于qrq的一个构造, 我就能得到你想要的东西.
怀疑者2: 嗯...你做出了两个新的断言. 我最怀疑第一个. 你确定你有pp的一个构造吗? 假设我给你一个p的构造, 你能回我一个p的构造吗?
证明者3: 用相同的构造就可以了!

对话自证明者作出断言开始.

第4.7节 带有谬的证明者怀疑者对话

第4.8节 注记

第4.9节 练习

第5章 证明作为组合子

之前的章节中我们重点关注了自然演绎证明和λ项之间的Curry-Howard同构. 正如我们所看到的, 这个同构联系起了两个世界的许多概念. 本章我们呈现一个相关的另外两种基础概念之间的对应, 即Hilbert风格的证明和组合子逻辑的项.

第5.1节 Hilbert风格的证明

自然演绎在历史上并非形式化证明概念的第一种方式, 它也不是得到最广泛使用的一种. 许多数理逻辑的古典呈现, 例如[], 使用了更传统的Hilbert风格的证明的概念. 通常一个Hilbert风格的证明系统由一集公式 (被称为逻辑公理) 和寥寥几条证明规则构成. 而且, Hilbert风格的证明系统中的形式证明在传统上被定义为公式的序列, 而不是树结构的推导.

本章我们考虑的系统, 正如其他大部分命题逻辑的系统, 仅包含一条证明规则, 其被称为modus ponens或者分离规则:φφψψ因此, 一个Hilbert风格的证明系统可以被视为与其逻辑公理的集合等同. 以下的定义适用于所有这样的命题系统.

定义5.1.1. 一个公式φ的一个证明序列 (或者说一个Hilbert风格的证明) 是一个公式的有限序列ψ1,ψ2,,ψn满足ψn=φ, 并且对于所有的i=1,,n,如果存在这样一个证明, 那么公式φ就被称为一个定理.
定义5.1.2.
定义5.1.5.
(Id)Γ,φφ(Ax)Γφ, 如果φ是一条逻辑公理(MP)Γ1αΓ2αβΓ1,Γ2β
图5.1: Hilbert风格系统的树变体

第5.2节 组合子逻辑

Hilbert风格的Curry-Howard等价物该是什么呢?

定义5.2.1. 组合子项的集合𝒞定义如下:

第5.3节 带类型的组合子

第5.4节 组合子 vs lambda项

第5.5节 外延性

第5.6节

第5.7节

第5.8节

第6章 古典逻辑和控制运算符

在之前的章节中, 我们已经遇到了化身为各种面目的Curry-Howard同构. 每一种都陈述了某个计算性演算和一个形式逻辑系统之间的对应. 到目前为止, 这些形式逻辑系统都是直觉主义的. 例如, 没有一个能够推导在古典的逻辑中可以看到的双重否定消去原理¬¬φφ.
这并非巧合. 事实上, 到大约1990年为止, 许多人相信"并不存在古典逻辑的Curry-Howard同构". 然而, 那个时候Timothy Griffin发现了双重否定消除原理对应于编程语言理论中众所周知的一个控制运算符的定型. 很快这个想法就经由Chet Murthy得到了推广和完善.
本章呈现了这个发现以及它的一些推论, 例如Kolmogorov从古典逻辑到直觉主义逻辑的双重否定嵌入对应于延续传递风格转换.

第6.1节 古典命题逻辑

Γ,φφ(Ax)Γ,φψΓφψ(I)ΓφψΓφΓψ(E)Γ,φΓφ(¬E)
图6.1: 古典命题演算
例子6.1.2.
  1. 以下是公式(φψ)(¬φψ)ψ ("分类讨论证明") 的一个推导, 令Γ={φψ,¬φψ,¬ψ}.Γ¬ψΓ¬φψΓ,φ¬ψΓ,φφψΓ,φφΓ,φψΓ,φΓ¬φΓψΓφψ,¬φψψφψ(¬φψ)ψ(φψ)(¬φψ)ψ
  2. 以下是Peirce律的推导, 令Γ={(φψ)φ}.Γ,¬φ¬φΓ,¬φ(φψ)φΓ,¬φ,φ,¬ψ¬φΓ,¬φ,φ,¬ψφΓ,¬φ,φ,¬ψΓ,¬φ,φψΓ,¬φφψΓ,¬φφΓ,¬φΓφ((φψ)φ)φ

第6.2节 λμ演算

第6.3节

第6.4节 逻辑嵌入和CPS转换

在直觉主义逻辑之中解释古典逻辑, 被称为逻辑嵌入, 自1920年代已被研究. 本节我们研究这样一个嵌入, 其被称为Kolmogorov双重否定转换, 它有一个有趣的计算性解释.

定义6.4.1. (Kolmogorov转换). 按如下方式定义一个转换, 其中α遍历原子命题:k(α)=¬¬αk(φψ)=¬¬(k(φ)k(ψ))而且, k(Γ)={k(φ)|φΓ}.

第6.5节 古典证明者怀疑者对话

第6.6节 纯推论片段

第6.7节 合取与析取

第6.8节 注记

第6.9节 练习

第7章 相继式演算

第7.1节 Gentzen的相继式演算LK

第7.2节 LK的片段 vs 自然演绎

第7.3节 Gentzen的Hauptsatz

第7.4节 切消 vs 正规化

第7.5节 Lorenzen对话

第7.6节 注记

第7.7节 练习

第8章 一阶逻辑

第8.1节 一阶逻辑的句法

第8.2节 非形式化的语义

第8.3节 证明系统

第8.4节 古典语义

第8.5节 直觉主义逻辑的代数语义

第8.6节 Kripke语义

第8.7节 lambda演算

第8.8节 不可判定性

第8.9节 注记

第8.10节 练习

第9章 一阶算术

第9.1节 算术的语言

第9.2节 Peano算术

第9.3节 Gödel的定理

第9.4节

第9.5节 Heyting算术

第9.6节 Kleene的可实现性解释

第9.7节 注记

第9.8节 练习

第10章 Gödel的系统T

第10.1节 从Heyting算术到系统T

第10.2节 句法

第10.3节

第10.4节

第10.5节

第10.6节

第11章 二阶逻辑和多态

第12章 二阶算术

第13章 依赖类型

第14章 纯类型系统和λ立方

附录A 数学背景

第A.1节 集合论

第A.2节 代数与合一

一个签名是一族函数与关系符号, 其中每个都拥有固定的元数 (可能为零). 零元符号被称为常量. 若不加另外说明, 签名则被认为是有限的.

假定有一个固定的独立变量的无限集合{a0,a1,}. 一个签名Σ上的一个代数项 (或者就称为项) 要么是一个独立变量, 要么是具有形式(ft1tn)的表达式, 其中f是一个n元函数符号, 而t1,,tn是项. 当书写项的时候, 我们经常省略最外面的括号. 符号FV(t)代表了所有出现在项t中的独立变量的集合. 项t是封闭的当且仅当FV(t)=.

一个代数项的形式定义牵扯函数符号的前缀应用. 当然, 从传统上来说一些二元函数符号是以中缀风格书写的, 正常情况下我们就这么做. 我们最喜爱的签名仅包含(中缀)箭头作为唯一的符号. 不难看出这个签名上的代数项可以被视为与简单类型等同, 或者你喜欢的话也可以说是与推论公式等同.

本节我们仅考虑代数签名, 即不包含关系符号的签名. 这样一个签名Σ={f1,,fn} (其中fi的元数是ri) 上的一个代数是一个集合A以及函数fiA:AriA, 即一个系统𝒜=A,f1A,,fnA.

第A.3节 部分递归函数

附录B 部分练习的解答和提示

参考文献

[1] M. Abadi, L. Cardelli, P.-L. Curien, and J.-J. Levy. Explicit substitutions. Journal of Functional Programming, 1(4):375-416, 1991.
[2] A. Abel and T. Altenkirch. A predicative strong normalisation proof for a λ-calculus with interleaving inductive types. In T. Coquand, P. Dybjer, B. Nordström, and J. Smith, editors, Types for Proofs and Programs, International Workshop TYPES'99, volume 1956 of Lecture Notes in Computer Science, pages 21-40. Springer-Verlag, 2000.
[3] H. Abelson and G.J. Sussman with J. Sussman. The Structure and Interpretation of Computer Programs. MIT Press, second edition, 1996.
[4] S. Abramsky. Computational interpretations of linear logic. Theoretical Computer Science, lll(l-2):3-57, 1993.
[5] S. Abramsky and R. Jagadeesan. Games and full completeness for multiplicative linear logic. Journal of Symbolic Logic, 59(2):543-574, 1994.
[6] Z. Adamowicz and P. Zbierski. Logic of Mathematics. A Modern Course of Classical Logic. John Wiley & Sons, 1997.
[7] A. Appel. Compiling with Continuations. Cambridge University Press, 1992.
[8] H. Barendregt and T. Nipkow, editors. Types for Proofs and Programs, International Workshop TYPES'93, volume 806 of Lecture Notes in Computer Science. Springer-Verlag, 1994.
[9] A. Church. A set of postulates for the foundation of logic. Annals of Mathematics, 33(2):346-366, 1932.
[10] A. Church. A set of postulates for the foundation of logic. (Second paper.) Annals of Mathematics, 34(4):839-864, 1933.
[11] R.O. Gandy. The simple theory of types. In R.O. Gandy and J.M.E. Hyland, editors, Logic Colloquium 76, volume 87 of Studies in Logic and the Foundations of Mathematics, pages 173-181. North-Holland, 1977.
[12] F. Kamareddine, T. Laan, and R. Nederpelt. Types in logic and mathematics before 1940. Bulletin of Symbolic Logic, 8(2):185-245, 2002.
[13] A. Church. A formulation of the simple theory of types. Journal of Symbolic Logic, 5(2):56-68, 1940.
[14] H.B. Curry. Functionality in combinatory logic. Proceedings of the National Academy of Science USA, 20(ll):584-590, 1934.
[15] H.B. Curry. The inconsistency of the full theory of combinatory functionality. Journal of Symbolic Logic, 20(1):91, 1955.
[16] H.B. Curry. Consistency of the theory of functionality. Journal of Symbolic Logic, 21(1):110, 1956.
[17] P. Graham. ANSI Common Lisp. Prentice-Hall, 1995.
[18] F. Pfenning and C. Elliot. Higher-order abstract syntax. In Programming Language Design and Implementation, pages 199-208. ACM Press, 1988.
[19] A. Pitts. Nominal logic: A first order theory of names and binding. Information and Computation, 186(2):165-193, 2003.
[20] J.P. Seldin. Curry's anticipation of the types used in programming languages. In Proceedings of the Annual Meeting of the Canadian Society for History and Philosophy of Mathematics, Toronto, 24-26 May 2002, pages 148-163, 2003.
[21] J.P. Seldin. Church and Curry: The lambda calculus and combinatory logic. In Gabbay and Woods [159]. To appear.
[22] J.R. Hindley. Basic Simple Type Theory, volume 42 of Cambridge Tracts in Theoretical Computer Science. Cambridge University Press, 1997.
[23] L.C. Paulson. ML for the Working Programmer. Cambridge University Press, second edition, 1996.
[24] R. Pollack. Closure under alpha-conversion. In Barendregt and Nipkow [8], pages 313-332.