このプロローグクエリがそのように機能する理由を誰かが説明してくれますか? 定義は次のとおりです。
add(0,Y,Y).
add(succ(X),Y,succ(Z)):- add(X,Y,Z).
これを考えると:
?- add(succ(succ(succ(0))), succ(succ(0)), R).
クエリのトレースは次のとおりです。
Call: (6) add(succ(succ(succ(0))), succ(succ(0)), R)
Call: (7) add(succ(succ(0)), succ(succ(0)), _G648)
Call: (8) add(succ(0), succ(succ(0)), _G650)
Call: (9) add(0, succ(succ(0)), _G652)
Exit: (9) add(0, succ(succ(0)), succ(succ(0)))
Exit: (8) add(succ(0), succ(succ(0)), succ(succ(succ(0))))
Exit: (7) add(succ(succ(0)), succ(succ(0)),
succ(succ(succ(succ(0)))))
Exit: (6) add(succ(succ(succ(0))), succ(succ(0)),
succ(succ(succ(succ(succ(0))))))
そのチュートリアルで私を最も混乱させたのは、最初の引数で succ が取り除かれ、再帰するという事実でした。ただし、再帰中、R は成功を収めます...どうやって?! また、最初の出口 (9) のゼロはどこから来ますか? 私はプロローグが初めてで、宿題のために言語を理解しようとしています。どんな助けでも大歓迎です。
注: 興味のある方のために、このチュートリアルへのリンクはhttp://www.learnprolognow.org/lpnpage.php?pagetype=html&pageid=lpn-htmlse9です。