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。
真的很迷茫。我哪里错了?
首先,您必须考虑源列表为空的情况:
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)