2010-03-28 32 views
4

可以说我想通过逐个添加另一个列表(L)的元素来构造一个列表(L2)。结果应该与输入完全相同。 这个任务很愚蠢,但它会帮助我理解如何通过列表进行递归并移除某些元素。通过在序言中使用递归

create([1,2,3,4], L2) 

回报

L2 = [1|create([2,3,4], **)\. 

这不是一个理想的结果

create(L, L2) :- (\+ (L == []) -> L=[H|T], append([H], create(T, L2), L2);[]). 

称之为:

我已经把下面的代码。

回答

3

你说你想知道prolog是如何工作的,所以我不会给你一个完整的解决方案,而是一个提示。

prolog中的函数不返回值,它们只是创建绑定。

当你说

append([H], create(T, L2), L2);[]). 

你试图使用一个返回值。

尝试追加在递归调用中使用的创建绑定。

+0

谢谢你的回应。我拿出这一行: remove1(L,L2): - 显示(L2),(\ +(L == []) - > L = [H | T],追加(L2,H,L2) ,remove1(T,L2); [])。 但是,我得到错误:_G256 错误:超出全局堆栈 这是为什么? – screenshot345 2010-03-30 20:33:04

+0

我必须承认,我更熟悉更传统的prolog语法,其中每个谓词为每个参数结构声明一次。我可以这样说,当你遇到堆栈错误时,这意味着你的递归没有终止。这是因为你的终止标准是错误的,或者你的程序的其余部分没有按照你认为应该的方式来减少参数。在这种情况下,我怀疑后者,并建议你仔细观察后缀,因为在我看来,你可能不希望双方都有L2。 – charlieb 2010-03-31 12:31:50