如何展平嵌套列表?

时间:2016-01-18 22:39:01

标签: swi-prolog

我使用maplist(getEdgeInfo(Q_From_To),Edges,Edge_Info0)来收集图表中边缘的所有信息。 getEdgeInfo(Q_From_To)返回一个边缘列表,每个列表的信息也作为一个列表返回,所以我最终得到了以下Edge_Info0:

[ [[4,4,"n.v.t.",3,"n.v.t.",3,5,5,2]],
  [[5,5,"n.v.t.",3,"n.v.t.",3,12,12,2],[5,5,"n.v.t.",3,"n.v.t.",3,12,12,1]],
  [[5,5,"n.v.t.",3,"1.0",3,56,56,2]],
  ---
]

我需要的是以下格式的相同数据:

[ [4,4,"n.v.t.",3,"n.v.t.",3,5,5,2],
  [5,5,"n.v.t.",3,"n.v.t.",3,12,12,2],
  [5,5,"n.v.t.",3,"n.v.t.",3,12,12,1],
  [5,5,"n.v.t.",3,"1.0",3,56,56,2],
  ---
]

这样做的最佳方法是什么?我应该使用DCG吗? (我对DCG没有任何经验。)

2 个答案:

答案 0 :(得分:0)

我最终得到了这个。希望这将与'真实'数据一起使用。

clean([]) --> [].
clean([Q_Set|Tail]) --> q_set(Q_Set), clean(Tail), [].

q_set([]) --> [].
q_set([Rec_Set|Tail]) --> rec_set(Rec_Set), q_set(Tail).

rec_set([]) --> [].
rec_set([Record|Tail]) --> [Record], rec_set(Tail). 

?- X = [[[a]], [[b],[c]], [[d]]], phrase(clean(X), List).
List = [a, b, c, d],
X = [[[a]], [[b], [c]], [[d]]]

* /

答案 1 :(得分:0)

第一次尝试压得太深了一步。以下代码给出了预期的转换:

clean([]) --> [].
clean([Rec_Set|Tail]) --> rec_set(Rec_Set), clean(Tail), [].

rec_set([]) --> [].
rec_set([Record|Tail]) --> [Record], rec_set(Tail).