prolog

时间:2016-03-03 22:28:11

标签: prolog

我正在使用这个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]].

1 个答案:

答案 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(_, [], []).

这假设您始终使用完全实例化的术语来调用此谓词。