Ein weiterer Ansatz ist die Memorierung von Lösungen.
:- dynamic seen/1.
% Dies immer aufrufen, bevor deadly_wrapper/1 aufgerufen wird
clear_seen :-
retractall(seen(_)).
% Dieser Wrapper ruft deadly/1 auf, merkt sich die Lösung mit assert/1 und schlägt fehl,
% wenn die Lösung bereits "gesehen" wurde.
deadly_wrapper(X) :-
deadly(X),
(
seen(X)
->
fail
;
assert(seen(X))
).
% Dies ist zum Testen.
deadly(1).
deadly(1).
deadly(1).
deadly(5).
deadly(1).
deadly(1).
Falls Ihr Prolog Tabling unterstützt, wird es noch einfacher. Beispiel-Datei:
:- table deadly/1.
deadly(1).
deadly(1).
deadly(5).
deadly(1).
deadly(5).
Beispiel-Ausführung mit XSB:
$ xsb
[xsb_configuration loaded]
[sysinitrc loaded]
XSB Version 3.2 (Kopi Lewak) vom 15. März 2009
[x86_64-unknown-linux-gnu; Modus: optimal; Engine: slg-wam;
Scheduling: lokal; Wortgröße: 64]
| ?- [deadly_tab].
[Kompilierung von ./deadly_tab]
[deadly_tab kompiliert, CPU-Zeit verwendet: 0,0100 Sekunden]
[deadly_tab geladen]
ja
| ?- deadly(X).
X = 5;
X = 1;
nein
| ?-