3

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

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

感谢帮助。

4

2 回答 2

5

您要求提供列表列表的所有元素。也就是说,[[1,2,3],[4]] 这将是 list [1,2,3,4]。但是,因为[[[1],[3]]]这将是列表[[1],[3]],因为[1][3]是元素。出于这个原因,flatten/2它给你[1,3]一个答案是不正确的。此外,因为1它给[1]...

这是使用的解决方案:

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.
于 2012-03-20T13:15:46.030 回答
3

在 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包括以下语句:

最终需要 flatten/3 通常表明,例如 append/3 用于附加两个列表,这是一个糟糕的设计。

但是,该页面没有说明是否有另一个本地谓词来替换它。

我相信会提供更好的答案。

于 2012-03-19T20:21:09.250 回答