在 Prolog 中满足目标

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

在本节中,我们将了解 Prolog 如何满足目标。如果用户对此有很好的理解,他将以紧凑的方式编写一个强大的 Prolog 程序,并且它将经常只使用几个子句。

当用户在系统提示符处指定一系列目标时,此过程开始。

例如

Prolog 系统用于按顺序满足每个目标序列。它将从左向右工作。如果目标有像 owns(A, B) 这样的变量,那么 Prolog 系统总是涉及将它们绑定到值,例如将 A 绑定到 Kevin,将 B 绑定到 dane。如果所有目标都依次成功,则所有目标序列都将成功。Prolog 系统会输出在目标序列中使用的所有变量的值。

如果无法满足所有目标,则目标序列将失败。

我们有一个问题,那就是如果第一个序列目标成功,而第二个序列目标失败,Prolog 会做什么。

调用术语

在 Prolog 中,每个目标都必须是一个术语,但它没有任何类型的术语。该术语可以是一个复合术语、列表、变量、原子、不是数字,或由 Prolog 的某些特定实现提供的其他类型的术语。这是一种限制类型的术语,被称为调用术语。在规则的主体、目标和子句的头部也必须是调用术语。

每个目标,例如 go, nl, write('Welcome to javatpoint'), dog(A) 都有一个对应的谓词,分别为 go/0, n1/0, write/1 和 dog/1。write 和 nl 谓词被称为函子。它有多个参数,这些参数被称为元数。

为了满足目标,Prolog 将目标与数据库中的子句的头部匹配,搜索将从上到下进行。

例如

上述目标将与事实匹配,如下所示

它将给出如下输出

为了评估用户定义的谓词,Prolog 有一个基本原则,即如果数据库中的事实和规则无法满足目标,则目标将失败。它没有“未知”或“未证明”之类的中间位置。这等同于对数据库做出一个非常强的假设,这被称为关于数据库的封闭世界假设:如果数据库中的事实和规则无法证明任何结论,它将是错误的。没有其他信息。