所以我有几次返回true的谓词。
% true returns several times and i need to press ';'
?- get_all_transformed_moves.
true ;
true ;
true.
swi prolog是否有一些方法可以帮助我运行这个谓词而不输入';'?
% Wished version
?- get_all_transformed_moves.
true.
答案 0 :(得分:2)
请考虑以下事项:
likes(prolog).
likes(haskell).
likes(erlang).
likes_something:-
likes(_Something).
如果现在你问:
?- likes_something.
你会得到
true ;
true ;
true.
发生这种情况是因为prolog找到了三种方法来满足likes_something / 0谓词(使用prolog,haskell和erlang),所以它的回答是真的三次。
这不是一个问题;在任何时候你都可以按 ,prolog将停止尝试寻找答案(当有很多结果时,这非常方便)。
你的谓词也会发生同样的事情:有三种解决方案并按下;你强迫prolog找到他们所有。正如Rocha建议你可以使用findall / 3。例如,您可以写:
likes_something:-
findall(X, likes(X), _).
这将只返回一个yes
likes_all(L):-
findall(X,likes(X),L).
当然,决定是否需要查看结果取决于您(或者更确切地说是您要解决的问题:p)
另一种选择是使用剪切:!/0
例如:
likes_something:-
likes(_Something),
!.
这将阻止prolog寻找更多解决方案,你只会得到一个真实的。 但请注意,削减可能会很棘手。
总而言之: 如果你想要prolog搜索所有的答案(如果你决定把它们放在一个列表中,或者你的谓词中有副作用,或者你只是想要它):使用findall / 3
如果您不想选择搜索更多答案:使用剪切(!/ 0)
否则只需按Enter键而不是;
答案 1 :(得分:0)
您可以使用findall / 3谓词:
的findall(对象,目标,列表)。 生成一个列表所有对象的列表满足目标目标的对象。通常,Object只是一个变量,在这种情况下,查询可以理解为:给我一个列表,其中包含满足Goal的所有Object实例。
我想这就是你想要的。
答案 2 :(得分:0)
如果您希望谓词最多成功一次,那么您可以使用SWI提供的一次/ 1。
在你的例子中:
?- once(get_all_transformed_moves).
true.