Prolog在getList谓词中无休止地递归

时间:2015-10-29 21:42:41

标签: 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) :-
    (H == Side),
    append(Others, [Side], Others1),
    getList(T,Side,Others1). // where it backwards recurses after finishing
getList([E],X,[]).

请帮我确定为什么这样做以及找到解决方案。

1 个答案:

答案 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