此谓词用于判断列表中是否包含元素并将其添加到新列表中。然而,一旦我完成递归并且我返回了正确的列表,它会向后递归,直到它再次在开头结束,然后再次通过它再次 - 无休止地再次。
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,[]).
请帮我确定为什么这样做以及找到解决方案。
答案 0 :(得分:0)
如果我理解了您对谓词的描述,则会在第一个列表中搜索与Element
相同的元素,并在第二个列表中复制Element
列表。
此谓词可以按如下方式实现:
getList(Element,OldList,NewList)。
getList( Element, [], [] ).
getList( Element, [ X | Xs ], [ Element | Ys ]) :-
X == Element,
getList( Element, Xs, Ys ).
getList( Element, [ X | Xs ], Ys ) :-
% X \== Element,
getList( Element, Xs, Ys ).
以下查询结果为NewList
?- getList( a(X), [ a(1), a(a), a(Y), a(X), b(Y), a(X) ], NewList ).
yes
NewList = [ a(X), a(X) ].
如果length( X, 3 )
是未绑定的变量, P.S。 [ _ , _ , _ ]
将为您X
。