Recursion 在Prolog中添加尾部

Recursion 在Prolog中添加尾部,recursion,prolog,tail,Recursion,Prolog,Tail,我很难理解prolog如何处理列表。我正在尝试编写一个函数,该函数将向给定列表添加一个尾部并返回一个新列表。但是我的实现不起作用,我不知道如何修复它。以下是我所拥有的: % add_tail(L,M,E) :- L is M with [E] appended. % I wanna do this without using the append predicate add_tail([E],[],E). add_tail(List, [H|T], E):- add_tail(List

我很难理解prolog如何处理列表。我正在尝试编写一个函数,该函数将向给定列表添加一个尾部并返回一个新列表。但是我的实现不起作用,我不知道如何修复它。以下是我所拥有的:

% add_tail(L,M,E) :- L is M with [E] appended.
% I wanna do this without using the append predicate

add_tail([E],[],E).
add_tail(List, [H|T], E):-
    add_tail(List1, T, E),
    List is [H|List1].
为了阐明我希望该函数做什么,下面是一个输出示例:

?- add_tail(L,[1,2,3],4).
L = [1,2,3,4].
退房:

第二行(
append([],X,X)
)简单地说明将元素
X
附加到空列表等于该元素本身(中断条件)。第一行表示将
Z
添加到列表
[X | Y]
X
是头,
Y
rest)将生成一个新列表
[X | W]
,而
W
是将
Z
添加到
Y
的结果

示例

?- append([1,2,3],[4],L).
L = [1,2,3,4]

在您的情况下,您只需要重新排列参数

实际上,你的定义有一个错误。将元素
X
附加到空列表的末尾
[]
应生成一个列表,而不是元素
X
本身。@WillNess示例不正确。此规则假定所有参数都是列表。如果我的事实返回[X]而不是X,我会得到类似于[1,2,3,4]的东西。请检查。这是相关的。
?- append([1,2,3],[4],L).
L = [1,2,3,4]