2011-12-29 15 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

答えて

7

gusbroが言ったように、しない/ 1が予め定義された静的な手順であり(及びしたがって、同じ名前を使用することはお勧めできません)。

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

?- not(42). 
true. 

問題、あなたがいないときすでに、あなたのコードではない/ 1を定義していることをされています。しかし、これはあなたが標準的な定義を上書きすることができますよう、プロローグSWIでエラーを取得する理由はありません述語を動的に明示的に宣言すると、swi-prologは静的であるとみなし、それを変更することはできません。

あなたはあなたのコードでは、この行を挿入することで、ダイナミックとしてそれを宣言することができます。

:-dynamic(not/1). 

私は、エラーメッセージがpermission_error(modify,static_procedure,not/1)を言うように、これは他のプロローグの実装(例えばGNU-プロローグ)で問題を解決することはできませんと思います;どのような場合でも、名前を変更することを強くお勧めします。

ところで、単に引数が何であるかをテストし、対応するメッセージを出力する方が簡単でクリーンになります。しかし、より複雑なもの(状態を多分使用して)を作成したい場合は、アサート/リトラクトがより効率的であるため、グローバル変数を使用できます。

関連する問題