我想用尽Prolog"树"没有提示用户按下; (看每个选项)。
我使用以下代码执行此操作:
testLocation(room1).
testItem(number,room1).
testItem(number2,room1).
testItem(number3,room1).
test2(Location) :- testItem(X,Location), write(X), nl, fail.
输出结果为:
?- test2(room1).
number
number2
number3
false.
到底有没有打印假的?我有一种感觉,你可以通过削减来做到这一点。或许我使用无法一次写入所有内容并不是写入解决方案。
任何想法?
答案 0 :(得分:3)
更简单的方法应该是
test2(Location) :- forall(testItem(X, Location), writeln(X)).
有关详细信息,请参阅有趣的forall / 2文档页面。 如果您需要多个可调用对象,则可以对Cond和Action部分使用连接:虚拟示例
... forall((true, testItem(X, Location)), (write(X), nl)) ...
答案 1 :(得分:0)
您可以这样做:
test2(Location) :-
testItem(X,Location),
write(X),nl,
fail.
test2(_).
这将永远成功。
您可以这样做:
test2(L,R) :-
findall(X,testItem(X,L),R)
.
但是“失败”有什么问题:这只意味着解决方案集已经用完了。