2017-11-11 8 views
2

[[a、b]、[b、c]、[c、d]]のリストがあり、[a、b、c] ]。ペアリストのリストPROLOG

私のコードは次のとおりです。

unMakeTuple([],_). 
    unMakeTuple([[A,_]|T],Ret):- 
    insertOnList(A,Ret,Ret1), 
    nl,write(Ret), 
    nl,write(Ret1), 
    unMakeTuple(T,Ret1). 

insertOnList(E,[],[E]). 
    insertOnList(E,[H|T],[H|T1]):- 
    insertOnList(E,T,T1). 

、私に空のリストを返します。 誰かが私を助けることができますか? ありがとうございます。

+1

あなたは上記のコードは動作するはずだと思う理由を説明できますか? –

答えて

2

ここでは、基本的にすべてのサブリストのヘッドを取得するマッピングを作成します。

だから我々は、述語head/2定義することができます。

head([H|_],H). 

をしてからmaplist/3を使用します。

unMakeTuple(A,B) :- 
    maplist(head,A,B). 

その後、我々は得る:コースのカスタム述語缶を書くが、

?- unMakeTuple([[a,b],[b,c],[c,d]],X). 
X = [a, b, c]. 

を同様に有益である。ここでの利点は、(a)リストAをマップBにマッピングすることは非常に宣言的で理解しやすいことです。各要素について、2つのリストの要素をhead述語で統一します。 (b)maplist/3が正しく動作すること、(c)maplist/3が最適化され、処理が高速に行われることが期待できます。

1

上記のmaplist/3を使用した@Willem Van Onsemの解決策がこれを実行するより良い方法ですが、これを行うもう1つの方法は、内部リストのすべてのヘッドを結果のリストに追加する述部を書くことです。いくつかのこのような再帰的なソリューションの並べ替え動作するはずです:次のように動作

head([H|_], H). 

get_heads([], []). 
get_heads([X|Xs], List) :- 
    head(X, H), 
    List = [H|Rest], 
    get_heads(Xs, Rest). 

?- get_heads([[a,b],[b,c],[c,d]], X). 
X = [a, b, c].