数据库编程

Prolog 将所有内容归类为:

  • 原子 - 任何不以大写字母开头的字符序列。例如 - abokay
  • 数字 - 数字没有特殊语法,不需要声明。例如 12235.8
  • 变量 - 以大写字符或下划线(_)开头的字符串。例如 XYAbcAA
  • 复杂术语 - 它们由仿函数和一系列参数组成。复杂术语的名称始终是原子,而参数可以是原子或变量。例如 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 是一种声明性语言,你可以按如下方式阅读此数据库:

弗雷德是苏珊的父亲

希拉里是乔的母亲。

对于所有 XYXY 的孩子,如果 YX 的父亲或者 YX 的母亲。

实际上,一组有限的事实和/或规则构成了逻辑程序

通过查询来演示这种程序的使用。查询允许你从逻辑程序中检索信息。

要将数据库加载到解释器中(假设你已将数据库保存到正在运行解释器的目录中),只需输入:

?- [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 关系在希拉里和乔之间

对于所有 XY,如果 father_childYX 之间的关系,或者 mother_childYX 之间的关系,那么关系 child_ofXY 之间。