我想在prolog中创建动态事实

时间:2011-12-29 14:42:55

标签: prolog prolog-assert

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

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'

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

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