Recursion 在prolog中使用递归作为追加

Recursion 在prolog中使用递归作为追加,recursion,prolog,append,Recursion,Prolog,Append,假设我想通过逐个附加另一个列表(L)的元素来构造一个列表(L2)。结果应该与输入完全相同。 这个任务很愚蠢,但它会帮助我理解如何递归列表并删除某些元素 我将以下代码组合在一起: create(L, L2) :- (\+ (L == []) -> L=[H|T], append([H], create(T, L2), L2);[]). 打电话过来 create([1,2,3,4], L2) 返回 L2 = [1|create([2,3,4], **)\. 这不是期望的结果。你说你想了解

假设我想通过逐个附加另一个列表(L)的元素来构造一个列表(L2)。结果应该与输入完全相同。 这个任务很愚蠢,但它会帮助我理解如何递归列表并删除某些元素

我将以下代码组合在一起:

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

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

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

这不是期望的结果。

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

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

当你说

append([H], create(T, L2), L2);[]).
您正在尝试使用返回值


尝试让append创建您在递归调用中使用的绑定。

谢谢您的回复。我给出了这行代码:remove1(L,L2):-display(L2),(\+(L=[])->L=[H | T],append(L2,H,L2),remove1(T,L2);[])。然而,我得到了错误:_g256error:Out of global stack这是为什么?我必须承认,我更熟悉更传统的prolog语法,其中每个谓词对每个参数结构声明一次。但我可以这样说,当您得到一个堆栈外错误时,这意味着您的递归无法终止。这要么是因为您的终止条件是错误的,要么是程序的其余部分没有按您认为应该的方式减少参数。在这种情况下,我怀疑是后者,并建议您仔细查看append,因为在我看来,您可能不希望两边都使用L2。