7

我写了以下简单的代码,我希望当我写“男性”时,这段代码会问我一次“它是男性吗?” 如果我输入“否”,它会在屏幕上写下“她是女性”。

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'
4

1 回答 1

9

正如 gusbro 所说,not/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);无论如何,强烈建议更改名称。

顺便说一句,简单地测试参数是什么并打印相应的消息会更简单、更清晰。但是,如果您想创建更复杂的东西(可能使用状态),您可以使用全局变量,因为它们比断言/撤回更有效。

于 2011-12-29T17:36:51.773 回答