【问题标题】:I want to create dynamic facts in prolog我想在序言中创建动态事实
【发布时间】:2011-12-29 14:42:54
【问题描述】:

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

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'

【问题讨论】:

  • not/1 是预定义的静态过程。考虑将名称更改为其他名称。而且你在做什么似乎不太对劲。

标签: prolog prolog-assert prolog-directive-dynamic


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多