我想写一个规则来耗尽数据库并用一些项填充列表,但prolog解释器总是返回:Out of global stack。
fill(SomeParams, List) :- append(List, [NewItem], List), fail.
有没有办法扩展列表而不进行统一?
答案 0 :(得分:1)
您的append
无效,因为它声明List
是将[NewItem]
附加到List
的结果,因此List
应该是两个事情一下子。请记住,Prolog中的变量是逻辑变量,一旦绑定就永远无法更改。
您可以使用findall/3
,如CapelliC所说,或者如果您想要更多控制权,您可以执行以下操作:
%% some facts
fact(1).
fact(2).
fact(3).
fill(List, NewList) :-
fact(X),
not(member(X, List)), !,
fill([X|List], NewList).
fill(List, List).
%%
fill(NewList) :- fill([], NewList).
然后
try ?- fill(L).