5

例:

firstlast([1,2,3,4,1]).
true;

firstlast([1,2,3,4]).
false;

firstlast([5,10,4,3]).
false;

exc...

問題は、述語「firstlast」でのみ再帰を使用することを許可されています。?私は本当にこれを破ろうとしましたが、最後の要素を最初の要素とチェック/比較することができないようです。

ヒントはありますか?

4

4 に答える 4

3

更新:他の述語を使用することは許可されていないため、これを試してください。

firstlast([H,H]).
firstlast([F,_|T]) :- firstlast([F|T]).

最初の述語は基本ケースを扱い、2番目の述語は3つ以上の項目のリストの2番目の要素を削除し、再帰します。

于 2012-10-10T18:13:29.780 に答える
2

おそらく、最初と最後の要素が同じであることを意味します。 -notationを使用した解決策は次のとおりです。

firstlast(Xs):-
    フレーズ(([X]、...、[X])、Xs)。

...-> [] | [_]、...。

firstlast([1])成功するかどうかわからない...

于 2012-10-10T18:15:28.210 に答える
0

再帰はfirstlast/1でしか使用できないため、ソリューションは次のようになります。

firstlast(...) :- ... .
firstlast(...) :- ... .
firstlast(...) :- ... .
....
firstlast(...) :- ... .

それらのいくつかは基本ケースに関するルールであり、それらのいくつかは問題を「食い尽くす」ルールです。この問題には1つのチェックが必要です。最初の要素と最後の要素を比較します。したがって、基本ケースでは、これら2つの要素のみが必要です。他に何も必要ありません。したがって、ソリューションは他のすべての要素を無視します

最後のヒント:次の統合パターンを使用して、リストの最初の2つの要素にアクセスできます。

foo([H1,H2|T])
于 2012-10-10T18:18:06.980 に答える
0

とても公平な私はこれを手に入れました:

firstlast([H,_|T]) :-
(T1 = H, T1 = T) -> firstlast([H|T]).

私のコードは最後の要素と最初の要素を比較していますが、再帰は間違っています:/

上で答えたように、リスト内の1つの要素で成功することは許可されるべきではありません。imは述語「firstlast」の使用のみを許可されていますが。

于 2012-10-10T18:32:39.950 に答える