2016-06-17 4 views
0

述語を実装しようとしていますreplace(+OldFact,+NewFact) OldFactが存在する場合のみ成功します。これが成功した場合は、 NewFactを一連の句に追加し、OldFactを にする必要があります。Prolog:ファクトを使用してファクトを置換する

どうすればよいですか? ファクトを使用してこの 置換を達成する方法と、それらのアサートを使用する方法と データベース操作コマンドを取り消す方法を明確に理解することはできません。

ありがとうございました。

+0

あなただけの 'OldFactを呼び出すことができます:あなたはバックトラックを要求されることなく、それぞれを交換したい場合は、代わりに

replace_existing_fact(OldFact, NewFact) :- call(OldFact), !, % Don't backtrack to find multiple instances of old fact retract(OldFact), assertz(NewFact). 

:あなたはそれらの一方のみを交換したい場合は、カットを使用することができます'それがデータベースにあるかどうかを判断する。もし 'call(OldFact)'が成功すれば成功します。次に、 'retract/1'と' assertz/1'を使って、あなたが望むことをすることができます。あなたがしたいことがアサートされた事実ではなく、置き換えのための用語のリストを持っていない限り、表示しているリストの例のコードは関係ありません。 – lurker

+0

本当にProlog述語を変更してもよろしいですか?あなたの定義は、 – false

+0

@lurkerのようには見えません。ありがとう。実際、はい、私は古い事実を新しい事実に置き換えたかったのです。また、古いファクトがデータベースに見つかった場合は、それが削除され、新しいファクトがデータベースに挿入されます。述語の実装は、replace(Oldfact、NewFact)のようなものです。 –

答えて

1

私が額面でリクエストした場合、私のコメントで述べた述語を使うだけでいいです。私はOldFactが見つからない場合は、その後、あなたは、単に成功する述語をしたいと仮定してい

replace_existing_fact(OldFact, NewFact) :- 
    ( call(OldFact) 
    -> retract(OldFact), 
     assertz(NewFact) 
    ; true 
    ). 

:あなたの述語は、次のようになります。古い事実が存在しない場合は、述語の失敗が許容される場合、これは単純に書かれます:あなたは、データベース内の1つの同じOldFact以上のものを持っている場合、この述語はのためにバックトラックすることを

replace_existing_fact(OldFact, NewFact) :- 
    call(OldFact), 
    retract(OldFact), 
    assertz(NewFact). 


注意をそれぞれのバックトラックで1つのオカレンスを置き換えます。

replace_each_existing_fact(OldFact, NewFact) :- 
    forall(replace_existing_fact(OldFact, NewFact), true). 
+0

複数のファクトがある場合、 'f(1)。 f(1) – false

+0

@lurker。どうもありがとうございます。今私はこれらのretractとassertコマンドの実装を理解しています。それはより多くの質問を解決するためにさらに助けになります。 –

関連する問題