我如何断言Prolog中所有List成员的事实?

时间:2016-04-11 21:19:38

标签: prolog

我想在prolog中断言列表中所有成员的事实,并保留任何由此产生的统一。作为一个例子,我想声明每个列表成员等于5,但以下结构都没有这样做:

?- L=[X,Y,Z], forall(member(E,L), E=5).

L = [_h27057686,_h27057704,_h27057722]
X = _h27057686
Y = _h27057704
Z = _h27057722
yes

 ?- L=[X,Y,Z], foreach(member(E,L), E=5).

L = [_h27057686,_h27057704,_h27057722]
X = _h27057686
Y = _h27057704
Z = _h27057722
yes

我想要一种方法来提出X=5Y=5Z=5的查询。

1 个答案:

答案 0 :(得分:2)

有很多术语可能会出错,或者我误解了你。

“等于”与“可以统一”或“统一”不同,但这取决于你的意思。

使用SWI-Prolog,从顶层:

?- X == 5.
false. % the free variable X is not the integer 5

?- unifiable(X, 5, U).
U = [X=5]. % you could unify X with 5, then X will be 5

?- X = 5.
X = 5. % X unifies with 5 (and is now bound to the integer 5)

CapelliC的评论已经有了你最有可能得到的答案:给定一个变量列表(无论是否免费),使列表中的每个变量都绑定到整数5.这最好由统一(上面的第三个查询)。 maplist只是将统一应用于列表的每个元素。

PS。如果您想知道如何阅读maplist(=(5), L)

这三个是等价的:

maplist(=(5), [X,Y,Z])
maplist(=, [5,5,5], [X,Y,Z])
X=5, Y=5, Z=5

当然X=5=(X,5)相同。