使用管道(|)时列表中的统一顺序
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]
如果该映射是可能的(即如果变量 I
、Y
、X
、Z
绑定到允许统一成功的术语)
在这种情况下,假设所有变量都是未绑定,那么:
变量I
和X
将成为“同一个变量”(更明确地说,变量名I
和X
将指定相同的空存储单元)
变量Y
会变成原子like' (more clearly, the storage cell designated by variable name
Ywill be set to
like`)
变量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 不同的偏好。但我欠你一份支持这一说法的参考资料。
我无法弄清楚统一是按什么顺序完成的。我有以下查询:
[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]
如果该映射是可能的(即如果变量 I
、Y
、X
、Z
绑定到允许统一成功的术语)
在这种情况下,假设所有变量都是未绑定,那么:
变量
I
和X
将成为“同一个变量”(更明确地说,变量名I
和X
将指定相同的空存储单元)变量
Y
会变成原子like' (more clearly, the storage cell designated by variable name
Ywill be set to
like`)变量
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 不同的偏好。但我欠你一份支持这一说法的参考资料。