2011-12-29 24 views
6

我寫了下面的簡單代碼,我期待當我寫'男性'時,這段代碼問我一次「是男性嗎?」如果我輸入'不',它會在屏幕上寫上「她是女性」。我想在序言中創建動態事實

male :- (print('is it male ? '),read(yes)) -> true; asserta(not(male)),female. 
female:- not(male),print('she is female'). 
not(P) :- (call(P) -> fail ; true) . 

但此代碼具有以下錯誤:

uncaught exception: error(permission_error(modify,static_procedure,not/1),asserta/1); 

在SWI-序言的錯誤是:

ERROR: asserta/1: No permission to modify static_procedure `not/1' 
+1

not/1是一個預定義的靜態過程。考慮將名稱更改爲其他名稱。此外,你所做的並不完全正確。 – gusbro 2011-12-29 14:53:24

回答

7

正如gusbro說,不是/ 1是一個預定義的靜態過程(和因此使用相同的名稱不是一個好主意)。然而,這是不是你在錯誤SWI-Prolog的,你可以覆蓋標準清晰度的原因:

?- assert(not(42)). 
true. 

?- not(42). 
true. 

的問題是,你已經在你的代碼中定義沒有/ 1,當你不聲明一個謂詞顯式爲動態,swi-prolog將假定它是靜態的,並且不允許你改變它。

你可以聲明它作爲動態的在代碼中插入該行:

:-dynamic(not/1). 

我認爲,隨着錯誤消息說permission_error(modify,static_procedure,not/1)這不會解決其他序言中實現的問題(例如,GNU的序言) ;無論如何,強烈建議更改名稱。

順便說一下,簡單地測試參數是什麼並打印相應的消息會更簡單和更簡潔。但是,如果你想創建更復雜的東西(也許使用一個狀態),你可以使用全局變量,因爲它們更有效的斷言/撤銷。