gpt4 book ai didi

list - 在 Prolog 中展平列表

转载 作者:行者123 更新时间:2023-12-03 10:58:04 24 4
gpt4 key购买 nike

我只用 Prolog 工作了几天。我明白一些事情,但这真的让我很困惑。

我想写一个函数来获取一个列表并将其展平。

?- flatten([a,[b,c],[[d],[],[e]]],Xs).  
Xs = [a,b,c,d,e]. % expected result

该函数取出列表的内部结构。

这是我到目前为止所拥有的:
flatten2([],[]).
flatten2([Atom|ListTail],[Atom|RetList]) :-
atom(Atom), flatten2(ListTail,RetList).
flatten2([List|ListTail],RetList) :-
flatten2(List,RetList).

现在,当我打电话时这有效:
?- flatten2([a,[b,c],[[d],[],[e]]], R).
R = [a,b,c,d,e]. % works as expected!

但是当我打电话查看我输入的列表是否已经展平时,返回 false而不是 true :
?- flatten2([a,[b,c],[[d],[],[e]]], [a,b,c,d,e]).
false. % BAD result!

为什么一方面有效,另一方面无效?我觉得我错过了一些非常简单的东西。

最佳答案

没有任何其他谓词,只有尾递归。

flatten([[X|S]|T], F) :- flatten([X|[S|T]], F).
flatten([[]|S], F) :- flatten(S, F).
flatten([X|S], [X|T]) :- \+(X = []), \+(X = [_|_]), flatten(S, T).
flatten([], []).

关于list - 在 Prolog 中展平列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9059572/

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