2016-03-03 77 views
1

我对这个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

这个问题也问[这里](http://stackoverflow.com/questions/35757202/deleting-all-occurrences-of-element-in-a-nested-list-in-prolog)。您可能想阅读一些评论。 – lurker

+0

尝试逻辑思考。如果'德尔(X,Y,Z)'是其中元件'X'从列表'Y'得到结果'Z',那么显然'德尔(项目,项,[])的列表中去除一个谓词。'没有按没有意义,因为第二个参数不应与被删除的项目相同。也许你的意思是,'德尔(项目[项目],[])。'和'德尔(项目负责人,负责人)'说如果我从任何列表中删除'Item',我得到了相同的列表回来。这似乎也不合逻辑。 – lurker

回答

1

您正在尝试与

如果结构递归
del(Item, [Head|Tail], [HeadResult|TailResult]) :- % wrong 
    del(Item, Head, HeadResult), 
    del(Item, Tail, TailResult). 

似乎不错,只是,?结果应该只是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(_, [], []). 

这是假设你总是调用这个谓词完全实例化条款。

+0

谢谢你,你真的帮我抓住了我的错误! – BigPapa