我有兴趣使用 Prolog 语言执行长列表串联。 目标是定义一个谓词,该谓词获取未知数量的列表,并将它们全部连接到一个列表中(作为谓词的第二个参数给出)。
我知道我应该首先了解 Prolog 如何支持无限大小的参数,但我认为答案是使用列表,例如: [一| [[b、c、d] | [[e、f、g] | [h,i,j,k]]]]。
如果是这样,我考虑将谓词写成这样:
l_conc([ ],[ ]).
l_conc([[ ]|Tail],L):-
l_conc(Tail,L).
l_conc([[Head|L1]|Tail],[Head|L2]):-
l_conc([L1|Tail],L2).
但是,它仅将空列表相互连接。 请在这里帮助我(关于参数表示和谓词本身):-) 谢谢!
最佳答案
在回答实际问题之前,我有几点评论。
首先,您给出的术语作为示例[a | [[b、c、d] | [[e、f、g] | [h,i,j,k]]]]
在 Prolog 中可以写得更紧凑。您可以使用 Prolog toplevel 本身来查看该术语实际上是什么:
?- Ls = [a | [[b,c,d] | [[e,f,g] | [h,i,j,k]]]]. Ls = [a, [b, c, d], [e, f, g], h, i, j, k].
由此可见,这只是一个列表。然而,它不是一个列表列表,因为原子a
、h
、i
等不是列表。
因此,您的示例与您的问题不符。有很多方法可以“展平”列表,但我只能建议不要展平,因为它不是纯粹的关系。原因是 [X]
被视为“平面”列表,但 X = [a,b,c]
使 [[a,b,c ]]
不平坦,因此如果您使用 flatten/2
,将会遇到逻辑不一致的情况。
我推荐的是append/2
。最简单的实现方法是使用 DCG ( dcg )。例如考虑:
together([]) --> []. together([Ls|Lss]) --> list(Ls), together(Lss). list([]) --> []. list([L|Ls]) --> [L], list(Ls).
示例查询:
?- phrase(together([[a],[b,c],[d]]), Ls). Ls = [a, b, c, d].
在此示例中,恰好一层嵌套已被删除。
关于list - 如何在 Prolog 中执行列表的长串联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38284686/