2011-02-10 1 views
3

私は最初のいくつかのプログラムをPrologで実行しています。私が実行しようとしているような種類のテストではじまりました。当初、私はいくつかの米国の州のミニマップ上でそれをやっていたが、私はアルファベットにそれを簡素化:私は(、何を)NAを照会する場合Prologを使い始める前に、それがどのように機能しているかについての基本的な誤解を明らかにしてください。

adj(a,b). 
adj(b,a). 
adj(b,c). 
adj(c,b). 
adj(c,d). 

na(X, Z) :- \+adj(X, Z). 

私は何の反応もない(ちょうどいいえ)が、私は個別にna(a、d)をチェックすれば当然もちろんはいを返します。

これがなぜ起こるのかについての説明は何ですか?私はさまざまなプログラムで動作するように他のクエリを取得することができたので、私はどのような重要な情報が不足しているのだろうかと思っています。ありがとう!

答えて

6

(\ +)/ 1は論理否定ではなく、「証明できません」と考えてください。 が証明できない場合にのみ、\+ na(a, What)が成功します。 na(a, What)は少なくとも1つの解決策を生み出し、したがって証明することができるので、その否定(この意味で)に失敗します。 (\ +)/ 1は論理的に不完全です。この場合は失敗しますが、観察したように、成功するための基準値があります。しかし、(\ +/1)は、その議論が根拠になっていれば、論理否定から期待するように機能します。たとえば、

na(X, Y) :- country(X), country(Y), \+ adj(X, Y). 

で解決できます。ここで、国/ 1は国の基準インスタンスを生成します。それを解決する別の方法は、隣接していない国を明示的に列挙することです。ドメインは有限であるため可能です。この方法の利点は、クエリが単調であることです。新しいファクトを追加すると、以前に成功したクエリが決して失敗することはありません(上記のように(\ +)/ 1を使用する場合は保持されません)。宣言的なデバッグのための素晴らしいプロパティです。