2012-03-02 41 views
-1

我是Prolog的新手,在修復第一個程序的錯誤時遇到了一些困難。Prolog Basic遞歸部門

程序要求是它使用遞歸分割2個輸入,如果分數大於除數,則返回0,忽略餘數。

%Author: Justin Taylor 

testquotient :- 
    repeat, 

    var(Divident), var(Divisor), var(Answer), var(End), 

    write('Enter Divident: '), 
    read(Divident), 

    write('Enter Divisor: '), 
    read(Divisor), 

    quotient(Divident, Divisor, Answer), 
    nl, 
    write('Quotient is = '), 
    write(Answer), 
    nl, 

    write('Enter 0 to quit, 1 to continue: '), 
    read(End), 

    (End =:= 0),!. 

    quotient(_, 0, 'Undefined'). 
    quotient(0, _, 0). 
    quotient(Divisor == Divident -> Answer = 1). 
    quotient(Divisor < Divident -> Answer = 0). 

quotient(Divident, Divisor, Answer) :- 
    (Divisor > Divident -> Divisor = Divisor - Divident, 
    quotient(Divident, Divisor, Answer + 1); 
    Answer = Answer). 
+0

這功課嗎? – 2012-03-02 01:55:22

+3

需要修復的錯誤是什麼? – 2012-03-02 20:51:34

回答

1

首先,請閱讀is。在SWI-Prolog的提示下鍵入help(is).。仔細閱讀關於「算術」的全部內容。其次,quotient的前幾個子句完全是非基本的,無效的語法。我會告訴你如何重寫其中之一,你必須做其他自己:

%% WRONG: quotient(Divisor == Divident -> Answer = 1). 
quotient(Divisor, Divident, Answer) :- 
    Divisor =:= Divident -> Answer = 1. 
%% WRONG: quotient(Divisor < Divident -> Answer = 0). 
.... 

注意使用=:=代替==

您的quotient最後一句話,看起來幾乎就在乍看之下,保存爲主要失禮:序言的統一,=,是,重複,賦值運算符!我們不會更改分配給邏輯變量的值(如果X 5,那麼它有什麼改變?它就是這樣)。不,相反,我們定義邏輯變量,這樣

(Divisor > Divident -> NewDivisor = Divisor - Divident, 

我們用在遞歸調用,

%% WRONG: quotient(Divident, NewDivisor, Answer + 1) ; 

但這是錯的太多,w.r.t.新的Answer。如果你在你的路上添加1(因爲你從Divisor減去Divident- btw不應該是相反的方式??檢查你的邏輯或至少換掉你的名字,「除數」就是分開)這意味着你應該提供初始值。但你似乎爲0供給終值,這意味着你應該從遞歸深處建立在你的方式你的結果備份:

%%not quite right yet 
quotient(Divident, NewDivisor, NewAnswer), Answer = NewAnswer + 1 ; 

接下來,Answer = Answer總是成功。在這種情況下我們只寫true

最後,你真的要在每個遞歸步驟使用is,而不是隻在最後一刻:

(Divisor > Divident -> NewDivisor is Divisor - Divident,   %% use "is" 
    quotient(Divident, NewDivisor, NewAnswer), Answer is NewAnswer+1 %% use "is" 
; true).           %% is this really necessary? 

'Undefined'將導致0錯誤,但離開它,現在。另外,您不需要在Prolog中「聲明」var。行var(Divident), ..., var(End),沒有任何用處。