将嵌套列表转换为列表的列表PROLOG



我需要一些帮助,我有一个这样的列表:

[[[4,11,9,7],[4,13,8,6],[4,12,10,5]],[[3,12,8,7],[3,11,10,6],[3,13,9,5]],[[2,13,10,7],[2,12,9,6],[2,11,8,5]]] %(is a list with three lists, and inside of each list are other three list)

我想要一个这样的:

[[4,11,9,7],[4,13,8,6],[4,12,10,5],[3,12,8,7],[3,11,10,6],[3,13,9,5],[2,13,10,7],[2,12,9,6],[2,11,8,5]] %(a list with nine lists).

%目前我有这种追加,但输出不接近我需要的:

appendL([],[]).  %->base case
appendL([H], H). %->base case
appendL([H,H2|T], [L3|L1]):-
append(L,L1,L3),
append(H,H2,L),
appendL(T, L1).

这个给出:[[[4,11,9,7],[4,13,8,6],[4,12,10,5],[3,12,8,7],[3,11,10,6],[3,13,9,5],[2,13,10,7],[2,12,9,6],[2,11,8,5]],[2,13,10,7],[2,12,9,6],[2,11,8,5]]

你可以注意到有三个列表出现了两次

可以使用DCG从列表的列表中获取元素

seq([]) --> [].
seq([E|Es]) --> [E], seq(Es).
seqq([]) --> [].
seqq([Es|Ess]) --> seq(Es), seqq(Ess).

结果swi-prolog:

% Show first 99 elements of a list
?- set_prolog_flag(answer_write_options, [quoted(true), portray(true), max_depth(100), attributes(portray)]).
?- phrase(seqq([[[4,11,9,7],[4,13,8,6],[4,12,10,5]],[[3,12,8,7],[3,11,10,6],[3,13,9,5]],[[2,13,10,7],[2,12,9,6],[2,11,8,5]]]), L), length(L, Len).
L = [[4,11,9,7],[4,13,8,6],[4,12,10,5],[3,12,8,7],[3,11,10,6],[3,13,9,5],[2,13,10,7],[2,12,9,6],[2,11,8,5]],
Len = 9.

注意:如果不想使用DCG,那么应该使用差异列表而不是附加/2,详见https://www.swi-prolog.org/pldoc/man?predicate=flatten/2

猜猜看,append(K,X)

K=[[[4,11,9,7],[4,13,8,6],[4,12,10,5]],[[3,12,8,7],[3,11,10,6],[3,13,9,5]],[[2,13,10,7],[2,12,9,6],[2,11,8,5]]]
X= [[4,11,9,7],[4,13,8,6],[4,12,10,5],[3,12,8,7],[3,11,10,6],[3,13,9,5],[2,13,10,7],[2,12,9,6],[2,11,8,5]]

我可能会这样做:

flatten( Xs , Ys ) :- flatten(Xs,Ys,[]) .
flatten( []    ,    Fs  , Fs ) .
flatten( [H|T] ,    Fs  , F1 ) :- nested(H), !, flatten(H,Fs,F0) , flatten(T,F0,F1) .
flatten( [H|T] , [H|F0] , F1 ) :-                                  flatten(T,F0,F1) .
nested( [ [_|_] | _ ] ) .

你可以这样说:

L = [
[
[a] ,
[b]
],
[
[
[c] ,
[]  ,
[d] ,
[
[e]
],
[g]
]
]
],
flatten( L , F ) .

F = [
[a] ,
[b] ,
[c] ,
[]  ,
[d] ,
[e] ,
[g]
]

最新更新