Ich versuche, ein Prädikat findall in Prolog zu implementieren (ja, ich weiß, dass es eingebaut ist, das ist für eine Aufgabe).PROLOG-Regel gibt nur erste Übereinstimmung zurück
Es wird wie folgt geschrieben:
my_findall(N,P,Pred,L) :- Pred, not(new(N,P)), !, assert(new(N,P)), my_findall(N1,P1,Pred,L1), L=[N,P,L1], retract(new(N,P)).
my_findall(_,_,_, []).
Aus irgendeinem Grund es gibt mir nur die erste Lösung und hält dort an, als ob der zweite Aufruf von my_findall ausfällt. Wie ich es verstehe, sollte der Backtracking-Mechanismus alle möglichen Optionen umfassen, die alle Optionen für den Aufruf von Pred (N, P) enthalten sollten, obwohl der zweite Aufruf beim ersten Versuch fehlschlagen sollte (die erste Option, die für Pred bereits getestet wurde) wurde behauptet, sollte es alle anderen Optionen zuerst versuchen, bevor Sie aufgeben und gehen zu my_findall ((,), _, []).
Wenn das nicht funktioniert, gibt es eine Möglichkeit, diese Art von Verhalten zu erzwingen, ohne die Lösung komplett neu zu schreiben?
Mit welchem Prolog-Interpreter arbeiten Sie? – liori
Die eingebauten Findalls sind findall/3 und findall/4. Welche versuchen Sie zu implementieren? – Kaarel