例:
firstlast([1,2,3,4,1]).
true;
firstlast([1,2,3,4]).
false;
firstlast([5,10,4,3]).
false;
exc...
問題は、述語「firstlast」でのみ再帰を使用することを許可されています。?私は本当にこれを破ろうとしましたが、最後の要素を最初の要素とチェック/比較することができないようです。
ヒントはありますか?
更新:他の述語を使用することは許可されていないため、これを試してください。
firstlast([H,H]).
firstlast([F,_|T]) :- firstlast([F|T]).
最初の述語は基本ケースを扱い、2番目の述語は3つ以上の項目のリストの2番目の要素を削除し、再帰します。
おそらく、最初と最後の要素が同じであることを意味します。dcg -notationを使用した解決策は次のとおりです。
firstlast(Xs):- フレーズ(([X]、...、[X])、Xs)。 ...-> [] | [_]、...。
firstlast([1])
成功するかどうかわからない...
再帰はfirstlast/1でしか使用できないため、ソリューションは次のようになります。
firstlast(...) :- ... .
firstlast(...) :- ... .
firstlast(...) :- ... .
....
firstlast(...) :- ... .
それらのいくつかは基本ケースに関するルールであり、それらのいくつかは問題を「食い尽くす」ルールです。この問題には1つのチェックが必要です。最初の要素と最後の要素を比較します。したがって、基本ケースでは、これら2つの要素のみが必要です。他に何も必要ありません。したがって、ソリューションは他のすべての要素を無視します
最後のヒント:次の統合パターンを使用して、リストの最初の2つの要素にアクセスできます。
foo([H1,H2|T])
とても公平な私はこれを手に入れました:
firstlast([H,_|T]) :-
(T1 = H, T1 = T) -> firstlast([H|T]).
私のコードは最後の要素と最初の要素を比較していますが、再帰は間違っています:/
上で答えたように、リスト内の1つの要素で成功することは許可されるべきではありません。imは述語「firstlast」の使用のみを許可されていますが。