Car*_*cox 9 prolog prolog-assert
我现在检查X(Y)在我的小数据库中不是可接受的事实.由于X(Y)返回false,它将尝试断言它.(我知道当X是规则而不是事实时,这会出现问题)
ifNotAdd(X,Y):-
not(call(X,Y)),
!,
assert(X(Y)).
Run Code Online (Sandbox Code Playgroud)
例如,假设这个事实在DB中
mammal(dolphin).
Run Code Online (Sandbox Code Playgroud)
我问ifNotAdd(哺乳动物,大象).
我希望它能看到吗?哺乳动物(象).是假的,然后断言哺乳动物(大象).
显然是"断言(X(Y))." 线是错的,但我该用什么替换呢?我正在搜索prolog文档和论坛的答案,但到目前为止没有运气.我也试着写一些能够自己做的事情.
编辑 我需要编辑数据库,以便拥有一个用户可以与之交互的动态数据库.我正在构建一个参数机器,我需要允许用户告诉系统他们"确切知道这个事实",以便系统可以处理其域外的知识.
在http://en.wikipedia.org/wiki/Reason_maintenance中
干杯,
您可以使用univ运算符 =../2在断言之前构造该术语(请注意,有问题的谓词必须声明为动态才能生效):
ifNotAdd(X,Y):-
not(call(X,Y)),
!,
Term =.. [X, Y],
assert(Term).
Run Code Online (Sandbox Code Playgroud)
顺便说一句,如果你不想ifNotAdd/2在不需要将事实添加到数据库时失败,你应该将它包装在if结构中,加上,not/1不推荐使用,(\+)/1是首选:
:- dynamic(mammal/1).
mammal(dolphin).
ifNotAdd(X, Y):-
( \+ call(X, Y)
-> Term =.. [X, Y],
assert(Term)
; true).
Run Code Online (Sandbox Code Playgroud)
但我不确定你要做的就是那里.很多时候,当prolog的初学者想要操纵数据库时,这是因为没有正确理解特定的prolog机制.然后你可能不是一个初学者,我的评论可能是愚蠢的,在这种情况下,只是忘记它!但是如果你是初学者,你可能想要确定你想要达到的目标,这样我们就可以确认需要那些操作!