我可以使用带有assert / 1的变量吗?

时间:2011-12-25 02:17:09

标签: prolog prolog-assert

我现在检查X(Y)在我的小数据库中不是可接受的事实。由于X(Y)返回false,它将尝试断言它。 (我知道当X是规则而不是事实时,这会出现问题)

ifNotAdd(X,Y):-
    not(call(X,Y)),
    !,
    assert(X(Y)).

例如,假设这个事实在DB

mammal(dolphin).
我问     ifNotAdd(哺乳动物,大象)。

我希望它能看到吗?哺乳动物(象)。是假的,然后断言哺乳动物(大象)。

显然是“断言(X(Y))。”线是错的,但我该用它替换它?我正在搜索prolog文档和论坛的答案,但到目前为止没有运气。我也想写一些能自己做的事情。

修改的 我需要编辑数据库,以便拥有一个用户可以与之交互的动态数据库。我正在构建一个参数机器,我需要允许用户告诉系统他们“确切知道这个事实”,以便系统可以处理其域外的知识。

http://en.wikipedia.org/wiki/Reason_maintenance

为界

干杯,

1 个答案:

答案 0 :(得分:8)

您可以在断言之前使用univ operator =../2来构造术语(请注意,有问题的谓词必须声明为动态才能生效):

ifNotAdd(X,Y):-
    not(call(X,Y)),
    !,
    Term =.. [X, Y],
    assert(Term).

BTW如果你希望ifNotAdd/2在不需要将事实添加到数据库时不会失败,你应该将它包装在if结构中,而且,not/1已被弃用,{{ 1}}是首选:

(\+)/1

但我不确定你要做的是什么。很多时候,当prolog的初学者想要操纵数据库时,这是因为没有正确理解特定的prolog机制。然后你可能不是一个初学者,我的评论可能是愚蠢的,在这种情况下,只是忘记它!但如果你是初学者,你可能想要确定你想要达到的目标,以便我们确认需要进行这些操作!