2010-09-08 66 views
-1

我已經寫了一組兩個謂詞來測試一個數是否是方數。序言問題 - 方塊號

patrat_perfect(A):- patr(A, 0). 

patr(A, S):- A =:= S * S. 

patr(A,S):- A > S * S, T is S+1, patrat(A, T). 

patr(A,S):- A < S * S, fail. 

第一謂詞,patrat_perfect只需執行用於第二謂詞的呼叫與用於第二參數的值0,並且其應該被測試是否它是所述第一參數的完美的正方形的數目。

patr謂詞實際上搜索從0該號碼Ssqrt(A),其尊重方程S * S = A。爲了這樣做,如果A > S * S的謂詞增加了S的值1。如果在下一個呼叫A = S * S處,則謂詞返回true,並且如果A < S * S,則謂詞通過調用內置謂詞fail返回false

問題是,在每次調用patrat_perfect謂詞時,都會收到false值。你能告訴我我哪裏錯了嗎?

+0

您是否嘗試過調試謂詞? – svick 2010-09-08 08:19:41

+0

你可以命名你的謂詞「perfect_square」和「square」。這樣你就會注意到「patrat」沒有被定義。 – Andy 2010-09-08 08:59:39

+0

@安迪,如果沒有謂詞'patrat',Prolog會抱怨並且不會返回'false'。 – svick 2010-09-08 10:45:24

回答

0

當我在您的代碼中修復了一個錯字(您打電話給patrat,但沒有定義它)時,它似乎正常工作(請參閱http://ideone.com/j7fSAhttp://ideone.com/SjIws)。

也許您錯誤地複製了代碼,或者您在其他地方定義了patrat,其工作原理不同。

+0

非常感謝!最初,我已經定義了謂詞「patrat」,但是我與其他謂詞發生了一些衝突,所以我改變了它,並且我忘記更改規則正文中謂詞的名稱。 – Simon 2010-09-08 10:37:56