删除列表中项目的所有实例:Prolog

Yog*_*mar 3 prolog

removeAll(X, [ X | T], [ H1 | T1 ] ):-
      ( member ( X , T )
        -> removeAll ( X , T , [ H1 | T1 ] )
        ;[ H1 | T1 ] is T
      ).
removeAll ( X , [ H | T ] , L ):-
removeAll ( X , T , L2 ), append ( [ H ] , L2 , L ).
Run Code Online (Sandbox Code Playgroud)

如果我通过“ removeAll(2,[1,1,2],L).”,
它会给出错误“ ERROR: is/2: Type error: 'evaluable' expected, found '[]' (an empty_list)”。

如果我通过 " removeAll(1,[1,1,2],L)." ,它返回 false。

真的很迷茫。我哪里错了?

Yas*_*sel 7

首先,您必须考虑源列表为空的情况:

removeAll(_, [], []).
Run Code Online (Sandbox Code Playgroud)

这也是停止条件。因为您正在构建一个递归谓词,删除目标列表的 Head 中与特定元素匹配的每个元素,直到列表为空

第二个子句,如果元素是List的Head,不要把它复制到Result列表,继续用Tail递归调用。

removeAll(X, [X|T], L):- removeAll(X, T, L), !.
Run Code Online (Sandbox Code Playgroud)

第三个子句,将列表的Head中的元素复制到Result列表中,用Tail继续递归调用。

removeAll(X, [H|T], [H|L]):- removeAll(X, T, L ).
Run Code Online (Sandbox Code Playgroud)

你的谓词:

removeAll(_, [], []).
removeAll(X, [X|T], L):- removeAll(X, T, L), !.
removeAll(X, [H|T], [H|L]):- removeAll(X, T, L ).
Run Code Online (Sandbox Code Playgroud)