2016-10-21 20 views
1

私は同様の質問Sum of elements in list in Prolog needs little explanationがあると言わなければなりませんが、それでも私は混乱します。リストの要素の合計

ここにいくつかの説明が必要な以下の解決策があります。

sum([H],H). 
sum([H|T],R):-sum(T,P),R is H + P. 

私たちはsum([1,2,3]、R)を実行します。

sum([1,2,3],R) 
    sum([2,3],<unknown-1>) 
     sum([3],<unknown-2>) 

ここで、実際の合計([H]、H)を満たすか? 変数をsum([H]、H)に書きます。この場合の唯一の出力は3、 です。つまり、未知数2の場合は3です。なぜですか?

プロローグの初心者であれば、どんな回答でも大歓迎です。

+1

句([3]、)句は、定義した1つ以上の句に一致するかどうかを調べます。この場合、sum([3]、)は最初の句と一致し、unknown-2 = 3となります。また、[3] = [3 | []]しかしそれはsum([]、P)を呼び出す。だから、未知数は最初の節から値3を得ます。 – coder

答えて

5

短い答え:統一

述語句の範囲内で変数名が複数回出現する場合、すべての出現はとなります。統一の述語は=/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_memberMinList)。

真の場合、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. 

あなたはのあなたの定義でこれを行うことができますも同様である。

+0

大変感謝している@ボリス! – Caos

関連する問題