List 从列表列表中获取元素

List 从列表列表中获取元素,list,prolog,dcg,List,Prolog,Dcg,是否可以从Prolog中的列表列表中获取所有元素 类似于:我们有getElements([[a,b,[c]],d,e],f,g,[h,[i,j]],S),结果是:S=[a,b,c,d,e,f,g,h,i,j] 感谢您的帮助。在SWI Prolog(可能还有其他)中,您可以使用展平/2: ?- flatten([[[a,b,[c]],d,e],f,g,[h,[i,j]]], S). S = [a, b, c, d, e, f, g, h, i|...]. 请注意,其中包括以下声明: 最终需要展平

是否可以从Prolog中的列表列表中获取所有元素

类似于:我们有getElements([[a,b,[c]],d,e],f,g,[h,[i,j]],S),结果是:S=[a,b,c,d,e,f,g,h,i,j]

感谢您的帮助。

在SWI Prolog(可能还有其他)中,您可以使用
展平/2

?- flatten([[[a,b,[c]],d,e],f,g,[h,[i,j]]], S).
S = [a, b, c, d, e, f, g, h, i|...].
请注意,其中包括以下声明:

最终需要展平/3通常表示设计不好,就像追加两个列表的append/3一样

但是,页面没有说明是否有另一个本机谓词替换它


我相信会有更好的答案。

您要求提供列表的所有元素。也就是说,对于
[[1,2,3],[4]
,这将是列表
[1,2,3,4]
。但是,对于
[[[1],[3]]]
而言,这将是
[[1],[3]]]
列表,因为
[1]
[3]
是元素。由于这个原因,
flatten/2
是不正确的,它给出了
[1,3]
作为答案。另外,对于
1
它给出了
[1]

以下是一个使用以下方法的解决方案:

此解决方案现在也适用于以下情况:

?- phrase(seqq([S1,S2]), [1,2]).
S1 = [],
S2 = [1,2] ;
S1 = [1],
S2 = [2] ;
S1 = [1,2],
S2 = [] ;
false.
然而,
flatten/2
是完全错误的:

?- flatten([S1,S2],[1,2]).
S1 = 1,
S2 = 2.

研究栏+“展平”应该让你高兴。好的,谢谢:)我不知道。。。虽然我有点希望我能找到窍门-一些算法。。。但是谢谢;)(对不起,我的英语是O:-)你可以在这里看到源代码/它是如何实现的@magus:此谓词已弃用。请阅读您提到的源代码中的理由:最终需要展平/3通常表明,就像追加两个列表的append/3一样,设计不好。从生成的小列表生成列表的高效代码必须使用差异列表,通常可以通过语法规则实现最佳可读性。
?- flatten([S1,S2],[1,2]).
S1 = 1,
S2 = 2.