Prolog 程序

2024 年 8 月 29 日 | 5 分钟阅读

使用内置谓词,目标序列,或者在系统提示符处指定目标本身意义不大。要编写 Prolog 程序,首先,用户必须编写一个用 Prolog 语言编写的程序,加载该程序,然后在提示符处指定一个或多个目标序列。

要在 Prolog 中创建程序,简单的方法是将其键入文本编辑器中,然后将其另存为文本文件,例如 prolog1.pl

以下示例显示了一个简单的 Prolog 程序。该程序包含三个组件,这些组件被称为子句。每个子句都使用句点终止。

使用内置谓词 'consult',可以在 Prolog 系统中加载上述程序。

?-consult('prolog1.pl').

这表明 prolog1.pl 文件存在,并且 prolog 程序在系统上是正确的,这意味着它具有有效的子句,目标将成功,并且为了确认该程序已正确读取,它产生一行或多行输出。例如,

?-
# 0.00 秒加载 prolog1.pl
?-

'consult' 的替代方案是 'Load',如果 Prolog 系统具有图形用户界面,则该选项将存在于菜单选项中。

加载程序后,子句将被放置在一个存储区中,该存储区被称为 Prolog 数据库。响应系统提示符,指定一系列目标,这将导致 Prolog 搜索并使用评估目标所需的子句。

术语

在下面的程序中,三行显示了子句。

使用句点,每个子句都将被终止。Prolog 程序具有一系列子句。事实或规则由这些子句描述。

事实的示例是 dog(rottweiler) cat(munchkin)。它们意味着“rottweiler 是一只狗”和“munchkin 是一只猫”。

狗被称为谓词。狗包含一个参数。括号()中的单词“rottweiler”。 Rottweiler 称为原子。

规则的示例是程序的最后一行。

冒号 (:-) 字符将被读作“如果”。在这里,A 是一个变量,它代表任何值。用自然的方式,规则可以读作“如果 A 是一只动物,那么 A 就是一只狗”。

上面的子句表明 rottweiler 是一只动物。这样的推论也可以通过 Prolog 完成

?- animal(rottweiler)。

为了暗示 munchkin 是一只动物,没有证据表明这一点。

?- animal(munchkin)。

更多术语

评估目标术语确定它是否满足。它也意味着目标评估为真或假。

请注意,当用户输入目标时,有时可以将其解释为命令。例如,

?- halt。                 '它用于退出 Prolog 系统。'

有时它可以被视为一个问题,比如,

?- animal(rottweiler)。    &             'rottweiler 是一只动物吗?'

以下程序显示了另一个关于动物的例子。它包括八个子句。注释由 /* 和 */ 之间的所有文本显示。

谓词 dog 和谓词 cat 都有四个子句。假设程序已保存在文本文件 'animal.pl' 中,并通过加载程序生成输出,并且在系统提示符下,我们输入一系列目标,如下所示

?- consult('animals1.pl')。                 系统提示符
# 0.01 秒加载 animals.pl                   animals.pl 使用 consult 加载

?- dog(rottweiler)。

?- dog(boxer)。

?- dog(A)。
A = rottweiler                 暂停 - 用户按下回车键

?- dog(B)。
B = rottweiler;                 暂停?用户按 ;
B = poodle;                 暂停?用户按 ;
B = bulldog;                 暂停?用户按 ;
B = dobermann                 没有暂停?它将进入下一行

?- cat(A)。A = sphinx;                 暂停?用户按;
A = Bengal                 暂停?用户按回车键

?- listing(dog)。                 它将列出定义谓词 dog 的所有子句

/* dog/1 */

dog(rottweiler)。
dog(poodle)。
dog(bulldog)。
dog(dobermann)。

?-

在此示例中,介绍了 Prolog 的各种新功能。查询如下

?- dog(A)。

这意味着找到 A 的值,它将是狗的名字。Prolog 的答案如下

A = rottweiler

A 的其他可能答案如下:poodle、bulldog、dobermann。它将导致 Prolog 暂停,因此,我们必须等待用户按下“回车”键,然后它才会输出系统提示符 ?-.

我们可以按如下方式输入下一个查询

?- dog(B)。

此查询与之前相同。上述查询表示“找到 B 的值,它将是一只狗的名字”。Prolog 的答案如下

B = rottweiler

Prolog 将再次暂停。这次用户按下了分号 (;) 键。现在 Prolog 将找到满足目标 dog(B) 的 B 的替代值。它将回复如下

B = poodle

Prolog 将再次暂停。用户再次按下了分号 (;) 键。Prolog 产生进一步的解决方案,如下所示

B = bulldog

Prolog 将再次暂停。用户再次按下了分号 (;) 键。Prolog 产生进一步的解决方案,如下所示

B = dobermann

Prolog 认识到不再有可用的解决方案,因为它没有暂停,而是通过立即转到输出,并转到系统提示符 ?- 。

在此示例中,介绍了一个新的内置谓词。指定目标

?- listing(dog)

在上述目标中,Prolog 将列出定义谓词 dog 的所有四个子句。它们将按照加载到数据库中的相同顺序进行定义。

变量在查询中的使用由以下示例显示。目标序列如下

?-cat(A),dog(B)。

这将为我们提供所有可能的猫和狗的组合。

?-cat(A),dog(B)。
A = sphinx,
B = rottweiler;

A = sphinx,
B = poodle;

A = sphinx,
B = bulldog;

A = sphinx,
B = dobermann;

等等。

相比之下,目标序列如下

?-cat(A), dog(A)。

这将给出所有既是猫又是狗的动物(在数据库中,没有这样的动物)。这里 A 在 cat(A) 和 dog(A) 中都是“任何值”,但是两者必须具有相同的值。

?-cat(A),dog(A)。


下一个主题Prolog 的类型