2013-04-27 88 views
1

我對prolog非常陌生,並且在理解某些基本算術時遇到了一些問題。我想創建一個遞歸的乘法器。 IE:3 * 4 = 3 + 3 + 3 + 3 = 12.Prolog遞歸算術

我把它通過SWIPL的跟蹤命令,並且在遞減計數時失敗。

這是我到目前爲止的代碼,但它不起作用。

multn(_,0,0). 
multn(_, Count ,Return) :- Count is Count-1, 
          Return is 0, 
          multn(_,Count,Return), 
          Return is Return + _. 

編輯:由基於你說的關於「是」的功能是什麼一些新的變化。

multn(_, Count ,Return) :- Count1 is (Count-1), 
          multn(_,Count1,Return1), 
          Return is (Return1 + _). 

現在是使它一路下滑遞歸鏈的基本情況,當它啓動時,它的方式備份失敗就試圖待辦事項回報率=(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 

最後編輯:最後算出來了,使用_引起了奇怪的值變化。謝謝你的幫助。

+0

是的,所有'_'s * *不同*,即使在一個規則內。你應該命名你的變量 - 具有相同名稱的變量是相同的變量。 'X *(N + 1)= X * N + X'中的所有X都必須相同。 – 2013-04-28 09:23:52

回答

2

看起來你不明白Prolog是如何工作的。

要理解的關鍵是CountCount is Count-1是相同的,它們必須具有相同的值。它就像代數中的變量 - 方程中的所有X都意味着相同的值。所以Count is Count-1將永遠失敗。

Return變量類似的問題。

在Prolog中,您必須引入新的變量來完成您的目標,如NewCount is Count-1