2

以下代码给出了这些结果:

?- X = a, findall(Element, ( member(Z, [a,b,c]), Element = Z:X  ), Set).
X = a,
Set = [a:a, b:a, c:a].

但是,当我希望所有元素都共享相同的未绑定变量(而不是 a)时,事情就不会像预期的那样工作:

?- X = Y, findall(Element, ( member(Z, [a,b,c]), Element = Z:X  ), Set).
X = Y,
Set = [a:_G1918, b:_G1912, c:_G1906]. 

为什么 _G1918、_G1912 和 _G1906 不相互绑定?这是 swi-prolog 中的错误吗?

4

2 回答 2

2

您可以bagof/3为此使用:

?- X = Y, bagof(Element, Z^( member(Z, [a,b,c]), Element = Z:X  ), Set).
X = Y,
Set = [a:Y, b:Y, c:Y].

来自 SWI-Prolog 的文档:

findall/3 等价于 bagof/3,所有自由变量都与存在运算符 (^) 绑定,除了当 Goal 没有解决方案时 bagof/3 失败。

在您的查询X中是一个自由变量,因此您得到的结果与 with 的结果bagof/3相同X^

?- X = Y, bagof(Element, X^Z^( member(Z, [a,b,c]), Element = Z:X  ), Set).
X = Y,
Set = [a:_G2115, b:_G2109, c:_G2103].
于 2014-12-07T18:56:26.937 回答
1

这不是一个错误,“所有解决方案”内置函数在变量量化处理方面有所不同。

findall/3 这是更简单的模型。对于您的情况, bagof/3 将起作用,但您需要指出聚合变量:

?- X = Y, bagof(Element, Z^( member(Z, [a,b,c]), Element = Z:X  ), Set).
X = Y,
Set = [a:Y, b:Y, c:Y].
于 2014-12-07T18:57:29.880 回答