递归填写列表

时间:2014-01-04 19:06:42

标签: prolog

我想写一个规则来耗尽数据库并用一些项填充列表,但prolog解释器总是返回:Out of global stack。

fill(SomeParams, List) :- append(List, [NewItem], List), fail.

有没有办法扩展列表而不进行统一?

1 个答案:

答案 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).