从名单列表获取元素从名单列表获取元素(Get elements from list of lists

2019-05-12 11:43发布

是有可能得到从名单列表中的Prolog的所有元素?

是这样的:我们的getElements([[[A,B,并[c],d,E],F,G,并[h,[I,J]]],S),结果是:S = [A ,b,C,d,E,F,G,H,I,J] ......

感谢帮助。

Answer 1:

在SWI-Prolog的(或其它),您可以用flatten/2

?- flatten([[[a,b,[c]],d,e],f,g,[h,[i,j]]], S).
S = [a, b, c, d, e, f, g, h, i|...].

需要注意的是对于SWI-Prolog的手册页flatten/2包括以下语句:

结束了需要拼合/ 3经常表示,像附加/ 3用于追加两个列表,一个不好的设计。

但是,页面不说是否有另一个本地谓词来取代它。

我敢肯定,一个更好的答案将被提供。



Answer 2:

你问了一个列表的列表中的所有元素。 也就是说,对于[[1,2,3],[4]]这将是列表[1,2,3,4] 然而,对于[[[1],[3]]]这将是列表[[1],[3]]由于[1][3]是元素。 为此, flatten/2不正确,它给你[1,3]作为一个答案。 另外, 1它给出[1] ...

下面是一个使用的解决方案DCG :

seq([]) --> [].
seq([E|Es]) --> [E], seq(Es).

seqq([]) --> [].
seqq([Es|Ess]) --> seq(Es), seqq(Ess).

?- phrase(seqq([[[1],[3]]]), Xs).
Xs = [[1],[3]].

?- phrase(seqq(1), Xs).
false.

该解决方案现在作品也像下列情况:

?- 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.


文章来源: Get elements from list of lists
标签: list prolog dcg