1

リスト内の極大値を見つけようとしています。基本的には、リストの前の要素とその後の要素よりも大きい値を見つけます。結果は、すべての極大値のリストになるはずです。

例: そのため、クエリlocal_maximum([3,2,3,4,5,2,7,3,6,5], Answer)は応答する必要がありますAnswer=[5,7,6](以降5>4 , 5>2... 7>2, 7>3など..)

私の論理は、リスト内の要素が 3 つになるまで再帰呼び出しを続けますか? 中央の要素が左右の要素よりも大きいかどうかを確認し、大きい場合はリストに追加します。

また、私の意図は、再帰呼び出しツリーを上っていくときに、再帰呼び出しツリーの 2 番目の要素が左右の要素よりも大きいかどうかを常に確認したいということです。
すなわち

1,3,5,2,1
|
3,5,2,1
|
5,2,1
BASE CASE
checks if 2 is greater than 5, and 1.... append nothing...
|
3,5,2,1
checks if 5 is greater than 3 and 2, append 5... 

すぐ..

/*base case stop if it reaches 3 elements*/
local_maximum([X,Y,Z], Answer):- Y>X, Y>Z, Answer is Y. 
local_maximum([X,Y,Z], []):- Y<X, Y<Z.

local_maximum([H|T], Answer):-
local_maximum(T, Answer), append([], Answer, Answer).

これについてどうすればいいのかわかりません...私の英語でごめんなさい。よろしく、


解決しました。

リストにアクセスしながら確認し、適合する要素だけを保存できます。

local_maximum([X,Y,Z|Xs], [Y|Ms]) :-
Y>X, Y>Z,
local_maximum([Z|Xs], Ms).

次に、スキップと基本ケース ルールを追加します。スキップ ケースの書き方は上記のルールに影響し、ここにカットを配置する必要があります。これは、Prolog がリクエストに応じて代替案を検索するためです。追加されたカットにより、「プログラム」の可読性が向上すると思います。

4

2 に答える 2

2

リストにアクセスしているときに確認して、次の要素だけを保存できます。

local_maximum([X,Y,Z|Xs], [Y|Ms]) :-
  Y>X, Y>Z,
  local_maximum([Z|Xs], Ms).

次に、スキップルールとベースケースルールを追加します。スキップケースの書き方は上記のルールに影響し、ここにカットを配置する必要があります。これは、Prologリクエストに応じて代替案を検索するためです!カットを追加することで、「プログラム」の読みやすさが向上すると思います。

私はカットでバージョンをテストしました:

?- local_maximum([3,2,3,4,5,2,7,3,6,5], Answer).
Answer = [5, 7, 6].

?- local_maximum([1,2,1,2,1], Answer).
Answer = [2, 2].
于 2013-02-16T07:04:56.667 に答える