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) ].