最初に理解するのは:-オペレーターです。
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 番目のルールに戻ることができます。Aはa、Bです[ ]、そして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]
これが十分に詳細な説明であったことを願っています。