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

How can I assert facts about all List members in Prolog?

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
?- 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


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

"等于" 与"could unify" 或"unify" 不同,但要看你的意思。

使用 SWI-Prolog,从顶层开始:

1
2
3
4
5
6
7
8
?- 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):

这三个是等价的:

1
2
3
maplist(=(5), [X,Y,Z])
maplist(=, [5,5,5], [X,Y,Z])
X=5, Y=5, Z=5

当然X=5=(X,5)是一样的。