【问题标题】:Filling a list recursively递归填充列表
【发布时间】:2014-01-04 19:06:41
【问题描述】:

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

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

有没有办法在不进行统一的情况下扩展列表?

【问题讨论】:

  • 使用 findall/3。或 findall/4 获取更多高级选项

标签: prolog


【解决方案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).

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 2011-07-17
    • 2014-12-30
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多