Prolog - 使用迭代器回溯

时间:2016-06-19 11:16:48

标签: prolog iteration backtracking

我有一个谓词:

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).

2 个答案:

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