嵌套列表项删除在序言
问题描述:
我对这个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]].
答
您正在尝试与
如果结构递归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
这个问题也问[这里](http://stackoverflow.com/questions/35757202/deleting-all-occurrences-of-element-in-a-nested-list-in-prolog)。您可能想阅读一些评论。 – lurker
尝试逻辑思考。如果'德尔(X,Y,Z)'是其中元件'X'从列表'Y'得到结果'Z',那么显然'德尔(项目,项,[])的列表中去除一个谓词。'没有按没有意义,因为第二个参数不应与被删除的项目相同。也许你的意思是,'德尔(项目[项目],[])。'和'德尔(项目负责人,负责人)'说如果我从任何列表中删除'Item',我得到了相同的列表回来。这似乎也不合逻辑。 – lurker