6.7.1 Prolog

Prolog以逻辑为基础。程序员会声明对象及其关系,并了解与之相关的内容。Prolog系统通过内置的搜索和回溯机制来解释这些问题。例如,我们可以通过写字来告诉Prolog系统桌子和椅子是一种家具:

furniture(table). furniture(chair).

接下来,我们可以试着问Prolog,面包是家具吗?

| ?- furniture(bread).

答案是“否”。但是下面这个问题:

| ?- furniture(table).

答案是“是”。这种可以得到是或否结论的Prolog形式被称为predicate,当它被作为搜索关键字时,则被称为goal

我们还可以使用变量,这些变量可以实例化(赋值)也可以不实例化;这种变量称为逻辑变量。逻辑变量的命名规则为大写字母或下划线( _ )开头作为标识。例如我们可以这样使用它们:

| ?- furniture(X).

这是在对逻辑变量X进行实例化。Prolog系统将会搜索可能的实例并响应:

X = table

然后,我们可以通过键入一个RETURN来停止搜索,也可以键入一个分号来继续(然后再键入RETURN)。后一种情况下Prolog系统要返回X的另一个实例。这样一个为已知因子寻找相匹配的逻辑变量实例的过程称之为推理(inference)

并非每个例子都像上面列举的那么简单。例如,如下这样一个Prolog子句包含了古董家具的信息:

antique_furniture(Obj,Age) :- furniture(Obj), Age > 100.

这里我们看到有一个对象,是两个目标的结合:一个对象Obj和一个年份Age是属于古董家具对象的一部分,即如果它是一件家具,并且年份大于100年,则是一件古董家具。

Prolog系统中一个重要的数据结构是列表,列表长度不需要初始化。空列表用 []表示;[a]则是头部为a尾部为 []的列表;[a,b,c]是头部为a尾部为 [b,c]的列表。另一个有用的数据结构是复合值,其中是一组固定数量的数据组合在一个命名实体中。例如dog(“Fido”,brown)。其中的数据项可以是逻辑变量。