prolog – 如何从列表中删除所有子列表?

我想从列表列表中删除包含[[‘One’,_],_]的所有列表.我创建了以下子句delete_all,它总是有效,除了我的情况:

delete_all(_,[],[]) :- !.
delete_all(X,[X|Tail],List) :-
    !,
    delete_all(X,Tail,List).
delete_all(X,[A|Tail],[A|List]) :-
    delete_all(X,Tail,List).

示例:(这很有效)

?- delete_all(3,[3,4,3,5,3],K).
K = [4, 5] .

但效果不佳:

delete_all([['One', _], _], [[['One', 'Six'], 94],
    [['One', 'Ten'], 13], [['Two', 'Nine'], 35]], Y).
Y = [[['One', 'Ten'], 13], [['Two', 'Nine'], 35]].

为什么它只删除第一个元素?可能有什么不对?

最佳答案 好吧,要测试,这是一个工作的:

delete_all(E, L, R) :- findall(X, (member(X, L), X \= E), R).

我认为你的代码不起作用,因为它实例化X,然后禁止进一步的匹配.delete/3的文档(你做的就是你所做的,只是交换参数)清楚地说明问题.

你应该改变你的第一个条款

delete_all(X,[E|Tail],List):-
    \+ X \= E, !, delete_all(X,Tail,List).
点赞