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.
このソリューションは、次のような場合にも機能するようになりました。
?- 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.
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が必要になることは、2つのリストを追加するためのappend / 3のように、悪い設計を示していることがよくあります。
ただし、このページには、それを置き換える別のネイティブ述語があるかどうかは示されていません。
より良い答えが提供されると確信しています。