从知识库中删除谓词

时间:2012-10-24 10:53:12

标签: prolog

我想提出一个问题。我有一个我正在处理的知识库,我希望用户使用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).

等等......

1 个答案:

答案 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?=
  ).