gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:44:00 26 4
gpt4 key购买 nike

我想从列表列表中删除所有包含 [['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).

关于prolog - 如何从列表中删除所有子列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19066405/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com