4

私は「プロローグの芸術」の本を読んでいて、「補助述語を使用せずに、SumがListOfIntegersの合計である場合に成立する関係sum(ListOfIntegers、Sum)を定義する」という演習を見つけました。このソリューション:

sum([],Sum).
sum([0|Xs], Sum):-sum(Xs, Sum).
sum([s(X)|Xs], Sum):-sum([X|Xs],s(Sum)).

これは、私が望んでいたとおりには機能しません。

?- sum([s(s(0)),s(0),s(s(s(0)))],X).
true ;
false.

私はXが

s(s(s(s(s(s(0))))))

問題は、最初の「反復」で「Sumを0に初期化する」必要があることだと思いましたが、それは非常に手続き的であり、残念ながら、私はそれを機能させるためのプロローグにはあまり適していません。何かアイデアや提案はありますか?

4

3 に答える 3

4

あなたの最初の節は読むべきです

sum([], 0).

この変更により、空虚なtrueリターンがなくなり、1つの問題が残ります。3番目の句は、合計のロジックを逆にします。そのはず

sum([s(X)|Xs], s(Sum)) :- sum([X|Xs], Sum).

なぜなら、s/1左の引数の項の数sum/2は、右の引数の項の数と等しくなければならないからです。

于 2012-03-14T18:54:34.307 に答える
3

問題を特定する最良の方法は、最初にクエリを単純化することです。

?- sum([0],S).

true
?- sum([],S).

true

それらのためにさえ、あなたは誰でもするであろう答えとして得ます S。好き

?- sum([],s(s(0))).
yes

あなたの事実によってのみ処理できるので[]、エラーはまさにその事実にあるに違いありません。あなたは次のように述べました:

sum([], Sum).

つまり、の合計は[]何でもかまいません。あなたはおそらく0を意味しました。

最後のルールに別のエラーが隠れています...最初のエラーを修正すると、次のようになります。

?- sum([0],Sum).
Sum = 0
?- sum([s(0)],Sum).
no

ここでは、最後の節が責任を負います。それは読みます:

sum([s(X)|Xs], Sum):-sum([X|Xs],s(Sum)).

再帰的ルールは、Prologで読むのが比較的難しいです。それらを理解する最も簡単な方法は、を見て、:-これが矢印←(したがって右から左への矢印)であるべきであることを理解することです。

ただし、右側の目標が正しい場合
左側にあるものを結論付けます

したがって、非公式の文章と比較して、矢印は反対方向を指しています!

このクエリでは、0を0に置き換えて次のインスタンス化を検討できXsます。[]X

sum([s(0)| [] ], Sum) :- sum([0| []],s(Sum)).

したがって、このルールは右から左になります。提供された場合、真です...ただし、それが成り立つだけで、その目標は成り立たないことsum([0],s(Sum))はわかっています。sum([0],0)したがって、このルールは適用されません。あなたが意図したのはむしろ反対でした:

sum([s(X)|Xs], s(Sum)):-sum([X|Xs],Sum).
于 2012-03-14T18:56:16.570 に答える
0

私はあなたの論理に実際に従っていません、すべての外見上の無関係なs(X)構造が浮かんでいるのはどうですか。

このようなことをするのはもっと簡単で簡単ではないでしょうか?

まず、ソリューションを平易な英語で定義します。

  • 空のリストの合計は0です。
  • 空でないリストの合計は、リストの先頭をリストの末尾の合計に追加することによって取得されます。

その定義から、プロローグは直接続きます:

sum( []     , 0 ) .  % the sum of an empty list is 0.
sum( [X|Xs] , T ) :- % the sum of an non-empty list is obtained by:
  sum( Xs , T1 ) ,   % - first computing the sum of the tail
  T is X + T1        % - and then, adding that the to head of the list
  .                  % Easy!
于 2012-03-15T22:46:31.943 に答える