0

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

等等...

4

1 回答 1

1

收回/ 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?=
  ).
于 2012-10-24T11:29:12.137 回答