2010-11-23 11 views
0

私はリストの上に関係を定義しようとしている内部のリストを統一プロローグが...リスト

?- matrix_items([[a,b],[c,d],[e,f]],Rs). 
Rs = [a,b,c,d,e,f].      % expected result 

これまでのところ、私はこのような何かをすることができました。残念ながら、それはすべての要素を追加していません。すぐにあなたから聞い

sift([],_).            
sift([H|T],[H|Result]) :- 
    create(H,Result), 
    sift(H,Result). 

create([],_). 
create([H|T],[H|R]) :- 
    create(T,R). 

希望。

+0

「シフト」とは何ですか? – Cameron

+0

'flatten/2'組み込み関数は、あなたが望むような振る舞いをするかもしれません - あなたが使っているPROLOGインタプリタで既に実装されているかもしれません。 – sharky

答えて

2

このようなものを試してみてください。私は統一がPrologで他の意味合いを持っているようflatten_lする述語の名前を変更した:最初の引数がインスタンス生成されている場合、この述語はあなたにスタックオーバーフローエラーを与えることも

flatten_l([H|T], FL):- 
    flatten_l([H|T], [], FL). 

flatten_l([], FL, FL):- !. 
flatten_l([H|T], ML, FL):- 
    flatten_l(T, ML, NL), 
    !, 
    flatten_l(H, NL, FL). 
flatten_l(X, FL, [X|FL]). 

注...

+0

ありがとう、今私は理解:) – user517720

1

すべてのリスト(サブリストを含む)を折りたたみたい場合は、flatten/2を使用できます。

あなただけの単一レベルを折りたたむしたい場合は、次のように動作するはずです:

unify([], []). 
unify([X|Xs], Ret) :- unify(Xs, Rs), append(X, Rs, Ret). 
0

あなたはSWI-PLを使用する場合は、あなただけの1を平らにするネスティングやappend/2のすべてのレベルを平坦化するflatten/2を呼び出すことができますレベル。

関連する問題