Prolog 中的统一

17 Mar 2025 | 4 分钟阅读

我们将给出一个目标进行评估,Prolog 将处理数据库中的子句。 在此过程中,Prolog 尝试将目标与每个子句匹配。 匹配过程从左到右进行。 如果未找到匹配项,则目标将失败。 如果找到匹配项,则将执行操作。

Prolog 使用统一技术,这是一种非常通用的匹配技术。 在统一中,给出一个或多个变量赋值以使两个调用项相同。 此过程称为将变量绑定到值。 例如,Prolog 可以通过将变量 A 绑定到原子 mary 来统一术语 cat(A) 和 cat(mary),这意味着我们正在为变量 A 赋值 mary。 Prolog 可以通过将 L 和 S 分别绑定到原子 kevin 和 dane 来统一 person(Kevin, dane) 和 person(L, S)。

一开始,所有变量都没有值。 在统一中,一旦变量绑定到值,它就可以再次变得未绑定,然后也许可以使用回溯绑定到新值。

统一调用术语

在下文中,流程图可以总结该过程。

Unification in Prolog

考虑到这一点,我们有三种情况。 在第一种情况下,一个原子与另一个原子统一,这是最简单的方法。 如果两个原子相同,则只会成功,所以

  • 原子 dane 统一并且 dane 成功。
  • 原子 dane 统一,并且 'dane' 也成功。
  • 原子 dane 统一,但 kevin 失败。

第二种情况下,原子与复合项(如danelikes(Kevin, henry))统一。 这种第二种情况总是失败。

第三种情况下,两个复合项是统一的,这是最常见的情况。 例如,dog(A) 与 likes(kevin, B)likes(A, B) 与 likes(Kevin, henry)。 在两个复合项中,如果 functor 和 arity 相同,则统一失败。 谓词相同,因此统一 dog(A) 和 likes(Kevin, B) 失败。

相同 Functor 和 arity 统一两个复合项,例如 parent(A, B, C) 与头 parent(Kevin, tom, 30)。 它需要头部和子句参数,这些参数“成对”统一,它将从左到右工作。 在两个复合项中,第一个参数被统一,然后它们的第二个参数被统一,依此类推。 因此,变量 A 与原子 kevin 统一,然后变量 B 与 tom 统一,然后 C 与 30 统一。 如果两个复合项中的所有参数对都统一了统一,它将成功,就像在本例中一样。 如果没有,它会失败。

复合项具有任何类型的参数,例如变量、列表、数字、原子和复合项。 以下示例显示了一些典型的统一



重复变量

在复合项中,如果一个变量出现多次,它将成为一个稍微复杂的情况。

以上有两个复合项,其中第一个参数被成功统一。 因此,A 绑定到 canada。 在第一个复合项中,A 的所有其他值也绑定到 canada。 当 Prolog 检查这两个第二个参数时,它们不再是 A 和 cat,而是 canadacat。 这些原子不同,Prolog 无法统一。

在 Prolog 统一任何参数对之前,所有绑定的变量都将替换为其值。

成功的统一显示在以下示例中,其中涉及重复的变量。

以下示例描述了复合项的参数中重复的变量。

变量 L 与原子 male 统一,变量 S 与原子 female 统一。 现在,Prolog 统一了这两个第三个参数,即 mypred(A, A, B)mypred( no, yes, maybe)。 首先,变量 A 与原子 no 统一。 变量 A 成功绑定到 no,因此它将成功。 现在,Prolog 比较这两个第二个参数。 由于 A 绑定到 no,因此第二个参数现在是 noyes,而不是 A 和 yes,因此统一失败。

在以下示例中,统一成功,因为第二个参数 mypred 现在是 no 而不是 yes


下一主题评估目标