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 |
我想要一种提出查询的方法,例如
有很多术语你可能弄错了,或者我误解了你。
"等于" 与"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。这最好通过统一(上面的第三个查询)。
PS。如果您想知道如何阅读
这三个是等价的:
1 2 3 | maplist(=(5), [X,Y,Z]) maplist(=, [5,5,5], [X,Y,Z]) X=5, Y=5, Z=5 |
当然