2012-03-19 14 views
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] ...

ありがとうございます。 SWI-Prologの(そしておそらく他の人)で

+0

リサーチバー+ "フラット"はあなたを幸せにするはずです。 – m09

答えて

2

、あなたはflatten/2を使用することができます。

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

the SWI-Prolog manual page for flatten/2は、次のステートメントが含まれていること:多くの場合、平ら/ 3を必要と終わる

は次のように示し、誤ったデザインの2つのリストを追加するために/ 3を追加します。

ただし、ページには、それを置き換える別のネイティブ述部があるかどうかはわかりません。

より良い回答が提供されると確信しています。

+0

okありがとう:) didntはそれを知っています...私はトリックを見つけ出すことを少しは望んでいましたが - いくつかのアルゴリズム...しかし感謝;)(そして私の英語O--)には申し訳ありません) – kolage

+1

source /ここでどのように実装されているかhttp://www.swi-prolog.org/pldoc/doc/swi/library/lists.pl?show=src – magus

+3

@magus:この述語は非推奨です。あなたが言及したソースの正当性を読んでください:flatten/3が必要な場合は、 のように2つのリストを追加するためのappend/3のような場合があります。生成された小リストからリスト を生成する効率的なコードでは、 の可読性のために文法規則によってしばしば可能な、 のリストを使用する必要があります。 – false

3

リストのリストのすべての要素を尋ねました。つまり、[[1,2,3],[4]]の場合、これはリスト[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. 
関連する問題