指称语义学: 编程语言理论的Scott-Strachey方法

本书或许是我人生中接触到的第一本严肃编程语言教科书. 那时我还在读SICP, 已经是2019年的事情了. 虽然我当时迫切想要阅读这本书, 但是完全读不明白, 缺乏动机. 或许现在才是学习这本书籍的好时机, 毕竟和那时比起来, 我已经学了点格论和指称语义了. 这也不是我第一次尝试翻译这本书, 不过先前都浅尝辄止了.

前言 (Dana S. Scott所写)

对于Christopher Strachey和其工作致敬

我们都希望Christopher能够为本书写下这些引言. 他于1975年5月在58岁时英年早逝, 在其亲人, 同事, 学生以及诸多(学术和非学术的)朋友的生活之中留下了永恒的缺憾. 在他于牛津工作的十年间, 自1971年起他拥有个人讲席, 他所在的领域经历了显著的增长和变化, 很大程度上这要归功于他个人的许多原创性想法和他对于别人工作的影响. 出于对于他的工作的认可, 英国计算机协会于1972年授予他成为首批杰出会士之一. {译注: 首批实际上只有两个人, 另外一个是Dijkstra.}

然而, Strachey自己的发表是不多的, 尽管这并不总是他的问题.

不论如何, 就我个人而言, Strachey他自己能否写出令人满意的开篇文字也是值得怀疑的. 他的讲课风格时而简洁明快, 时而杂乱无章; 有时晦涩难懂, 有时妙趣横生; 既令人愉悦, 又令人抓狂; 带着讽刺意味, 而且始终高度即兴, 但 (对于那些愿意倾听的人们而言) 一直具有强烈的启发性. 他所能做的, 并且的确在一些场合是这么做的, 是产生一些更短的碎片, 这些碎片极其清晰, 提出了什么是基本的想法和重要的问题, 因为他的独特经历赋予了他特殊的洞察力.

第1章 引论

第1.1节 引用透明性

第1.2节 形式语义的目的

第1.3节 句法和语义

第2章 指称语义

第2.1节 形式语义的方法

第2.1.1小节 操作性方法

第2.1.2小节 指称性方法

第2.1.3小节 公理性方法

第2.2节 两种方法的例子

第2.3节 操作性方法的评注

第2.4节 公理性方法的评注

第2.5节 我们的方法的评注

第3章 二进制数码

第3.1节 句法

第3.2节 语义

第3.3节 数码 vs. 数字

第3.4节 良好记号的价值

第3.5节 实现的问题: 加法

第4章 第一级函数

第4.1节 第一级对象和第二级对象

第4.2节 例子: Curry化了的函数

第4.3节 实现

第4.4节 函数, 算法和近似

第5章 λ演算

第5.1节 λ演算

第5.2节 递归定义

第6章 格与domain

前一章末的讨论已经指出若要使得我们对于λ演算的语义理论的搜索成功, 那么我们必须找到方法来限制我们所能够考虑的函数类. 否则的话, 函数就会太多, 以至于我们无法找到任何带有同构函数空间的非平凡空间.

逻辑学家的通常解法是压根不与函数打交道, 转而与函数的表示打交道. 简而言之, 他们取Gödel配数. 他们通常处理整数上的函数, 在这种情况下Gödel配数的运算将可用有限长度算法表达的函数 (其构成了一个可数集) 映射为整数. 当他们想要考虑一个以另外一个函数B作为一个参数的函数A时, 那么他们可以形式化地给A提供B的Gödel配数.

这种方法在牵涉可判定性的论证中的使用是令人满意的. 这些论证通常具有以下形式: 设你声明你有一个可以判定停机问题的函数X; 那么我们可以找到另外一个函数W使得X不能成立.

第6.1节 近似序

我们不使用算法的Gödel配数, 转而采取另外一种方法, 其更关心函数 (或者说映射) 本身. 让我们试着通过检视我们的问题的另一方面 (多不动点问题) 来汲取一点灵感. 考虑递归定义:

f = λx. if x = 0 then 1
        else if x = 1 then f(3)
        else f(x-2)
我们看出我们是在寻找
λf.λx. if x = 0 then 1
       else if x = 1 then f(3)
       else f(x-2)
的一个不动点. 我们对于利用递归函数进行计算的实际经验或许会将我们引向以下的解f(x)={1,x为偶数undefined,x为奇数但是另外一个解为f1(x)=1, 对于所有的x而且以下也是解fa(x)={1,x为偶数a,x为奇数其中a是一个任意的常量. 为什么f是一个计算机实现实际会提供的函数呢?

答案在于其他的解都包含任意的信息 (即a的值), 这是我们不希望实现所决定的.

第6.2节 偏序集

第6.3节 完备格

第6.4节 格上的函数

第6.5节 一个不动点算子

第7章 自反domain

第8章 λ演算的形式语义

第9章 一个简单的流程图语言

第10章 环境和其他扩展

第11章 跳跃和延续

第12章 赋值和存储