在 1993 年 ACM 举办的“编程语言历史”第二次会议上,Prolog 编程语言设计者 Alain Colmerauer (1941-2017)作的讲座。摘要如下,第一人称为 Alain 自称,个人一点感想在最后。

【幻灯片1】本来要和 Philippe Roussel 一起但他来不了。主要聊聊 Prolog 语言诞生的环境,而不是语言本身。与其他编程语言不同,没有任何机构决定创造Prolog。它是作为自然语言处理工具,被自发创造的。

【片2】在Grenoble博士毕业后,到 Montreal大学作为助理教授参与了一个自动翻译项目(1970)。在项目框架内,我开发了“Q系统”(1970),结果成为了 Prolog的前身。“Q”取自Quebec。70年代末,回到法国在马赛(Marseilles)任教授。在那碰到了 Philippe 一同开发一个具备逻辑推理的自然语言交流系统。

在初具雏形(1971)后,开发了一个更复杂的(1972),为此设计实现了 Prolog 的雏形,我叫它“Prolog 0”(1972)。之后开发了完全版本,称为“Prolog 1”(1973)。此版本流传甚广。下面将详述此过程,最后是Prolog诞生中直接和间接的贡献者们。

【片4-12】从英文到法文的自动翻译项目。通过 Q系统,借助词性等将英文句子解析为树结构,切分、转换后生成法文句子。

片4 为英文句子:

THE EXPANSION OF GOVERNMENT ACTIVITIES IN CANADA AS IN MANY OTHER COUNTRIES IS NOT SOMETHING NEW.

片12 为处理后的法文:

-1- + ‘ + EXPANSION + DES + ACTIVITES + COUVERNEMENTALES + AU + CANADA +COMME + DANS + PLUSIEURS + AUTRES + PAYS + n + ‘ + EST + PAS + QUELQUE + CHOSE + DE + NOUVEAU + .-2-

【片 13-17】介绍一下Q系统。本质上是重写规则的集合。对比如 A + A + B + B + C + C 的输入,应用一系列重写规则如:

A + B + C -> S
A + S + X + C -> S
X + C -> C + X
B + B -> B + X

可以生成一个图。基于此机制实现了一个高效的自底向上的分析器(parser)。

片17 是 1978 年仍在用的Q系统对天气报告的英翻法结果:

CLOUDY WITH A CHANCE OF SHOWERS TODAY AND THURSDAY

NUAGEUX AVEC POSSIBILITED AVERSES AUJOURD HUI ET JEUDI

【片 18】在Montreal大学,我周围是一大组语言学家,花了很多精力在促成与计算机科学家的合作上。当时,我着力在自然语言的句法(syntactical)方面多于语义(semantical)方面。我的英文水平直至今日都不足以分析英文句法,因此当时我想从自动翻译转向对法文句子的信息处理上。

就在去往马赛之前,我听说了 Alan Robinson关于自动定理证明(automatic theorem proving)的论文“Resolution Principle”。很赞,感觉可以设计一个能“理解”法语声明和问题、逻辑推理并回答的系统。我和加拿大博士生 Jean Trudel在1971年冬天到了马赛。Jean和Phillippe开始参考Robinson 编写各种定理证明器。Jean一直试图对小故事进行推理而不是数学定理。

【片 19-20】他定义了关于子集的公理(axiom)比如自反性(reflexivity)和传递性(transitivity)等。举例:如果所有男生爱女生,那么如果取一个男生和一个女生,那么他会爱她。

原理虽很简易,但自然语言中有复数表达集合等问题。添加交换律(communitivity)也生成了很多冗余的推理,因此作了每个子集只能是单体(singleton)才允许交换的限制。

【片 21-24】用了4个公理、一个定理证明器、50条Q系统规则将句子翻译为逻辑声明、17条Q系统规则反向翻译,我们实现了下面的问答(>开头为计算机回复):

猫吃鼠。
汤姆是猫,不喜欢吃奶酪的鼠。
杰瑞是吃奶酪的鼠。
麦克斯不是鼠。
汤姆会做啥?
> 汤姆不喜欢吃奶酪的鼠。
> 汤姆吃鼠。
谁是猫?
> 汤姆。
杰瑞吃啥?
> 奶酪。
谁不喜欢吃奶酪的鼠?
> 汤姆。
汤姆吃啥?
> 不喜欢吃奶酪的鼠的猫吃的东西。(WHAT CATS WHO DO NOT LIKE MICE WHO EAT CHEESE EAT)

【片 25】我们觉得定理证明器不仅可以用于逻辑推理,也可用于分析和生成句子。在此花了很多时间。

【片 26】记得1971年夏我发现了用逻辑声明编写上下文无关分析器(context-free parser)的诀窍,就是现在说的“difference lists”。在此之后,我决定用逻辑声明编写所有程序,并用一种定理证明器执行声明。为此编写了特殊的定理证明器 Prolog 0。第一个应用就很大,各种子句(clauses)数量:

  • 164个用于解析词句,如 every is a he in(encode pronouns, articles, and prepositions)
  • 104个用于连接单复数
  • 334 用于巨大的法文句子分析器
  • 162 用于推导(deductive)和回答

【片 28-29】演示:

每个精神病医生(psychiatrist)都是人。
他分析的每个人都生病了。
*Jacques 是 *Marseille 的一个精神病医生。
*Jacques 是人吗?
*Jacques 在哪?
*Jacques 生病了吗?

> 是的。
> 在 *Marseille。
> 不知道。

【片 30】这套系统是 1972年用 Prolog 0编写的。

【片 31-33】一些 Prolog 0的特点比如星号,以及与后续版本的区别。

【片 34】我们决定做一个完整的编程语言,就是 Prolog 1,与现在的版本很接近。

【片 35】一些对0版的改进,包括元调用(metacall)——文本(literal)之外还可用变量,因为很大一部分Prolog系统是用Prolog本身编写的。

【片 36】1973 年 David Warren 来访,于是有了这句关于性能的话:

The present system is implemented partly in Fortran, partly in Prolog itself and, running on an IBM 360-67, achieves roughly 200 unifications per second.”

事实上有个更早的Prolog 1版本运行于 Sigma 7,在法国由BULL销售,但用了另一个名字。

【片 37】“1974-1975 Prolog的分发”。解释器是用Fortran编写的,这使得语言广为流传。很多来访者拷贝了走,各自用于自然语言处理之外不同的领域。

【片 38】第一个应用是 David Warren编写的计划生成系统。Marc Bergman 和 Henry Kanoui开始写符号计算系统(symbolic computation system)。接着Henri Meloni开始用prolog 写语音识别系统。

【片 39】同时Prolog传到了布达佩斯、华沙大学、多伦多、滑铁卢大学、爱丁堡大学、蒙特利尔大学、巴黎的INRIA。我后来听说 David Warren带了份拷贝到斯坦福,从那儿 Koichi Furakawa带到了东京。在华盛顿邮报有新闻报道。

【片 40】影响了 Prolog 的人和论文。

虽然听着很怪,Noam Chomsky 对我的工作影响很大。写博士论文时,花了很长时间在上下文无关语法和分析上。当时他的神作“On certain formal properties of grammars, Information and Control, 1959”让我入了上下文无关语法的门。

【片 41】而且我在蒙特利尔时,与我合作的语言学领域人士受“Aspects of the Theory of Syntax, MIT Press, 1965”一文影响很大。计算机科学家看这篇的话,就知道可以善用树和变换做很多事。我认为这是我们都在做的,Lisp、Prolog等,树真是好数据结构。

【片 42】另一位影响者不是语言学家而是计算机学家,Robert Floyd。他在我还是 Grenoble 上学时来访,印象深刻。我博士论文的出发点是他的“Syntactic analysis and operator precedence, J. ACM, 1963”。第二篇“Nondeterministic algorithms, J. ACM, 1967”发表前我就了解了相关工作,我才知道如何高效地实现 nondeterministic 语言、如何实现回溯、在stack保存信息等等。

【片 43】A. van Wijingaaden 在两方面影响了我。一是在学生时参加了不少设计 ALGOL 60语言的会议,我对人们从零开始创造语言印象深刻。很难想象原来可以拿张纸就设计个广泛使用的新语言。二是,W语法——我称呼他用于描述 ALGOL 68 的形式(formalism)对我影响巨大。实际上我为W语法生成的语言编写了完整的分析器。我还写了完整的生成器,用于Q系统之前的自动翻译工作。

【片 44】当然,Prolog的诞生离不开 Alan Robinson。我并未直接拿到他的论文“A machine-oriented logic based on the resolution principle. J. ACM, 1965”,而是 学生 Jean Trudel 给我看的。我看了但没看懂。当时完全没有研究过逻辑学。Jean 花了很长时间给我们解释。这是篇重要的论文。

【片 45】还有 Robert Kowalski。我们到马赛时,没研究过逻辑学,看了所有自动定理证明的论文。但我们不明白其所以然,于是请了自动定理证明的专家 Robert 来访,一拍即合,开始了紧密合作。他有一个很好的解法证明器(resolution prover),Prolog初版就仿自他“Linear resolution with selection function, Artificial Intelligence, 1972 (with D. Kuehner)”一文中的 SL-resolution 方法。

【片 46】下面是直接参与实现和隔壁房间讨论的人们。

【片 47】首先,我从蒙特利尔大学的 Rechard Kittredge 学了很多,他是 Zelleg Harris 的语言学博士。我想感谢 Jean Pierre Trudel (Hydro Quebec, Montreal) 因为他把 Robinsin的论文和我们的工作联系了起来。蒙特利尔大学的 Robert Pasero 一直参与 Prolog 的自然语言处理方面。

【片 48】下面是用Fortran真正实现了Prolog 1的三位:

Gerald Battani, Henri Meloni, Rene Bazzoli。

第一个 Prolog 解释器是他们的第一个 Fortran 程序!

我说完了。

后感

正如与会者 Jacques Cohen 指出的,在LISP和APL之外,Prolog是比较例外的不是由一个委员会设计的语言。

个人觉得它更特别的是,它的缘起是一些离“计算”更远一些的应用——自然语言翻译和交流系统。它的诞生是语言学、定理证明、逻辑学、计算机等多领域交流的结果。