3

私が理解していることから、宣言型パラダイムは、解決策に到達する方法ではなく、解決策に到達するために何が重要かを示していますが、手続き的に考えることに慣れているため、しばしば混乱します...

したがって、解決策は次のとおりです。

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

これは、この単純なプログラムの宣言的な解釈です。

1) X がこのリストのヘッドであることが TRUE の場合、X はリストに属します(リストのヘッド要素がX 要素と統合されている場合、リスト内にあるかどうかがわかります)

2) 最初の事実が真でない場合 (X が最初のリスト要素と一致しない場合)、プログラムは 2 番目のルールを実行しようとします (おそらく、ここで解釈の問題があるかもしれません)。このルールは次のように述べています: ルールの本体が true の場合、ヘッドは true です)

ルールの頭は次のように言います: X はリストの TAIL に属します (リストの最初の要素を気にしないことを示すために_文字を使用して無名変数を使用します)

X 要素がリストの末尾に属していることが TRUE である場合、X 要素が先頭のないリストに属していることは TRUE です。

このプログラムの正しい宣言的および論理的解釈ですか、それとも何か不足していますか?

4

3 に答える 3

2

私が試してみましょう:

mymember(X, [X|_]).

Xがリストの最初の要素である場合、Xはリストのメンバーです。

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

Xがリストの残りのメンバーである場合、Xはリストのメンバーです。

(紙の)プログラマーの履歴書のスタックを渡して、「これらの中にPrologを知っているプログラマーがいるかどうかを確認してください」と言ったとします。

職業はなんですか?あなたは一番上の履歴書を見ます。そのプログラマーがPrologを知っていれば、それで終わりです。

そうでない場合、そのような履歴書が存在する唯一の方法は、それがスタックの残りの部分にあるかどうかです。

于 2013-03-19T02:08:16.847 に答える
2

それらを排他的またはとして読んでいますが、実際には包括的またはです。1) と 2) はどちらも正しいですが、「最初の事実が真でない場合」という接続詞を除いては正しいです。2) が成立するために 1) が false である必要はありません。言い換えると、Xがリストの先頭であり、リストの末尾に存在する (たとえばmymember(a, [a, b, a]).

編集: コメントへの返信。

ここには言葉の壁の問題があるので、あなたの質問にイエスとノーで答えてみましょう。

はい、使用;すると別の答えが生成されるということは、Prolog が代替の答えを計算できたという証拠です。ある意味では、;手動でバックトラックをトリガーしますが、別の意味では、これがあなたが望む答えであるかどうかを Prolog が尋ねて、「はい」または「いいえ」と言うことができます。プロローグに言っ;ていると言うと、本質的には「これは正しい答えではない」ということです。しかし、これがバックトラッキングをトリガーする唯一の方法ではありません。実際、ほとんどの場合、手動でトリガーすることはまったくありません。

たとえば、これを見てみましょう。

even_member(X, L) :- member(X, L), 0 is X mod 2.

?- even_member(X, [1,5,17,23,4,19]).
X = 4 ;
false.

ここで、X が L のメンバーであり、X mod 2 = 0 の場合、X は L の even_member であると宣言的に言う述語を定義しました。この述語を使用すると、答えが得られましたX = 4。それから私たちは、これは正しい答えではないと言うように迫り;ました.Prologは、これ以上の答えはないと言いました. しかし、内部的には、 member(X, L) は、述語の 2 番目の部分を満たす要素を見つける前に 5 回バックトラックしました。つまり、このステートメント0 is X mod 2は、1、5、17、および 23 が同じように「間違っている」ことを Prolog に伝えます。;インタラクティブに押すことで行います。別の答えが欲しいと言ったとき、同じ機械を使用したため、Prolog は member(X, L) に戻り、19 を見つけ、19 が 2 で割り切れないことを発見し、あきらめました。

Prolog は 6 回バックトラックしましたが、そのうち 5 回は 1 つの答えを得るだけでした。一度だけバックトラックを依頼しましたが、たまたまそれが最後の可能性だったので、再度バックトラックすることはありませんでした。

于 2013-03-18T16:20:00.837 に答える
0

ポイント 2) が成り立たない: Prolog はルールを試して解を探します。

ただし、データベース内で厳密に指定された順序で検索するため、解空間の深さ優先検索が行われます。

私は読むだろう

X は、それが最初の要素である場合 (すなわち、ヘッドを統一する、節 1)、または末尾のメンバーである場合 (節 2)、リストのメンバーです。

于 2013-03-18T16:23:43.167 に答える