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 から Tired(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).

等々...

4

1 に答える 1

1

rettract/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」に格納しようとしていると思います。tell/told の間に何も書き込まないため、ファイルは空のままです。

あなたは代わりに行うことができます

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).

edit :-tract(Predicate) をファイルに追加する前に、retract が成功するかどうかをテストできます。好みの構文を使用する

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 に答える