我现在检查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
为界干杯,
答案 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机制。然后你可能不是一个初学者,我的评论可能是愚蠢的,在这种情况下,只是忘记它!但如果你是初学者,你可能想要确定你想要达到的目标,以便我们确认需要进行这些操作!