List 从列表列表中获取元素
是否可以从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(可能还有其他)中,您可以使用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|...]. 请注意,其中包括以下声明: 最终需要展平
展平/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.