是有可能得到从名单列表中的Prolog的所有元素?
是这样的:我们的getElements([[[A,B,并[c],d,E],F,G,并[h,[I,J]]],S),结果是:S = [A ,b,C,d,E,F,G,H,I,J] ......
感谢帮助。
是有可能得到从名单列表中的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的(或其它),您可以用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用于追加两个列表,一个不好的设计。
但是,页面不说是否有另一个本地谓词来取代它。
我敢肯定,一个更好的答案将被提供。
你问了一个列表的列表中的所有元素。 也就是说,对于[[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.