Prolog在getList谓词中无限递归

Prolog在getList谓词中无限递归,list,prolog,List,Prolog,该谓词用于判断列表中是否包含元素,并将其添加到新列表中。然而,一旦我完成了递归,并且返回了正确的列表,它就会向后递归,直到它再次在开始处结束,然后再次递归——无休止地 getList([],X,[]). getList([H|T],Side,Others) :- (length(T,3)), (H == Side), append([],[H],NewList), getList(T,Side,NewList). getList([H|T],Side,Others

该谓词用于判断列表中是否包含元素,并将其添加到新列表中。然而,一旦我完成了递归,并且返回了正确的列表,它就会向后递归,直到它再次在开始处结束,然后再次递归——无休止地

getList([],X,[]).
getList([H|T],Side,Others) :-
    (length(T,3)),
    (H == Side),
    append([],[H],NewList),
    getList(T,Side,NewList).
getList([H|T],Side,Others) :-
    (H == Side),
    append(Others, [Side], Others1),
    getList(T,Side,Others1). // where it backwards recurses after finishing
getList([E],X,[]).

请帮助我确定它为什么这样做,并找到解决方案。

如果我理解您对谓词的描述,它将在第一个列表中搜索与
元素
相同的元素,并将
元素
复制到第二个列表中

此谓词可以按如下方式实现:

getList(元素、旧列表、新列表)

以下查询成功,结果为
NewList

?- getList( a(X), [ a(1), a(a), a(Y), a(X), b(Y), a(X) ], NewList ).

yes
NewList = [ a(X), a(X) ].

p.S.
length(X,3)
如果
X
是一个未绑定的变量,那么
length(T,3)
将为您提供
[\uuuuuuuuuuuu,\uuuuuu]

逻辑中
length(T,3)
的意义是什么?当
T
的长度为3时,您的第2和第3个子句都将成功,因此回溯将探索这两个选项。它在什么模式下表现出这种行为?确切的查询是什么?请提供一些示例查询以及预期的答案。
?- getList( a(X), [ a(1), a(a), a(Y), a(X), b(Y), a(X) ], NewList ).

yes
NewList = [ a(X), a(X) ].