2016-06-19 26 views
1

Ich habe ein Prädikat wie:Prolog - Rückzieher mit Iterator

solve(parts(X), Places) :- 
    "iterate Pl from Places to 0", 
    tryPutPart(X, Pl), 
    fail. 

ich dort den Rückzieher zwingen will, weil ich alle möglichen Lösungen will (Stattdessen würde ich den Platz Pl rekursiv in verschiedenem Prädikat gefunden habe.).

Ist es möglich, es irgendwie zu tun? Ich kam auf die Idee, eine Liste mit der Länge Places zu erstellen, die wie [1, 2, 3.....] aussieht, und dann zu versuchen, einige Y-Werte deterministisch zu löschen.

Das Verhalten Ich mag würde, wenn ich places(0). places(1). places(2). - ... - geschrieben und so weiter in den Code und schrieb es dann wie

:- places(Y), tryPutPart(X, Y). 
+2

Sie Frage ist ein bisschen chaotisch. Ich verstehe nicht, was Sie erreichen wollen. Bitte versuchen Sie es neu zu formulieren. –

Antwort

2

Sie können die 012 verwendenPrädikat, um alle ganzen Zahlen aus einem gegebenen Bereich zu prüfen. Zum Beispiel:

?- between(1, 10, N), N > 3, write(N), nl, fail. 
4 
5 
6 
7 
8 
9 
10 
false. 

Siehe http://www.swi-prolog.org/pldoc/doc_for?object=between/3 für SWI-Prolog Dokumentation zu diesem Prädikat.

0

Für dieses Problem habe ich Prädikat for

for(M,M,N):- M < N. 
for(I,M,N):- M < N, M1 is M + 1, for(I,M1,N). 

und dann können Sie force backtracking:

solve(parts(X),Places) :- for(Y, 1, TPlaces), tryPutPart(X, Y), fail.