Prolog 中目标的评估17 Mar 2025 | 4 分钟阅读 我们将给出一个类似 cat(A) 和 go 的目标。 Prolog 在数据库中从上到下搜索。 它检查具有相同函数和元数的头部的子句。 它找到头部是否与目标统一。 如果 Prolog 无法成功统一,则目标失败。 如果成功,则输出取决于子句是事实还是规则。 如果子句是事实,目标将立即成功。 如果子句是规则,则逐个从左到右评估规则体中的目标。 如果它们都成功,则原始目标成功。 Prolog 使用短语“一个目标匹配一个子句”。 它的意思是它与子句的头部统一。 以下示例显示了一个目标 ?-pred(india, X) 在数据库中,第一个子句的谓词为 pred/2。 使用以下规则,头部可以与上述目标统一。 我们将此规则称为 规则 1。 在统一中,变量 A 绑定到原子 india, 并且变量 X 绑定到原子 'asia capital'。 当 A 绑定到印度时,它会影响规则中 A 的所有出现。 它的图示表示如下 ![]() 现在在规则 1 中,Prolog 逐个检查目标。 此过程将从左到右进行。 为了使原始目标成功,必须按顺序满足所有目标。 评估这些目标中的每一个都与评估用户原始目标相同。 现在将假设第一个子句与目标 capital(india, B) 匹配,它是事实 capital(india, delhi)。 在规则 1 的正文中,第一个目标在变量 B 绑定到德里时得到满足。 由于这种绑定,B 的所有出现都受到规则 1 正文的影响。 现在我们有以下内容 ![]() 在规则 1 的正文中,我们将尝试满足第二个目标。 重写后的形式是 asia(delhi)。 现在我们将此规则称为 规则 2。 在规则 2 的正文中,Prolog 尝试满足目标:write('PM Modi is Best') 和 nl。 这将成功处理,并且作为副作用,以下行显示为输出 PM Modi is Best 在规则 1 的正文中,前两个目标已得到满足。 还有两个重写后的目标是 write(india) 和 nl。 这两个目标都成功了,并且作为副作用,以下行显示为输出 india 在规则 1 的正文中,现在所有目标都已成功。 这意味着形成其头部的目标成功,例如 pred(india, 'asia capital')。 ?-pred(india, X) 这指定了原始目标成功,它由用户输入,变量 X 绑定到原子 'asia capital'。 Prolog 系统产生如下输出 ?-pred(india, X). PM Modi is Best india X = 'asia capital' Prolog 系统侧重于使用统一来评估具有子句头部的目标。 在满足用户的目标的过程中,我们将在目标、子句的头部和规则正文中的目标之间创建链接。 尽管此过程的描述非常冗长,但可视化这些链接非常容易。 ![]() 用户的一个目标如下所示 ?- pred(india, X) 在上图中,用户的目标已放置在右侧。 那是因为它与规则体中的目标有很多共同之处。 以下示例显示了用户在提示符处输入的目标。 ?- owns(A, B), cat(B), write(A), nl. 上述目标序列将以与虚构规则中的目标相同的方式处理。 它将说成功:- owns(A, B), cat(B), write(A), nl. 以下流程图显示了评估目标的过程。 ![]() 图:评估一系列目标 ![]() 图:评估一个目标 左侧显示了如果评估中的任何目标失败会发生什么情况。 如果目标失败,Prolog 尝试找到另一种方法来满足最近满足的先前目标。 此过程称为回溯。 统一和回溯共同构成了该机制。 Prolog 使用该机制来评估目标,无论目标是在正文规则中输入还是由用户在提示符处输入。 下一个主题Prolog 回溯 |
我们请求您订阅我们的新闻通讯以获取最新更新。