3

プロローグを使用して、リストが与えられたときに、リストの最初の要素がリストの最後の要素と等しいかどうかを判断するルールを作成する必要があります。以下、私の考えです。

The Base Cases:
1) If The Parameter Is Not A List: Return False
2) If The Parameter Is A List But Empty: Return False 
3) If The Parameter Is A List But Has One Element: Return False

The Recursive Step:
Recursively Going Through The List Getting The 
First Element And TheLast Element Then Compare

fela() :- false.                             <-- Base Case One
fela([]):-false.                             <-- Base Case Two
fela([H]):-false.                            <-- Base Case Three
fela([H|T]):- H1 is H, H1 == T, fela(T,H1).  <-- Recursive Step

ベローは、最初、最後、メンバーの関数です

first(F, [F|_]).
last(L, [H|T]) :- last(L, T).

member(X, [X|_]).
member(X, [_|T]) :- member(X, T).

再帰的なステップに問題があります。最初の要素を保存する方法がわかりません。リストを走査して最後の要素を取得し、結果を比較して真/偽の答えを求めます。誰か助けてくれませんか

ありがとう、

エリック:)

4

1 に答える 1

5

ここに簡単なものがあります:

fela(L) :- first(E, L), last(E, L).

それを 1 分間じっと見つめて、深く浸透させてください。

実際、それは正しいでしょうが、そうでlast/2はありません。成功するベースケースなしで単にリストをトラバースするだけです。正しいものは次のlast/2ようになります。

last(L, [L]).
last(E, [_|L]) :- last(E, L).

あなたの事例分析には、多くの混乱した考えが見られます。1 つには、Prolog では、明示的に true と false を返すことはありません。一致するものを一致させるだけで、残りは失敗です。リストを扱う場合、空のリストの基本ケースと、要素とリストの残りの誘導ケースを自動的に継承します。fela/1最初の要素が何であったかを思い出す方法がないため、これは最初から実装するのに十分ではありません。したがって、ゼロから構築する場合は、ヘルパー述語が必要になるため、最初の要素を引き続き渡すことができます。次のようになります。

fela([H|T]) :- fela(H, T).

fela(First, [First]).
fela(First, [_|Xs]) :- fela(First, Xs).

リストを処理するための 1 つの基本ケースと 1 つの帰納的なケースの分析を保持していることに注意してください。これは、再帰的なデータ構造を処理するときの通常の状況です。first/2いずれかのケースに興味がないため、ルールに従わない場合の良い例です。first/2andから述語を作成するとlast/2、ケース分析の問題を完全に回避できます。これは、(私の意見では) 実際に起こることが多いことです。

ここで、さらにコメントするために、ここであなたのアイデアのいくつかを選び出したいと思います。まず、H1 is H間違いなくあなたが望むものではありません。is/2算術式の削減専用です。左側に変数、右側に式が常に存在するか、意味がありません。ここで何らかの代入を行おうとしていH1 = Hますが、Prolog には変数がありますが、 assignables がないため、ここでも役に立ちません

H1 is H, H1 == Tは、信じられないことに、H がリストの先頭であり、末尾と同等であると述べています。末尾はリストであり、先頭は要素であるため、これは実際には不可能です。それが真である状況を作成できたとしても、この述語にとって興味深いものではないことは間違いありません。ここでの再帰的なステップは本当に奇妙です。

ケース分析のもう 1 つの問題は、ケース #3 が当てはまるはずです。With [X],Xはリストの最初と最後の要素の両方であるfela/1ため、すべての 1 要素リストに自明に当てはまるはずです。

私は追加の研究を提唱します。もう少し読むと修正されるかもしれないという奇妙な考えがあると思います。

于 2013-07-19T19:32:27.763 に答える