是否有可能从Prolog中的列表列表中获取所有元素?
类似于:我们有getElements([[[[a,b,[c]],d,e],f,g,[h,[i,j]]],S),结果是:S = [a ,b,c,d,e,f,g,h,i,j] ......
感谢帮助.
您询问了列表列表的所有元素.也就是说,[[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.
Run Code Online (Sandbox Code Playgroud)
此解决方案现在也适用于以下情况:
?- phrase(seqq([S1,S2]), [1,2]).
S1 = [],
S2 = [1,2] ;
S1 = [1],
S2 = [2] ;
S1 = [1,2],
S2 = [] ;
false.
Run Code Online (Sandbox Code Playgroud)
虽然flatten/2完全错了:
?- flatten([S1,S2],[1,2]).
S1 = 1,
S2 = 2.
Run Code Online (Sandbox Code Playgroud)