我想提出一个问题。我有一个我正在处理的知识库,我希望用户使用delete_predicate删除他想要的谓词。
知识库是这样的:
is_tired(erin).
is_tired(mary).
我已将删除谓词定义为
delete_predicate(Predicate):-tell('my_knowledge_base.pl'),
retract(Predicate),
told.
假设用户想要删除谓词is_tired(mary)。他将输入以下查询:
?-delete_predicate(is_tired(mary)).
并且将从kb删除给定的谓词。 我尝试了上述规则但删除了所有kb的内容!!
我真的很感激任何指针!
我将准确显示我需要delete_predicate如何工作。
让我们假设我有上述知识库,其中包含更多谓词:
:-dynamic(tired/1).
tired(kosta).
tired(renata).
tired(jim).
tired(mom).
tired(sister).
tired(mother).
tired(uncle).
tired(me).
如果用户想删除累(妈妈)。从kb他会查询:
?-delete_predicate(tired(mom)).
然后,知识库将删除该谓词,它将如下所示:
tired(kosta).
tired(renata).
tired(jim).
%here used to be the tired(mom).
tired(sister).
tired(mother).
tired(uncle).
tired(me).
如果用户想要从kb中删除累(me),那么kb将是:
tired(kosta).
tired(renata).
tired(jim).
%here used to be tired(mom).
tired(sister).
tired(mother).
tired(uncle).
%here used to be tired(me).
等等......
答案 0 :(得分:1)
retract / 1实际上有效:
?- findall(X,is_tired(X),L).
L = [erin, mary].
?- delete_predicate(is_tired(mary)).
true.
?- findall(X,is_tired(X),L).
L = [erin].
但我认为你试图将'my_knowledge_base.pl'存储在收回的谓词中。 因为你之间不写任何告诉/告诉文件仍然是空的。
你可以改为
delete_predicate(Predicate) :-
open('my_knowledge_base.pl', append, S),
( retract(Predicate)
-> format(S, '~q.~n', [Predicate])
; true % what about errors?
),
close(S).
然后该文件将包含已删除的事实。
编辑其实我没有理解这个问题:可能是
delete_predicate(Predicate) :-
open('my_knowledge_base.pl', append, S),
format(S, ':- retract(~q).~n', [Predicate]),
close(S).
编辑我们可以测试是否收回成功,然后将: - retract(Predicate)附加到文件中。使用您喜欢的语法
delete_predicate(Predicate) :-
( retract(Predicate)
-> append('my_knowledge_base.pl'),
format(':- retract(~q).~n', [Predicate]),
told
; true % or fail?=
).