2016-10-12 7 views
0

私はswi-prologを使用しています。プログラムで次のようなステートメントをモデル化したい。 "aまたはbは犯罪者であり、bは犯罪者ではありません。"プロローグ内の論理的な三部論

これらのステートメントをモデリングした後。次のクエリが機能するはずです。

?-c(X). 
X=a. 

しかし、 私はプロローグでのステートメントの上に書いたとき:

c(a);c(b). 
not(c(b)). 

を、このコードはコンパイルしてエラーを示していません。

No permission to modify static procedure `(;)/2' 

プロローグでの二つの文の上にモデル化する方法は?

答えて

0

afaikこのようにPrologは機能しません。式をすべてのステートメントに一致させようとします。あなたがモデル化する「aは犯罪者であり、bがない」のであれば、あなたは

criminal(a). 
not(criminal(b)). 

を書くことができますが、あなたが言うことができない犯罪者(b)は、次の行ではない(犯罪者(b)参照)これは矛盾につながるからです。

私のコードの2行目( 'not(criminal(b))')は実際には冗長です.Prologがあなたの用語の一致を見つけられなかった場合はfalseになり、別の解決方法に戻ることになります。つまり、この場合、非犯罪者のすべての事実を単に省略することができます。

あなたは、ちょうどそれが犯罪者として知っている原子そのプロローグを依頼することができます。

criminal(X). 
と、それは明らかに

X=a.

は、ソリューションの一部ではありませんBに対し、ということを教えてくれます。