8

私が今持っているものは、X(Y) が私の小さな DB で受け入れられた事実ではないことを確認します。X(Y) は false を返すため、それをアサートしようとします。(X が事実ではなく規則である場合、これは問題を引き起こすことを認識しています)

ifNotAdd(X,Y):-
    not(call(X,Y)),
    !,
    assert(X(Y)).

たとえば、この事実がDBにあるとしましょう

mammal(dolphin).

ifNotAdd(哺乳類、ゾウ) に質問します。

私はそれを見たいですか?哺乳類(ゾウ)。は false で、哺乳類 (象) をアサートします。

明らかに「assert(X(Y))」です。行が間違っていますが、何に置き換えますか? 答えを求めてプロローグのドキュメントとフォーラムを探していますが、今のところうまくいきません。私はまた、これを自分で行うものを書き込もうとしています。

編集 ユーザーが対話できる動的データベースを作成するには、DB を編集する必要があります。私は引数マシンを構築していますが、システムがドメイン外の知識を処理できるように、ユーザーが「事実を確実に知っている」ことをシステムに伝えることができるようにする必要があります。

http://en.wikipedia.org/wiki/Reason_maintenanceの流れで

乾杯、

4

1 に答える 1

8

univ 演算子 を使用して、=../2それをアサートする前に用語を構築できます (問題の述語は、機能させるために動的に宣言する必要があることに注意してください)。

ifNotAdd(X,Y):-
    not(call(X,Y)),
    !,
    Term =.. [X, Y],
    assert(Term).

ところでifNotAdd/2、事実をデータベースに追加する必要がないときに失敗したくない場合は、それを if 構造でラップする必要がありnot/1ます(\+)/1

:- dynamic(mammal/1).

mammal(dolphin).

ifNotAdd(X, Y):-
    (   \+ call(X, Y)
     -> Term =.. [X, Y],
        assert(Term)
     ;  true).

しかし、あなたが何をしようとしているのかはわかりません。プロローグの初心者がデータベースを操作したい場合、特定のプロローグ メカニズムが正しく理解されていないことが原因であることがよくあります。繰り返しになりますが、あなたは初心者ではないかもしれませんし、私の発言はばかげているかもしれません。その場合は、忘れてください! しかし、初心者の場合は、ここで何を達成しようとしているのかを正確に示して、それらの操作が必要であることを確認できるようにすることをお勧めします。

于 2011-12-25T02:26:50.370 に答える