3

私はいくつかの ECLiPSe ドキュメントを調べていて、これを見つけました:

`nonvar/1` : Fails if Term is not instantiated

私はこれをやってみました:

1. Query: nonvar(X). Result: No (AS EXPECTED)
2. Query: X=5, nonvar(X). Result: Yes (AS EXPECTED)
3. Query: X=5, nonvar(f(X)). Result: Yes, X=5. (AS EXPECTED)

今、このクエリの結果は私を混乱させました:

4. Query: nonvar(f(X)). Result: Yes, X=X.

クエリ 1、2、3 は期待どおりに機能します。私にとって、4の結果は奇妙です。Eclipse の nonvar/1 のドキュメントによると、引数は ANY PROLOG TERM (つまり、f(X) は問題ありません) であり、nonvar は引数が INSTANTIATED かどうかをテストします。

4 の場合、インスタンス化されていないため、YES (X=X) ではなく NO である必要があります。私の理解が間違っている場合は訂正してください。それとも ECLiPSe プロローグのドキュメントの問題ですか? 最新バージョンを使用しています。

ありがとう!

4

1 に答える 1

4

クエリ 4 にf(X) 、インスタンス化されていない変数Xが含まれていますが、それ自体はインスタンス化されていない変数ではありません。

SWI-Prolog のヘルプは、おそらく次の意味について少し明確ですnonvar

nonvar(Term)Term:現在自由変数でない場合は真。

項に自由変数が含まれているかどうかは、次の方法で確認できますground/1

?- X = 5, ground(f(X)).
X = 5.

?- ground(f(X)).
false.
于 2012-04-14T15:23:56.390 に答える