2011-12-25 5 views
7

私は現在、X(Y)が私の小さなDBで受け入れられている事実でないことを確認しています。 X(Y)はfalseを返すので、それをアサートしようとします。のは、私が ifNotAdd(哺乳類、象を聞いて、この事実は、DBassert/1で変数を使用できますか?

mammal(dolphin). 

であることを言わせて、例えば

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

(私は、Xは、ルールではなく事実であるとき、これは問題を提起実現します) )。

私はそれを見たいですか?哺乳動物(象)。偽であり、哺乳動物(象)を主張する。

明らかに、「assert(X(Y))」は、行は間違っていますが、どうすればよいでしょうか?私はプロローグのドキュメンテーションと答えをフォーラムでトラウリングしていますが、これまでのところ運はありません。私は自分自身でこれを行う何かを書くことも試みています。

EDIT ユーザーが操作できる動的データベースを作成するには、DBを編集する必要があります。私は引数マシンを構築しています。ユーザーが "確かな事実を知っている"ことをシステムに伝え、システムがそのドメイン外の知識を処理できるようにする必要があります。 http://en.wikipedia.org/wiki/Reason_maintenance

乾杯の静脈で

答えて

8

あなたはuniv operator=../2がそれを主張する前に、用語を構築するために使用することができます(それを動作させるために、当該述語が動的に宣言する必要があることに注意してください)。あなたはそれがデシベルに事実を追加する必要がない場合に失敗しifNotAdd/2ないかどう

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

ところで、あなたは、if構造でそれをラップし、プラス、必要があります

:- dynamic(mammal/1). 

mammal(dolphin). 

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

しかし、私はあなたが何をしようとしていることはすぐそこにあるかわからない:は廃止され、(\+)/1が好ましいです。プロローグの初心者がデータベースを操作したいときは、特定のプロローグメカニズムが正しく理解されていないためです。それでは、初心者ではないかもしれないし、私の発言がダムになる可能性もあります。しかし、あなたが初心者であれば、ここで達成しようとしていることを正確にして、その操作が必要であることを確認することができます!

+0

ああ、私は通常、廃止予定であっても、初めてハッキングしたときの読みやすさのためにnot()を使用します。ポストのためにそれを変更したはずです。とにかくそれはまさに私が探していたものです。私は授業の前にプロローグを使用していませんでした。私はそれを少し前に学び、再学習しています。完全に '= ../2'を忘れてしまったので解決します。 上記のプログラムを明確にします。 –

+0

あなたの編集について:dbを操作する正当な理由のようです:] – m09

関連する問題