本书采用一种创新的模型论进行逻辑编程,从数据集的基本概念(即闭原子集)开始。沿着这一基本概念,我们引入视图(即虚拟关系);我们将经典逻辑程序定义为视图定义集,使用传统的类似于Prolog的表示法编写,但语义是根据数据集而不是根据实现方式给出。然后介绍了一些闭原子操作,如添加和删除。
本书是关于逻辑编程的入门教科书,它主要适用于本科生,但也适合中学生和低年级研究生阅读。
本书假设学生已经理解集合和集合运算,比如并集、交集等。本书还假设学生熟悉符号运算,掌握高中代数或有更高水平。
如果读者有运用计算思维的经验,会对阅读本书有帮助,但这并不是阅读本书的条件。另外,编程经验也不是必需的。实际上,我们已经观察到,一些具有编程背景的学生刚开始阅读这本书的时候比没有编程经验的学生要困难得多。为了欣赏逻辑编程的力量和美感,他们似乎需要忘掉一些以前学过的知识。
本书采用的逻辑编程方法来自30多年来我们在学术和商业环境中的研究、应用和教学。这些经历很宝贵,使得本书在以下两个方面不同于其他书籍。
,本书采用模型理论的方法来阐述语义,而不用传统的证据理论方法。从数据集的基本概念(即基本原子集)开始,我们引入了视图定义的经典逻辑程序,这种程序使用传统的Prolog表示法编写,但根据数据集而不是实现给出语义。我们也会在稍后的演示中讨论实现。
第二,我们同时关注数据集的改变与逻辑代理的状态。在讨论了数据集之后,我们引入了更新的基本概念,即添加和删除基本原子。根据这个基本概念,我们引入动态逻辑程序作为动作定义集,其中动作被概念化为同步更新集。这个扩展允许我们讨论逻辑代理以及静态逻辑程序。(逻辑代理实际上是一个状态机,其中每个状态被建模为数据集,每条弧被建模为一组更新。)
本书有印刷版和在线版,还通过教学网站提供能自动评分的在线练习、编程作业、逻辑编程工具和各种示例程序。该网站免费开放,网址为http://logicprogramming.stanford.edu。
后,我们要感谢对本书的编写工作产生深远影响的两个人:Jeff Ullman 和 Bob Kowalski。Jeff Ullman是我们在斯坦福大学的同事,他编写的广受欢迎的教材启发了我们,并帮助我们认识到逻辑编程和数据库之间的深层关系。Bob Kowalski是逻辑编程的共同发明者,他倾听了我们的想法,为我们的工作提供帮助,甚至就本书的某些章节与我们进行了合作。
我们还想感谢Abhijeet Mohapatra。他是动态逻辑编程的共同发明者,也是本书中许多逻辑编程工具的共同创造者。他是这门课程的助教,为本书内容的呈现和组织提供了宝贵的建议。
后,我们要感谢那些不得不忍受本书早期版本的学生们,在许多情况下,他们通过经历并不总是成功的实验来帮助我们找到正确的方法。尽管犯了很多错误,他们似乎还是学会了书中的内容,他们很聪明。他们的耐心和建设性的意见对于帮助我们理解哪些东西是可取的尤为宝贵。
Michael Genesereth和Vinay K. Chaudhri
2019年12月
译者序
前言
部分 逻辑编程的介绍
第1章 概述3
1.1 逻辑编程3
1.2 逻辑程序作为可运行规范3
1.3 逻辑编程的优点4
1.4 逻辑编程的应用5
1.5 基本逻辑编程6
1.6 历史笔记7
第2章 数据集9
2.1 引言9
2.2 概念化9
2.3 数据集的定义10
2.4 示例女生联谊会12
2.5 示例亲属关系13
2.6 示例积木世界14
2.7 示例食物世界16
2.8 重组16
2.9 习题18
第二部分 查询的更新
第3章 查询23
3.1 引言23
3.2 查询语法24
3.3 查询语义25
3.4 安全性26
3.5 预定义概念27
3.6 示例亲属关系28
3.7 示例地图着色29
3.8 习题30
第4章 更新33
4.1 引言33
4.2 更新语法33
4.3 更新语义34
4.4 同步更新35
4.5 示例亲属关系36
4.6 示例颜色37
4.7 习题40
第5章 查询评估43
5.1 引言43
5.2 评估真值查询43
5.3 匹配44
5.4 用变量评估查询47
5.5 计算分析48
5.6 习题49
第6章 视图优化51
6.1 引言51
6.2 子目标排序51
6.3 子目标移除53
6.4 规则移除55
6.5 示例密码算术55
6.6 习题57
第三部分 视图的定义
第7章 视图定义61
7.1 引言61
7.2 语法62
7.3 语义63
7.4 半正程序66
7.5 分层程序68
7.6 习题71
第8章 视图评估73
8.1 引言73
8.2 基础目标和规则的自顶向下处理74
8.3 合一75
8.4 非基础查询和规则的自顶向下处理79
8.5 习题81
第9章 示例83
9.1 引言83
9.2 示例亲属关系83
9.3 示例积木世界84
9.4 示例模运算86
9.5 示例有向图87
9.6 习题88
第10章 列表、集合、树91
10.1 引言91
10.2 示例皮亚诺公理91
10.3 列表93
10.4 示例排序列表94
10.5 示例集合95
10.6 示例树96
10.7 习题96
第11章 动态系统99
11.1 引言99
11.2 表示100
11.3 仿真101
11.4 计划103
11.5 习题104
第12章 元知识105
12.1 引言105
12.2 自然语言处理105
12.3 布尔逻辑107
12.4 习题108
第四部分 操作的定义
第13章 操作113
13.1 引言113
13.2 语法113
13.3 语义115
13.4 习题118
第14章 动态逻辑程序121
14.1 引言121
14.2 响应式系统121
14.3 封闭系统122
14.4 混合主动124
14.5 同时动作124
14.6 习题126
第15章 数据库管理127
15.1 引言127
15.2 约束更新127
15.3 物化视图维护128
15.4 通过视图更新129
15.5 习题130
第16章 交互式工作表131
16.1 交互式工作表简介131
16.2 示例132
16.3 网页数据133
16.4 手势134
16.5 操作定义135
16.6 视图定义136
16.7 语义建模137
第五部分 结论
第17章 其他类型的逻辑程序设计143
17.1 引言143
17.2 逻辑生产系统143
17.3 约束逻辑编程144
17.4 析取逻辑编程145
17.5 存在逻辑编程146
17.6 回答集编程147
17.7 归纳逻辑编程149
附录A EpilogJS中的预定义概念151
附录B Sierra161
参考文献182