我正在使用这个Prolog代码来删除列表中所有出现的元素,包括嵌套列表。但是,它不是删除元素,而是用空列表替换它。
这是我的代码:
del(Item, [Head|Tail], [HeadResult|TailResult]) :-
del(Item, Head, HeadResult),
del(Item,Tail,TailResult),
!.
del(Item,[], []).
del(Item, Item, []).
del(Item, Head, Head).
我认为行del(Item,[], []).
是罪魁祸首。但是,我不确定如何更改,以便它不会出现在我的新列表中。
想要的输出示例:
remberD(a, [a,b,c,[a,b]], New).
New = [b,c,[b]].
答案 0 :(得分:1)
您正在尝试使用
进行结构递归del(Item, [Head|Tail], [HeadResult|TailResult]) :- % wrong
del(Item, Head, HeadResult),
del(Item, Tail, TailResult).
似乎不错,除非Head = Item
怎么办?在这种情况下,结果应该是TailResult
,根本不应该有HeadResult
:
del(Item, [Item|Tail], TailResult):-
del(Item, Tail, TailResult).
现在,如果在输入列表的头部不是Item
怎么办?两种情况 - 要么是一个列表而我们需要进入它,或者它不是一个列表而我们只是保持原样:
del(Item, [Head|Tail], [HeadResult|TailResult]) :-
Head \= Item, Head = [_|_],
del(Item, Head, HeadResult),
del(Item, Tail, TailResult).
del(Item, [Head|Tail], [Head|TailResult]) :-
Head \= Item, Head \= [_|_],
del(Item, Tail, TailResult).
唯一的另一种情况是尝试从空列表中删除某些内容:
del(_, [], []).
这假设您始终使用完全实例化的术语来调用此谓词。