5

リトラクタブル データベースをサポートする Prolog 実装はありますか? プロローグエンジンがこの述語呼び出しをバックトラックしたときに、 assert() 述語呼び出しによって挿入された事実を自動的に撤回するデータベースを意味しますか? 言い換えれば、バックトラッキングで「自動」の暗黙の撤回が必要です。

似たようなものは、次のように表現できます。

my_assert(Fact):- assert(Fact).
my_assert(Fact):- retract(Fact), fail.

しかし、カットをバックトラックしている間は正しく動作しません (!)

または、この目標は、Prolog の「テーブル化された」フレーバーを使用して何らかの方法で達成される可能性がありますか?

4

4 に答える 4

2

あなたが望むものをネイティブにサポートするPrologの実装は知りません。setup_call_cleanup/3の上に同様のものを継続渡しスタイルで実装できます:

% assert Fact while seeking Goal then retract Fact
assert_then(Fact, Goal) :-
  setup_call_cleanup(assert(Fact), Goal, retract(Fact)).

:- dynamic whom/1.
example :-
    assert_then(whom(world), hello).
hello :-
    whom(Whom),
    format('Hello ~w~n', [Whom]).

ちょっと見にくいですが、バックトラッキング、例外、カットで動作するはずです。

于 2013-03-16T15:05:26.243 に答える