Prolog 程序2024 年 8 月 29 日 | 5 分钟阅读 使用内置谓词,目标序列,或者在系统提示符处指定目标本身意义不大。要编写 Prolog 程序,首先,用户必须编写一个用 Prolog 语言编写的程序,加载该程序,然后在提示符处指定一个或多个目标序列。 要在 Prolog 中创建程序,简单的方法是将其键入文本编辑器中,然后将其另存为文本文件,例如 prolog1.pl。 以下示例显示了一个简单的 Prolog 程序。该程序包含三个组件,这些组件被称为子句。每个子句都使用句点终止。 使用内置谓词 'consult',可以在 Prolog 系统中加载上述程序。 ?-consult('prolog1.pl'). 这表明 prolog1.pl 文件存在,并且 prolog 程序在系统上是正确的,这意味着它具有有效的子句,目标将成功,并且为了确认该程序已正确读取,它产生一行或多行输出。例如, ?- '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')。 系统提示符 ?- dog(rottweiler)。 ?- dog(boxer)。 ?- dog(A)。 ?- dog(B)。 ?- cat(A)。A = sphinx; 暂停?用户按; ?- listing(dog)。 它将列出定义谓词 dog 的所有子句 /* dog/1 */ dog(rottweiler)。 在此示例中,介绍了 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, A = sphinx, A = sphinx, 等等。 相比之下,目标序列如下 ?-cat(A), dog(A)。 这将给出所有既是猫又是狗的动物(在数据库中,没有这样的动物)。这里 A 在 cat(A) 和 dog(A) 中都是“任何值”,但是两者必须具有相同的值。 ?-cat(A),dog(A)。 下一个主题Prolog 的类型 |
我们请求您订阅我们的新闻通讯以获取最新更新。