2012-04-20 7 views
1

誰かの兄弟かどうかを判断するルールをプロローグプログラムに書き込もうとしています。Prologプログラムの存在の例外

たとえば、brother_of(chris、X)と入力すると、クリスはchristyの兄弟であるため、christyが返されます。しかし、私はこれを入力すると、私は存在の例外を取得します。私はすべてをカバーするために事実を含めましたが、私のルール定義の問題かもしれません。コードは以下の通りです。

/* Facts */ 
female(ella). 
female(jodi). 
female(sonya). 
female(jane). 
female(christy). 
female(mary). 
male(arnold). 
male(chris). 
male(louis). 
male(mark). 
father(arnold). 
father(louis). 
father(mark). 
mother(ella). 
mother(jodi). 
mother(jane). 
mother(mary). 
father_of(arnold, chris). /* arnold is the father of chris */ 
father_of(arnold, christy). 
father_of(louis, mark). 
father_of(mark, arnold). 
mother_of(mary, chris). 
mother_of(mary, christy).   
mother_of(jane, arnold).  
mother_of(ella, sonya). 
mother_of(jodi, ella). 
mother_of(jodi, mark). 

/* Rules */ 

brother_of(X, Y) :- 
    male(X), 
    ((father_of(Z, X), father_of(Z, Y)); 
    (mother_of(W, X), mother_of(W, Y))), 
    X =\= Y. 

答えて

1

オペレータ=\=は二つの用語は、(非単一化可能)が異なるかどうかを確認するために、(私の知る限り)のみの演算に使用される演算子\=使用:

X \= Y. 

を更新:の簡単な紹介cut!)の目標:切れ目が述語で使用されている場合は、既に見つかった解答以外に解答を検索する必要がなくなったことを意味します。例:カットした後

first_child(X,Y) :- 
    father_of(X,Y), !. 

?- first_child(arnold,Y). 

Y = chris ; 

no 

前にカットが破棄されている(しかし、新しいものが後に作成することができます)、すべての選択肢のポイントに達しています。あなたの例では、もしXとYが同じ父親を持っていれば、同じ母親がいる場合は無関係です。 「共通の父」の部分が成功した直後にあなたがカットを配置することができますカットを使用すると、多くの落とし穴がありますがあること

brother_of(X, Y) :- 
    male(X), 
    ((father_of(Z, X), father_of(Z, Y), X \= Y, !); # If cut is reached, will not run the next line 
    (mother_of(W, X), mother_of(W, Y), X \= Y)). 

注意を(リンクWikipediaの記事に「赤カット」対「グリーンカット」を参照してください)、ここで説明するのはあまりにも大変です。 (私はX \= Yを繰り返しどのように注意してください - 私はプログラムが時々失敗するだろうとしなかった場合)

最後に、私はまた、必要なときに(あなたが使用できるPrologのコードを書くときに;を使用することがしばしば推奨されていることを指摘したいと思いますしかし)。

brother_of(X, Y) :- 
    male(X), 
    father_of(Z, X), 
    father_of(Z, Y), 
    X \= Y, 
    !. 
brother_of(X, Y) :- 
    male(X), 
    mother_of(W, X), 
    mother_of(W, Y), 
    X \= Y. 

(この; 2対の句はしかし、少し主観的であるので、私はちょうど両方の方法が可能であることは知っている、と...それについてはあまり主張しません。代わりに、2つの節でそれを書きます同じ結果が出るでしょう)

+0

それはうまくいきました、ありがとう!しかし、今私はbrother_of(chris、X)に尋ねると、クリスティを2回返します。クリスティーが返された後、私は ";"とタイプします。これ以上存在しないことを確認するためには、それは存在してはならないので、「いいえ」を返すべきですが、再びクリスティーを返します。理由は何ですか? – aclark

+0

あなたは[cut](http://en.wikipedia.org/wiki/Cut_%28logic_programming%29)の目標: '!'が必要です。あなたがそれを使用する方法についての助けが必要かどうか私に尋ねてください(あなたがそれをあなたの研究でそれを見たのであればわからない) – mgibsonbr

+0

私はそれを実際に見たことがありません。どうやって使うの? – aclark

関連する問題