2

これは、私が行ったサンプル試験の問題でした。

引数としてリストを取り、ペアになった要素からなるリストを結果として返す Prolog 述語 split_into_pairs の定義を与えます。たとえばsplit_into_pairs([1,2,3,4,5,6],X)、結果として返されX=[[1,2],[3,4],[5,6]]ます。同様に、split_into_pairs([a,2,3,4,a,a,a,a],X)would return as result X=[[a,2],[3,4],[a,a],[a,a]]while split_into_pairs([1,2,3],X)would return No.

組み込みの述語を使用して実行することを意図したものではないと思いますが、120 点中 8 点しかないので、それほど複雑にする必要はありません。

2 つの要素のリストに対して何をすべきかわからないので、no を返すように指定されていないか、split_into_pairs([A,B],[[A,B]]).

私の主な問題は、再帰呼び出しを適切に行う方法であり、余分な括弧を使用せず、X=[[A,B],[[C,D],[[E,F]]]]? のような結果にならないようにすることです。

私の最近の試みは以下のコードのバリエーションでしたが、明らかにこれは正しくありません。

split_into_pairs([A,B],[A,B])
split_into_pairs([A,B|T], X) :- split_into_pairs(T, XX), X is [A,B|XX]
4

2 に答える 2

3

これは比較的単純な再帰です。

split_into_pairs([], []).
split_into_pairs([First, Second | Tail], [[First, Second] | Rest]) :-
    split_into_pairs(Tail, Rest).

最初のルールは、空のリストがすでにペアに分割されていることを示しています。2 つ目は、ソース リストに少なくとも 2 つの項目があり、それらをペアにし、それらの後ろにテール リストをペアにした結果を挿入する必要があります。

これはideoneのデモです。

次のように、結果に角括弧を追加し、ルールの 2 番目の部分をヘッダーに移動することで、ソリューションを修正することもできます。

split_into_pairs([A,B],[[A,B]]).
split_into_pairs([A,B|T], [[A,B]|XX]) :- split_into_pairs(T, XX).

このソリューションは、空のリストをペアのリストと見なさないため、split_into_pairs([], X)失敗することに注意してください。

于 2013-06-14T15:44:32.730 に答える