我有一个谓词:
solve(parts(X), Places) :-
"iterate Pl from Places to 0",
tryPutPart(X, Pl),
fail.
我想在那里强制回溯,因为我想要所有可能的解决方案。(相反,我会在不同的谓词中递归地找到地方Pl。)
有可能以某种方式做到吗?我想到了一个长度为Places
并且看起来像[1, 2, 3.....]
的列表,然后尝试从中确定性地推出一些Y.
我想要的行为是,如果我将places(0). places(1). places(2). - ... -
等写入代码,然后将其写成
:- places(Y), tryPutPart(X, Y).
答案 0 :(得分:2)
您可以使用between/3
谓词来检查给定范围内的所有整数。例如:
?- between(1, 10, N), N > 3, write(N), nl, fail.
4
5
6
7
8
9
10
false.
有关此谓词的SWI-Prolog文档,请参阅http://www.swi-prolog.org/pldoc/doc_for?object=between/3。
答案 1 :(得分:1)
对于这个问题,我使用了谓词for
for(M,M,N):- M < N.
for(I,M,N):- M < N, M1 is M + 1, for(I,M1,N).
然后你可以强制回溯:
solve(parts(X),Places) :- for(Y, 1, TPlaces), tryPutPart(X, Y), fail.