预测返回。序言

时间:2011-09-18 19:20:23

标签: console prolog

所以我有几次返回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.

3 个答案:

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

但是,它没有提供比以前版本更多的信息;相反,它隐藏了这样一个事实:有3个解决方案和浪费时间试图找到更多,而答案不会改变。 出于这个原因,我认为你应该使用findall / 3,如果你真的想结果:

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.