以下のクエリでは、最初に取得X = H128
していますが、それはどこから来たのですか? また、なぜ yes が返されるのですか? 変数X
が実際には定義されておらず、その条件をテストしているためですか?
?- not(X==3).
X = H128
yes
以下のクエリでは、最初に取得X = H128
していますが、それはどこから来たのですか? また、なぜ yes が返されるのですか? 変数X
が実際には定義されておらず、その条件をテストしているためですか?
?- not(X==3).
X = H128
yes
クエリは、インスタンス化されていない変数 (X) を使用しています。X が項 3 it (X==3) でインスタンス化されているかどうかをチェックすると、X がインスタンス化されていないため失敗します。
したがって、prolog エンジンは X==3 を証明できないため、not(X==3) は成功します。したがって、プロローグ インタープリターは「yes」を返します (インタープリターの失敗アプローチとしての否定のため)、X はインスタンス化されないままです。
そのため、インタプリタは X = H128 を表示します。ここで、H128 はダミーのインスタンス化されていない変数です。
当初の意図は?X
が 3 に等しくないことを述べたかったのかもしれません。不等式については、多くの Prolog システムが提供していdif/2
ます。
?- dif(X,3).
dif(X,3).
このクエリでは、X
3 以外の値を要求します。どの値が等しくないのでしょうか? 実際には、かなり多く: 、 、用語、 、リストなどを考え1
て2
み3+3
てc
ください[2,3,4]
。したがって、次のような具体的な回答を与えると、X = 4
他の多くの有効な回答が除外されます。ただし、ここでの答えは次のとおりです。3X
に等しくないすべてのクエリが成立します。したがって、実際の評価は後で遅延されます。
?- dif(X,3), X = 3.
false.
ここでX
、値 3 を取得した状況になりましたが、これは成立しません。
?- dif(X,3), X = 4.
X = 4.
ここでは、具体的な有効な値が受け入れられ、制限dif(4,3)
が解除されます。
はい、それは、変数X
が最初の目標 によって拘束されていないためnot(X==3)
です。実際、not/1
メタ述語は、たとえ成功したとしても、バインディングを生成することはできません。の成功not
は、内なる目標が失敗することを意味するからです。が空いている場合に成功する可能性がnot(X=3)
あるため、失敗することに注意してください(値 3 にバインドできます)。X=3
X