最初に理解するのは:-
オペレーターです。
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
がであることを意味します。であることもわかっています。では、何が何であるかを理解するために、前提条件を調べる必要があります。に変換されます。ここで、最初のルールを使用して、それが でなければならないことがわかります。これで、 が と同じである ことがわかりました。したがって、 でなければなりません。a
D
[b]
C
[b]
B
append(B, C, D)
append(B, [b], [b])
B
[ ]
[A|B]
[a|[ ]]
[a]
X
[a]
これが十分に詳細な説明であったことを願っています。