在没有findall的情况下收集所有解决方案

时间:2014-03-18 22:45:05

标签: prolog

因此,作为我工作的一部分,我的代码需要将所有解决方案打印到查询中,但不使用findall/3谓词。我已经做了一些阅读,有一些方法涉及将解决方案添加到列表等等。我自己尝试过,但没有成功;因此,我希望有人能够展示如何在不使用findall的情况下打印所有解决方案。

程序代码如下:

    solutions(Q, 100):-
        Q = [X, Y, S],
        between(2,50,X),
        between(2,50,Y),
        S is X+Y,
        Y > X,
        S =< 50.

Q和100都在那里因为它需要程序的另一部分所以现在忽略它。当我使用?- solutions(Q, 100)进行查询时,我会得到结果[2,3,5][2,4,6][2,5,7]等等,但显然我需要按;来获取每个新结果。我需要显示所有这些内容,而无需按;而不使用findall。

2 个答案:

答案 0 :(得分:1)

您可以使用故障驱动的循环。尝试:

?- solutions(Q, 100), write(Q), nl, fail.

答案 1 :(得分:1)

基于断言的解决方案(实际上是在Prolog教科书中实现findall的方式):假设solution/2根据您的代码找到每个解决方案。现在,正如Paulo建议的那样,我们使用故障驱动的循环来构建解决方案列表,使用assert/1来缓存解决方案。

solutions(_, N) :-
  solution(Q, N),
  (cache(Qs) -> retractall(cache(_)) ; Qs = []),
  assert(cache([Q|Qs])),
  fail.
solutions(Qs, _) :-
  retract(cache(Qs)).