私はプロローグが初めてで、いくつかの基本的な算術を理解するのに問題があります。再帰的に乗算するファンクターを作成したいと考えています。IE: 3*4 = 3+3+3+3 = 12.
SWIPL の trace コマンドを実行すると、Count をデクリメントすると失敗します。
ここに私がこれまでに持っているコードがありますが、うまくいきません。
multn(_,0,0).
multn(_, Count ,Return) :- Count is Count-1,
Return is 0,
multn(_,Count,Return),
Return is Return + _.
編集:「is」の機能についてあなたが言ったことに基づいて、いくつかの新しい変更を加えました。
multn(_, Count ,Return) :- Count1 is (Count-1),
multn(_,Count1,Return1),
Return is (Return1 + _).
現在、再帰チェーンをベースケースまでずっと下っており、元のケースに戻って開始すると、Return is (Return1+ _) を実行しようとして失敗します。_変数を変更しているようです。ここに私のトレースがあります:
[trace] ?- multn(3,2,X).
Call: (6) multn(3, 2, _G388) ? creep
^ Call: (7) _L142 is 2+ -1 ? creep
^ Exit: (7) 1 is 2+ -1 ? creep
Call: (7) multn(_L160, 1, _L143) ? creep
^ Call: (8) _L163 is 1+ -1 ? creep
^ Exit: (8) 0 is 1+ -1 ? creep
Call: (8) multn(_L181, 0, _L164) ? creep
Exit: (8) multn(_L181, 0, 0) ? creep
^ Call: (8) _L143 is 0+_G461 ? creep
ERROR: is/2: Arguments are not sufficiently instantiated
^ Exception: (8) _L143 is 0+_G461 ? creep
Exception: (7) multn(_L160, 1, _L143) ? creep
Exception: (6) multn(3, 2, _G388) ? creep
最後の編集: _ を使用すると、値の奇妙な変化が引き起こされていました。ご協力いただきありがとうございます。