数据库编程
Prolog 将所有内容归类为:
- 原子 - 任何不以大写字母开头的字符序列。例如 -
a
,b
,okay
- 数字 - 数字没有特殊语法,不需要声明。例如
1
,22
,35.8
- 变量 - 以大写字符或下划线(
_
)开头的字符串。例如X
,Y
,Abc
,AA
- 复杂术语 - 它们由仿函数和一系列参数组成。复杂术语的名称始终是原子,而参数可以是原子或变量。例如
father(john,doe)
,relative(a)
,mother(X,Y)
。
逻辑数据库包含一组事实和规则。
仅将原子作为参数的复杂术语称为事实,而将变量作为参数的复杂术语称为规则。
Prolog 中的事实示例:
father_child(fred, susan).
mother_child(hillary, joe).
Prolog 中的规则示例:
child_of(X,Y):-
father_child(Y,X)
;
mother_child(Y,X).
请注意,此处的 ;
与其他语言的 or
运算符类似。
Prolog 是一种声明性语言,你可以按如下方式阅读此数据库:
弗雷德是苏珊的父亲
希拉里是乔的母亲。
对于所有
X
和Y
,X
是Y
的孩子,如果Y
是X
的父亲或者Y
是X
的母亲。
实际上,一组有限的事实和/或规则构成了逻辑程序。
通过查询来演示这种程序的使用。查询允许你从逻辑程序中检索信息。
要将数据库加载到解释器中(假设你已将数据库保存到正在运行解释器的目录中),只需输入:
?- [nameofdatabase].
用实际文件名替换 nameofdatabase
(请注意,这里我们将 .pl
扩展名排除在文件名之外)。
上述程序的解释器中的查询示例和结果:
?- child_of(susan,fred).
true
?- child_of(joe,hillary).
true
?- child_of(fred,susan).
false
?- child_of(susan,hillary).
false
?- child_of(susan,X).
X = fred
?- child_of(X,Y).
X = susan,
Y = fred ;
X = joe,
Y = hillary.
上述查询及其答案可以解读如下:
苏珊是弗雷德的孩子吗? - 是的
乔是希拉里的孩子吗? - 是的
是一个苏珊的孩子? - 假
是苏珊是希拉里的孩子吗? - 假
谁是苏珊的孩子? - 弗雷德
这就是我们在 Prolog 中编程逻辑的方式。逻辑程序更正式:一组公理或规则,定义对象之间的关系(也就是谓词)。以更正式的逻辑方式解释上述数据库的另一种方法是:
father_child
关系在 fred 和 susan 之间
mother_child
关系在希拉里和乔之间
对于所有
X
和Y
,如果father_child
在Y
和X
之间的关系,或者mother_child
在Y
和X
之间的关系,那么关系child_of
在X
和Y
之间。