我编写了以下简单的代码,我希望当我写“男性”时,这段代码会问我一次“它是男性吗?”如果我输入“否”,它会在屏幕上写下“她是女性”。
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-prolog中的错误是:
ERROR: asserta/1: No permission to modify static_procedure `not/1'
答案 0 :(得分:7)
正如gusbro所说,不是/ 1是预定义的静态过程(因此使用相同的名称不是一个好主意)。但是,这不是你在swi-prolog中得到错误的原因,因为你可以覆盖标准定义:
?- assert(not(42)).
true.
?- not(42).
true.
问题是你已经在你的代码中定义了not / 1,当你没有明确地将谓词声明为动态时,swi-prolog会认为它是静态的并且不允许你改变它。
您可以在代码中插入以下行来声明它为动态:
:-dynamic(not/1).
我认为这不会解决其他prolog实现中的问题(例如gnu-prolog),因为错误消息显示permission_error(modify,static_procedure,not/1)
;无论如何,强烈建议更改名称。
顺便说一句,简单地测试参数是什么并打印相应的消息会更简单和清晰。但是,如果您想创建更复杂的东西(可能使用状态),则可以使用全局变量,因为它们更有效地断言/撤消。