短い答え:統一。
述語句の範囲内で変数名が複数回出現する場合、すべての出現はとなります。統一の述語は=/2
であり、演算子として宣言されているので、=(A, A)
とA = A
は同じ意味です。さらに重要なことは、この:
=(Term, Term).
が=/2
の定義である(!the documentationを参照)
あなたの例では、あなたが言う句があります。
sum([H], H).
をこれは意味:
0の最初の引数は要素が1つのリストで、sum/2
の2番目の引数はその要素です。
用語の統一はプロローグで、このような基本的な動作であるため、通常、それは例えばとして、明示的に綴られていません。
sum/2
の最初の引数は正確に一つの要素を持つリストである場合には、その要素と第2引数sum/2
が互いに統合されます。
少なくともSWI-Prologのドキュメントでは、統一が関係する場合、通常、「XとYは統一されている」ではなく「XはY」で記述されます。 the documentation of min_member/2
、例えば、以下を参照してください
min_member(Min
、List
)。
真の場合、Min
は標準語順の最小のメンバーです。 List
が空の場合は失敗します。
これは、明示的に統一が使用されていることを教えていない、それから、次の動作は次のとおりです。
?- min_member(3, [1,2,X]).
X = 3.
私はかつてasked a question about this、私はそれがあまりにも混乱したため。
ちなみに、現在の定義sum/2
では、統一の仕方によって驚きを得ることができます。見て:
?- sum([1.5, 2.5], Sum).
Sum = 4.0 ; % unnecessary choice point but at least correct
false.
?- sum([1.5, 2.5], 4).
false. % Oops!
を同じ問題からSWI-Prolog library implementation被る:
?- sum_list([1.5, 2.5], Sum).
Sum = 4.0. % no choice point, at least
?- sum_list([1.5, 2.5], 4).
false. % Oops!
回避策は算術比較をした、最初で第二引数に自由変数を残し、その後、=:=/2
を使用することです数字:
?- sum_list([1.5, 2.5], Sum), Sum =:= 4.
Sum = 4.0.
あなたはのあなたの定義でこれを行うことができますも同様である。
句([3]、)句は、定義した1つ以上の句に一致するかどうかを調べます。この場合、sum([3]、)は最初の句と一致し、unknown-2 = 3となります。また、[3] = [3 | []]しかしそれはsum([]、P)を呼び出す。だから、未知数は最初の節から値3を得ます。 –
coder