我想在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=5
,Y=5
和Z=5
的查询。
答案 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)
相同。