2017-05-21 7 views
3

に異なる/非存在しない事実を使用してOR演算子私が実際に持っている:ダンサーの事実はない、あなたが見ることができるようにプロローグ

dances(juliet) :- loves(romeo, juliet). 
dances(juliet) :- dancer(juliet). 

:その後、

loves(romeo, juliet). 

を私は「または」ルールを持っています存在するが、これは問題ではないはずであり、ダンス(ジュリエット)は真実を返すべきである。代わりに私は真実を返し、その後ダンサーの事実についてのexsitenceの例外を投げます。 存在しない事実や規則の規則を書く方法はありますか?その事実が存在するかどうかを確認する必要がありますか?

答えて

5

。例えば

 
:- dynamic dancer/1. 

、あなたのプログラムにこのディレクティブを追加する場合は、あなたが得る:

 
?- dances(X). 
X = juliet . 

とエラーなし。

3

私が知る限り、存在しない述語を使用する方法はありません。 this questionに記載されている方法を使用してルールが存在するかどうかを確認するか、またはであることを確認するために何らかのプレースホルダーを使用できます。ルールが常に偽であると、ルールはあまり役に立ちませんので、使用する前にいくつかの真のケースを記述してください。それ以外の場合は、

dances(juliet) :- catch(dancer(juliet), 
         error(existence_error(procedure, dancer/1), _), 
         false 
       ). 

述語が存在する場合dancer(juliet)を実行することがない場合は失敗し、エラー:

dancer(someone). %% To make sure that fact exists 

loves(romeo, juliet). 
dances(juliet) :- loves(romeo, juliet). 
dances(juliet) :- exists(dancer), dancer(juliet). 
1

技術的に、あなたはこのような何かを行うことができます。

私はこれが非常にお勧めのことだとは思わないでしょう。 、あなたはディレクティブ  dynamic/1を使用して、述語ダイナミックを宣言することができます「existantていない場合は失敗」を達成するために