私は最近プロローグの学習を始めましたが、再帰的なルールでは苦労しています。私は単純なルールを理解するが、私は、リスト内のすべての要素の合計を与えるプログラムの発見この例で問題を抱えている:私はこれをトレース場合誰もがこの再帰的プログラムでプロローグのステップを説明できますか?
addup([], 0).
addup([FirstNumber | RestOfList], Total) :-
addup(RestOfList, TotalOfRest),
Total is FirstNumber + TotalOfRest.
は今、私は次のGET:
[trace] ?- addup([3, 5, 7], Total).
Call: (7) addup([3, 5, 7], _G322)
Call: (8) addup([5, 7], _L1)
Call: (9) addup([7], _L2)
Call: (10) addup([], _L3)
Exit: (10) addup([], 0) % I understand what it does till here
^ Call: (10) _L2 is 7+0
^ Exit: (10) 7 is 7+0
Exit: (9) addup([7], 7)
^ Call: (9) _L1 is 5+7
^ Exit: (9) 12 is 5+7
Exit: (8) addup([5, 7], 12)
^ Call: (8) _G322 is 3+12
^ Exit: (8) 15 is 3+12
Exit: (7) addup([3, 5, 7], 15)
Total = 15.
私は最初のいくつかのステップを理解しています。それは元のリストが空で最初の事実と一致するまで頭を切って新しいTotalOfRestを作る。それは3番目のTotalOfRest(私はそれを_L3と呼んでいます)を0に等しくします。 しかし今は何ですか?プロローグは、L2が7 + 0に等しいというステップをどのようにしますか?私はプロローグがバックトラックを開始することを理解しますが、その結論に達するものと一致するのは何ですか?合計は今7ですか?または、TotalOfRestのような異なる値を持つ3つの異なる合計がありますか? RestofListは[]と同じですが、FirstNumberはまだ7ですか?
基本的に:プロローグはL3を最終的な結論までどのようにして得たのでしょうか?
私は非常に新しいので、誰かが私のためにそれを説明することができます本当にゆっくりと、私はそんなに感謝します!あなたの再帰呼び出しは、新しい変数を導入し
ああ、今すぐ取得!私はTotalがそれ以上のRestOfTotalと同じであることに気付かなかった。あなたの明確な答えをありがとう! – Rose