2011-04-26 9 views
3

私は、その目標のいずれかが証明可能である場合に「真」と評価されるPrologで述語を作成する方法を知っています。Prolog述語は2つの目標のブールORとして定義されていますか?

私はこのプログラムがあります。私が入力した場合、プロローグにそれを相談した後

adjacent(place1, place2). 
distance(X, Y, 1) :- 
    adjacent(X, Y) ; adjacent(Y, X). 

を:

> distance(place1, place2, 1) 

私はこの出力を受け取る:

true; 
false. 

場合、私は思ったんだけど隣接する(X、Y)または隣接する(Y、X)のいずれかが真であれば、ただ一つの答えを返す距離述語を作る方法があります。証明可能です。

この投稿の中に何か混乱があったら、私はPrologをよく理解していませんが、うまくいけば、この質問は理解できます。ありがとう。

答えて

4

once/1述部を使用して、バックトラッキングがないことを確認できます。

離散演算子;は、バックトラッキングの可能性を導入しています。そのため、Prologは、それ以上の解決方法を探すためにPrologが指示するのを待っています。

onceは、以前のバックトラック「選択ポイント」がある可能性がある「カット」(!)の観点から定義されています。それはカットで読む価値があるかもしれません。

1

btwの場合、述部はtrueと評価されます。次の答えは、あなたが代替回答(結果を得るための別の方法など)をプロローグに依頼し、プロローグOFCがその偽を言っているので、他の方法はないからです。

基本的に1つの回答(インターフェイス)が必要な場合を除き、基本的に心配する必要はありません。

この場合、cut/onceを使用する必要があります。

関連する問題