使用管道(|)时列表中的统一顺序

Order of unification in lists when using pipe(|)

我无法弄清楚统一是按什么顺序完成的。我有以下查询:

[X, like | Z] = [I, Y, Prolog, language].

这给了我以下结果:

X = I,
Z = [Prolog, language],
Y = like.

然而,我期待的是:

X = I,
Y = like,
Z = [Prolog, language].

Prolog统一术语有什么特定的顺序吗?

编辑: 我有一种感觉,Prolog 对 an atom with a variable 的统一给予了比 a variable with an atom 更高的优先级。是吗?

没有订单。这是执行的映射:

[I,  Y   , Prolog, language].
 |   |     +--------------+
 |   |           |
[X, like |       Z] 

如果该映射是可能的(即如果变量 IYXZ 绑定到允许统一成功的术语)

在这种情况下,假设所有变量都是未绑定,那么:

  • 变量IX将成为“同一个变量”(更明确地说,变量名IX将指定相同的空存储单元)

  • 变量Y会变成原子like' (more clearly, the storage cell designated by variable name Ywill be set tolike`)

  • 变量Z占据了“列表的其余部分(或后缀)”(|后面的所有内容)并将成为复杂的术语`[Prolog,语言]'.

  • 变量 Prolog 没有改变,保持原样。

Prolog 顶层可以随意对答案替换进行排序。答案替换的顺序并没有告诉你统一是按什么顺序完成的。您可能会通过使用 freeze/2:

深入了解统一顺序
Welcome to SWI-Prolog (threaded, 64 bits, version 8.3.17)

?- freeze(X, (write('X='), write(X), nl)), 
    freeze(Y, (write('Y='), write(Y), nl)),
    [X|Y] = [foo|bar].
X=foo
Y=bar
X = foo,
Y = bar.

?- freeze(Y, (write('Y='), write(Y), nl)),
    freeze(X, (write('X='), write(X), nl)),
    [X|Y] = [foo|bar].
X=foo
Y=bar
Y = bar,
X = foo.

至少你看到冻结协程是在统一模式之后安排的,而不是在它们被引入的方式之后,就像顶级一样。在 SWI-Prolog 中,最有可能的是 freeze/2 结果告诉您如何执行统一的顺序。

但据我所知,ISO 核心标准不需要特定的顺序。在这方面,其他 Prolog 系统可能具有与 SWI-Prolog 不同的偏好。但我欠你一份支持这一说法的参考资料。