因此,作为我工作的一部分,我的代码需要将所有解决方案打印到查询中,但不使用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。
答案 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)).