確かに..プロローグデータベースを使用し、アサートして撤回します。これはそれを示しています:
% Declare the lasthead fact as dynamic, so facts can change
:-dynamic lasthead/1.
% Set a starting value for the first iteration
lasthead(null).
statement([]).
statement([A|B]) :-
% Show the previous head
lasthead(LH),
writeln(['Last head was', LH]),
% Retract last head. ie. remove from the database
retract(lasthead(_)),
% Store the current head in the database
assertz(lasthead(A)),
% Recurse around
statement(B).
?- statement([a,b,c,d,e]).
[Last head was,null]
[Last head was,a]
[Last head was,b]
[Last head was,c]
[Last head was,d]
上記の例では、lasthead(X) ファクトが 1 つだけであることを保証するためにrettract を使用していますが、retract を削除すると、リスト アイテムごとに 1 つずつ、複数の lasthead(X) ファクトを持つことが保証されます。
次に、たとえばを使用して、複数の lasthead(X) ファクトにアクセス/処理できます。findall(X, lasthead(X), Y) を使用すると、途中でアサートした lasthead(X) 値が得られます。