数据库编程
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之间。