2013-01-04 51 views
2

我使用SWI-Prolog的V 6.2.3在Windows 7上我寫了下面的謂詞計算絕對值和一個整數的平方:用戶定義方謂

myabs(X,X):- X > = 0. 

myabs(X,Y):- Y is -X. 

mysq(X,S):- myabs(X,Y), S is Y * Y. 

我得到的錯誤(操作錯誤)以下行:

2 : Prolog does not seem to accept -X.

3 : Prolog does not seem to accept Y * Y (when replaced by 2 * 2, I don't get error)

我知道有這些功能,內置謂詞,但我新,這些都是小項目,幫助我學習。

回答

3

你必須在規則1一個錯字:後>

myabs(X,X):- X >= 0. 
myabs(X,Y):- Y is -X. 
mysq(X,S):- myabs(X,Y), S is Y * Y. 

然後刪除空格,修正後:

?- mysq(-3,X). 
X = 9. 

您是否知道myabs不需要平方?

?- X = -3, Y is X*X. 
X = -3, 
Y = 9. 

編輯如@false指出的,也myabs/2需要的校正,以防止錯誤的結果,當輸入爲正回溯參與。添加後衛第二句話可以這樣做:

myabs(X, Y):- X < 0, Y is -X. 

,但我寧願的if/then/else結構,即替換那些2個條款與

​​
+0

Thannnnnnnnnnnnnnnks!是的,我看到myabs不是必需的,但只是使用規則更好地理解一個用戶定義的謂詞如何使用另一個謂詞。 –

2

除了語法錯誤:您的定義myabs/2確實不是計算一個數字的絕對值。也就是說,它確實計算了它,但另外它做了一些不正確的事情!

?- myabs(2,Abs). 
Abs = 2 ; 
Abs = -2. 

所以說,兩個絕對值 2和-2這肯定是不正確的。

Prolog使用每個規則獨立導出解決方案,這意味着您可以單獨閱讀每個規則。有辦法可以使規則相互依賴,但讓我們暫時保持簡單。你的第二個規則上寫着:

myabs(X,Y):- Y is -X. 

X的絕對值是否定X。不管什麼X是。所以這個規則也適用於X2。您需要進一步的條件,X是負面的。

作爲一個初學者,最好使用library(clpfd)代替(is)/2看到

+0

非常感謝您的回覆....這非常有幫助 –