2

ここに私が理解していないプラスコードがあります

plus(0,X,X):-natural_number(X).
plus(s(X),Y,s(Z)) :- plus(X,Y,Z).

与えられた間:

natural_number(0).
natural_number(s(X)) :- natural_number(X).

この再帰がわかりません。私が持っている場合、plus(s(0),s(s(s(0))),Z)どうすれば答えを得ることができ1+3=4ますか?

最初のコードについて説明が必要です。再帰を止めようとしplus(0,X,X)ますが、間違っていると思います。

4

3 に答える 3

4

それでは、から始めましょうnatural_number(P)。これを「Pは自然数」と読みます。が与えられnatural_number(0).、これは0が常に自然数であることを示しています (つまり、それが事実であるために満たさなければならない条件はありません)。が自然数である場合、それは自然数であるnatural_number(s(X)) :- natural_number(X).ことがわかります。これは自然数の通常の帰納的な定義ですが、プロローグ「Q := P」を「P が真であれば Q も真」と読むので、「逆向き」に書きます。s(X)X

を見てみましょうplus(P, Q, R)plusこれを「 P と Q の和が R に等しい場合に真」と読みます。次に、与えられたケースを見ていきます。

  1. plus(0,X,X) :- natural_number(X).. X が自然数の場合、X に 0 を加算すると X と読み替えられます。これが帰納的な基本ケースであり、加算の自然な定義です。
  2. plus(s(X),Y,s(Z)) :- plus(X,Y,Z).「X の後継者を Y に足すと、Y に X を足すと後継者 Z になる」と読みます。 = Z」、これも非常に自然です。

plus(s(0),s(s(s(0))),z)ですから、「 がある場合、どうすれば 1+3=4 の答えを得ることができますか?」という直接的な質問に答えるために、帰納法の各ステップで何かを z で統一する方法を考えてみましょう。

  1. の 2 番目の定義を適用しplusます。これは、クエリと統合する唯一のものであるためです。plus(s(0),s(s(s(0))), s(z'))が真である場合、plus(0, s(s(s(0))), z')は真です。z
  2. プラスの最初の定義を適用します。これが唯一の統一定義です: plus(0, s(s(s(0))), z')if z'iss(s(s(0)))s(s(s(0)))is は自然数です。
  3. natural_number数回の定義をほどいて、s(s(s(0)))それが正しいことを確認してください。
  4. したがって、 が と統一され、 が と統一されている場合、全体的なステートメントs(s(s(0)))z's(z')ですz

したがって、インタプリタは true を返しz' = s(s(s(0)))ます。では、4です。z = s(z')z = s(s(s(s(0))))z

于 2011-06-12T15:48:02.593 に答える
1

のような数値項は得られません1+3=4。得られるのは、s/1それ自体を任意の深さに埋め込むことができ、したがって任意の自然数を表すことができる項だけです。このような項を ( を使用して) 組み合わせるplus/3ことで、合計を実現できます。

の定義はplus/3、SWI-Prolog のビルトイン(用語plus/3ではなく整数で動作します) とは何の関係もないことに注意してください。s/1

?- help(plus).
plus(?Int1, ?Int2, ?Int3)
    True if Int3 = Int1 + Int2.
    At least two of the three arguments must be instantiated to integers.
于 2011-06-12T15:46:04.097 に答える
1

そのコードは、Peano 算術における加算の単純な実装です。

ペアノ算術では、定数0と単項関数を使用して自然数を表しますs。これs(0)は 1 の表現であり、s(s(s(0)))は 3 の表現です。そして、4 の表現であるplus(s(0),s(s(s(0))),Z)が得られますZ = s(s(s(s(0))))

于 2011-06-12T15:51:07.703 に答える