2011-07-12 6 views
2

以下のクエリでは、まずX = H128を取得しています。また、なぜそれははいを返すのですか?変数Xが実際には定義されておらず、その条件をテストしているからですか?Prolog Query returned H128

?- not(X==3). 
X = H128 
yes 

答えて

6

クエリでは、インスタンス化されていない変数(X)が使用されています。 Xがインスタンス3(X == 3)でインスタンス化されているかどうかをチェックするとき、Xはインスタンス化されていないので失敗します。

したがって、プロローグエンジンがX == 3を証明できないため、(X == 3)は成功しません。 あなたのプロローグインタープリタは「はい」を返します(インタプリタの失敗アプローチとしての否定のため)、Xはインスタンス化されずに残ります。

これは、インタープリタがX = H128を示す理由です。ここで、H128は、ダミーのインスタンス化されていない変数です。

2

はい、変数Xが最初の目標であるnot(X==3)にバインドされていないためです。実際には、成功したとしても、not/1メタベースはバインディングを生成できません。 notの成功は内部目標が失敗することを意味します。 Xが空き(かつ値3にバインドできる)場合、X=3が成功するため、not(X=3)が失敗することに注意してください。

3

元の意図は何ですか?それはあなたが不平等多くのPrologシステムは、dif/2を提供するためにXが3に等しいされていない状態たかったことが考えられます。

?- dif(X,3). 
dif(X,3). 

我々は3に等しくないXの値だから、値を求める。このクエリで等しいではない?実際には、非常に多くの:12、用語3+3c、リスト[2,3,4]と多くを考える。したがって、X = 4のような具体的な回答を与えると、他の多くの有効な回答が除外されます。ただし、答えはXで、3と等しくないすべてのクエリが保持されます。したがって、実際の評価は遅れて遅れます。

?- dif(X,3), X = 3. 
false. 

ここでは、Xの値が3になった状態になっています。これは保持されません。

?- dif(X,3), X = 4. 
X = 4. 

そして、ここで具体的な有効な値が受け入れられ、そしてrestriciton dif(4,3)が削除されます。