2016-07-26 63 views
0

我是SWI-prolog的新手,並且遇到了代碼問題。我希望它確定輸入是5的倍數而不是偶數,但如果它不是整數,它應該打印出錯誤消息。到目前爲止,我有這個,但它沒有打印出錯誤信息,而只是告訴我這是一個類型錯誤。序言:如果輸入一個浮點數,輸出將輸出錯誤

MultOf5(N) :- 
0 is N mod 5, \+ 0 is N mod 2. 
MultOf5(Other) :- 
N is Other, 
print("ERROR: The given parameter is not an integer"). 

它打印出這個當我輸入:

?-Multof5(4.7) 
Singleton variables: [N] 
mod/2: Type error: `integer' expected, found `4.2' (a float) 

請讓我知道我要去哪裏錯了,我可以做些什麼來解決這個問題。這是說我也有一個單身變量。謝謝。

回答

2

在發佈代碼。著名的問題:

  • 在Prolog,謂詞不能以大寫字母開頭。所以 MultOf5(N) ...無效。從你所顯示的消息來看,我認爲這不是你的代碼真正寫入的方式。
  • multOf5(Other) ...只是指N一次,而不是 使用。這就是產生單身警告的原因。
  • mod,正如你所知,它是以整數運算的,而你的第一個子句試圖在4.2上嘗試mod,這將會失敗。如果N是整數,則可以使用integer(N),即成功。

我寧願積極1 is N mod 2超過負面\+ 0 is N mod 2

oddMultOf5(N) :- 
    ( integer(N) 
    -> 0 is N mod 5, 
     1 is N mod 2 
    ; print("ERROR: The given parameter is not an integer") 
    ). 
+0

是的對不起,我改變了一些我寫的代碼,所以我可以得到的重點。謝謝!這使得更有意義。 – tadashi

+0

打印出錯誤後,我有辦法切斷代碼嗎?我加了!之前;(或),但它告訴我它的錯誤。 – tadashi

+0

@tadashi你會想用'print'剪下。你可以把它寫成'print(...),!'。由於'print'沒有任何選擇點,所以你可以在之前放入:'!,print(...)'。 – lurker