0

これは、教授の講義で例として挙げられました。

append([ ], A, A).
append([A|B], C, [A|D]) :- append(B,C,D).

Build a list:

?- append([a],[b],Y).
Y = [ a,b ]

Break a list into constituent parts:

?- append(X,[b],[a,b]).
X = [ a ]
?- append([a],Y,[a,b]).
Y = [ b ]

私はそれを把握しようとして3時間費やしましたが、できません。このスライドの前にあるプロローグの概念に問題はありませんでした。これ以上の説明はありません。他の情報はありません。これですべてです。誰かがこの手順がどのように機能するかを教えてくれるなら、死が私たちを分かつまで彼らを愛したい.

4

2 に答える 2

2

最初に理解するのは:-オペレーターです。

this_will_be_true :- if_this_is_true

基本的に右にあるもの:-が前提です。良い例は次のとおりです。

sibling(X, Y) :- parent_child(Z, X), parent_child(Z, Y).

これは基本的に、Z が X と Y の両方の親であるような親 Z が存在する場合、X と Y が兄弟であることを意味します。

append([ ], A, A).

この行は基本的に、空のリストに何かを追加すると何かが返されることを意味します。これは再帰の基本ケースです。

append([A|B], C, [A|D]) :- append(B,C,D).

この行は、C を B に追加すると D が返されるとすると、A と B を含む既存のリストに C を追加すると、A と D を含むリストが返されることを意味します。

Build a list:

?- append([a],[b],Y).
Y = [ a,b ]

つまり、ここで何が起こっているかというと、Prolog は、Y与えられた 2 つの初期値から 2 つの規則を満たす唯一の可能な値を返すということです。これがどのように起こるかを考えてみましょう。これは、最初に 2 番目のルールによって評価される必要があります。そう[A|B]です。[a]_ C_[b]

その[A|B]ため、最初のルールに戻る必要があります。Bこれは が空のリストであるためです (それは です[ ])。最初の規則は、基本的に、次のように記述できることを[a]示して[a|[ ]]おり、それらは同じものです。これで、2 番目のルールに戻ることができます。AaBです[ ]、そしてCです[b]

それでは、 の前提条件を確認してみましょうappend(B, C, D)。これはappend([ ], [b], D)。もう一度、最初のルールを使用すると、Dもであることがわかり[b]ます。

したがってY、2 番目のルール定義により、 は[A|D]です。が であることがわかったので、Dがであることが[b]わかります。Y[a, b]

基本的には同じものなので、バラバラに分解するのは1つだけです。

?- append(X,[b],[a,b]).
X = [ a ]

Xしたがって、ここでは、ステートメントが true を返すように、Prolog は の唯一の可能な値を返します。2番目のルールを見てみましょう。だから私たちはそれが であることを知ってい[a, b]ます[A|D]。これは、とAがであることを意味します。であることもわかっています。では、何が何であるかを理解するために、前提条件を調べる必要があります。に変換されます。ここで、最初のルールを使用して、それが でなければならないことがわかります。これで、 が と同じである ことがわかりました。したがって、 でなければなりません。aD[b]C[b]Bappend(B, C, D)append(B, [b], [b])B[ ][A|B][a|[ ]][a]X[a]

これが十分に詳細な説明であったことを願っています。

于 2012-09-28T05:29:28.640 に答える
0

以下、私なりの理解です。

あなたのコードは List の追加操作を記述しています。

最初に、プロローグのリストとは何か、および の意味を理解するのに役立つ略語を次に示します|

[X1|[...[Xn|[]] = [X1,...Xn]

また、append(A, B, C) は、リスト B を A に追加すると結果が C になることを意味します。

空のリストに A を追加すると、A が得られます。

append([ ], A, A).

Y を X に追加する場合は、append(X, Y, _) とします。X が [] でない限り、プロローグは何をすべきかを知りません。次のように言って、プロローグするようルールに指示する必要があります。

append([A|B], C, [A|D]) := append(B, C, D)

次に、prolog は X を form に分割しようとし[A|B]ます。その場合、Y はA|D、D が B に追加された C によって定義されたリストである場合に、append(B, C, D)この事実についてプロローグに伝える方法です。

于 2012-09-28T05:27:20.937 に答える