2016-11-28 6 views
0

私は2つの引数を追加して、結果を出すことになっている、次の知識ベースを、持っている:Prologの再帰句

add(0,X,X). 
add(succ(X),Y,succ(R)):- add(X,Y,R). 

今これは私のクエリです:

?- add(succ(succ(succ(0))), succ(succ(0)), Result). 

0はありません最初の引数で統一されないので、2番目のadd/3節に移動します。ここに私が理解できないことがあります。本(LPN)は、一番外側のsucc要素が最初の引数から外されていると私に伝えていますが、なぜその理由が分かりませんか?私の心の中には、succファンクタが追加されています。誰かがそれを剥ぎ取っている理由を説明してもらえますか?

ありがとうございます!

Luuk

+0

その本の詳細を追加してください。LPNは – false

答えて

2

は、あなたのトップレベルのプロンプトでこれを試してみてください。

?- succ(succ(0)) = succ(X). 

あなたが<Enter>を入力する前に、あなたは解決策がどうなるかだと思いますか?


についてのブックトークが第二節の頭部、add(succ(X), ...)と再帰呼び出しadd(X, ...)の間で起こることを「ストリッピング」。

「ストリッピング」についての追加の価値は実際にはわかりません。 。実際に何が起こるかはadd/3への最初の引数は(ので、すべてのことで何かがsucc(<Whatever>)のように見えます、そして、Xこの<Whatever>でファンクタsucc/1との用語統一されている場合は、そのクエリの場合は次のとおりです。

?- add(succ(succ(succ(0))), succ(succ(0)), Result). 

<Whatever>Xsucc(succ(0))で統一され、これはadd/3への再帰呼び出しの最初の引数であるので、succ(succ(0))です。

+0

は、私が「、どうもありがとうございまし十分ではありませんようやくそれがどのように動作するかを見ることができましたあなたが私に与えた質問に! –

+2

's(X)'は: "あなたが入力する前に" – false

+1

@false彼らのために懸命に働いています 's(X)' s –