我需要编写一个扁平化列表的函数。

例如:

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/

10-12 19:42