2015-04-19 63 views
1

假设我们有这样一个清单:[[[[a],b,c],a,b,[a,b]]]递归列表的多个列表

我想递归下降列表中获取例如[[a],b,c][a]

做这样的事情:listsplit([H|T], H, T).当返回头时,我只能达到列表的一个级别。我试图递归地做,但无济于事。

任何帮助表示赞赏。

回答

0

您应该记住[H | T]只是语法糖:列表只是二叉树,头枝始终是叶。所以,你可以解构它就像任何其他的树:

| ?- X = [[[[a],b,c],a,b,[a,b]]], X = [[Y|_]|_], X = [[[Z|_]|_]|_]. 

这导致:

X = [[[[a],b,c],a,b,[a,b]]] 
Y = [[a],b,c] 
Z = [a] 

但是,这种 “气味”。你究竟想要完成什么?也许有更好的方法,然后用笨拙的嵌套列表表示树?

+0

我正在编写一个小解释器,我在prolog中创建一个符号表。我的输入结构就像这样['[function1],[[function2],[[function3]]]',我试图解构它,以便将参数存储在函数中(返回值,输入参数,功能体等)。一个函数的例子是:[[int,[add]],[(],[[int,[a]],[[,],[[int,[b]],[]]]], []],[=],[[[a],[]],[[+],[[b],[]]]]] – ari

+0

这件事看起来并不像符号表。符号表本质上就像是一个大的散列,它将标识符映射到当前作用域中相应的语义构造。你在这里得到了各种各样的词汇垃圾,像逗号和括号。在语义分析之前至少有两个层次。尝试使用嵌套列表作为唯一的数据结构一次性进行lexing/parsing/semantic分析不会很有趣。我建议你更干净地分离这些步骤,并首先设计适当的数据结构。 –