第 13 课导言
介绍逻辑编程(声明式编程)这一全新范式的基本思想。
导言
本周的大主题是逻辑编程(logic programming),也叫声明式编程(declarative programming)。
这是我们迄今为止在摆脱”用硬件术语表达计算”方面迈出的最大一步。当初发现流(stream)时,我们看到了一种与求值顺序无关的算法表达方式。而现在,我们要描述的计算,将完全没有任何(可见的)算法!
我们使用的逻辑编程语言是 Abelson 和 Sussman 用 Scheme 实现的。正因如此,它的记号是 Scheme 风格的,即充满了列表。像 Prolog 这样的标准逻辑语言使用不同的记号,但思想是相通的。
先修内容
本课采用了一种与你此前所见完全不同的范式。因此,本课没有任何先修内容!
阅读材料
本课的大部分内容取自这些讲义和 SICP 4.4.1-4.4.3 节。
逻辑编程
逻辑编程非常擅长为信息检索提供数据库(database)接口。本章使用的查询(query)语言正是为此而设计的。
我们所要做的只是断言(assert)事实(fact):
> (load "~cs61as/lib/query.scm")
> (query)
;;; Query input:
(assert! (Brian likes potstickers))
然后就这些事实提问:
;;; Query input:
(?who likes potstickers)
;;; Query results:
(BRIAN LIKES POTSTICKERS)
虽然断言和查询都采用表的形式,看起来有点像 Scheme 程序,但它们并不是!这里不存在把函数应用于实参的操作;断言只是数据。
即使出于各种原因,传统上习惯把动词(即关系)放在最前面,上面这一点也依然成立:
(assert! (likes Brian potstickers))
今后我们将沿用这一惯例,但这反而更容易让人误以为存在一个名为 likes 的函数。请继续阅读,了解如何用这门奇特的语言编程!