参考にしたページには「次の事実を考えてみてください。
p([H|T], H, T).
"
したがって、これを事実として扱わなければなりません。つまり、述語を持つようなものです
p([H|T], H, T):- true. % or, p(L,H,T) :- L=[H|T].
ここで、クエリを実行するp([a,b,c], X, Y).
と、一方が他方の横に配置されます。
p([a,b,c], X, Y). % a query
p([H|T], H, T) :- true. % a rule's clause: _head_ :- _body_.
、[a,b,c] = [H|T]
、およびX = H
はY = T
統一方程式として扱われます。最初のものはさらに翻訳されます
a = H % list's head element
[b,c] = T % list's tail
なぜなら、リストのhead要素とリストのtail、つまり head 以外のすべての残りの要素[A|B]
を持つリストを表すからです。およびは、これらの論理変数の一般的なニーモニック名です。A
B
H
T
したがって、全体として、 、 が得られX = H = a
ますY = T = [b,c]
。
このプロセスは、クエリとルールのヘッド ( 「ファンクター」で始まり、両方とも 3 つの「引数」を持つ 2 つのもの) の統合として知られているものです。p
クエリとルールの「節」の先頭が一致し (同じファンクターと同じ数の引数を持っていた)、それらの引数はすべて、上記の置換を使用してペアごとに正常に統合されたため、そのルールの節の本体のみを証明する必要があります。 (こうして選ばれた)。
であるためtrue
、すぐに成功し、成功した置換が結果として示されます。
それがプロローグの仕組みです。
TL;DR : はい、指定さp(L,H,T)
れた listL
で呼び出すと、 headと tailに分解されます。しかし、指定された list 、 value 、および variableで呼び出すことができ、新しいリストがhead と tail から構築されます。また、も指定されている場合は、頭がで、尾が であるかどうかがチェックされます。H
T
T
H
L
L
H
T
これは、Prolog の統合が双方向であるためです。A = B
は と同じB = A
です。変数との統一はその変数を設定するようなものであり、値との統一はその値との (構造的な) 等価性をチェックするようなものです。
呼び出しp(L,H,T)
は本当に統合に相当しL = [H|T]
ます。