我需要一些帮助,我有一个这样的列表:
[[[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]
]