我需要编写一个扁平化列表的函数。
例如:
flat([ c , [[[]]] , [] , k] , X).
X=[c,k]
这就是我所做的:
flat([],[]).
flat([[A] |B] , R) :- flat([A|B],R).
flat([[]|L],L1) :- flat(L,L1).!
flat([[A|L]|W],R) :- flat([A|L],U), flat(W,W1), append(U,W1,R).
flat([A|L], [A|L1]) :- flat(L,L1).
我知道为什么这不是真的,但我不知道该怎么做。
谢谢。
编辑:
几乎工作:
flat([],[]).
flat([[]|L],L1) :- flat(L,L1). --- i think something here missing
flat([[A|L]|W],R) :- flat([A|L],U), flat(W,W1), append(U,W1,R).
flat([A|L], [A|L1]) :- flat(L,L1).
?- flat([c , [[[]]] , [] , k],C).
C = [c, k] ;
C = [c, [], k] ;
C = [c, [], k] ;
C = [c, [], [], k] ;
C = [c, [[]], k] ;
C = [c, [[]], [], k] ;
C = [c, [[[]]], k] ;
C = [c, [[[]]], [], k].
最佳答案
flatten(List, FlatList) :-
flatten(List, [], FlatList0), !,
FlatList = FlatList0.
flatten(Var, Tl, [Var|Tl]) :-
var(Var), !.
flatten([], Tl, Tl) :- !.
flatten([Hd|Tl], Tail, List) :- !,
flatten(Hd, FlatHeadTail, List),
flatten(Tl, Tail, FlatHeadTail).
flatten(NonList, Tl, [NonList|Tl]).
这是 Jan Wielemaker 和 Richard O'Keefe 的 swi-prolog 解决方案,
代码可以在 prolog 的库目录中的lists.pl 文件中找到。
关于prolog - 扁平化列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11220567/