1

私はプロローグが初めてで、いくつかの基本的な算術を理解するのに問題があります。再帰的に乗算するファンクターを作成したいと考えています。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

最後の編集: _ を使用すると、値の奇妙な変化が引き起こされていました。ご協力いただきありがとうございます。

4

1 に答える 1

2

Prolog の仕組みを理解していないようです。

理解すべき重要な点は、どちらも同じCountCount is Count-1あり、同じ値を持つ必要があるということです。代数の変数のようなものです。方程式内のすべての X は同じ値を意味します。だからCount is Count-1必ず失敗します。

Return変数に関する同様の問題。

Prolog では、 のように、意図したことを行うために新しい変数を導入する必要がありますNewCount is Count-1

于 2013-04-27T22:42:05.433 に答える