在没有提示用户的情况下耗尽prolog树,并且不返回false。可能吗?

时间:2014-04-14 20:48:18

标签: prolog

我想用尽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.

到底有没有打印假的?我有一种感觉,你可以通过削减来做到这一点。或许我使用无法一次写入所有内容并不是写入解决方案。

任何想法?

2 个答案:

答案 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)
  .

但是“失败”有什么问题:这只意味着解决方案集已经用完了。