ECLiPSe Prolog - 'nonvar/1'的意外行为

kal*_*far 4 prolog

我正在浏览一些ECLiPSe文档并发现:

`nonvar/1` : Fails if Term is not instantiated
Run Code Online (Sandbox Code Playgroud)

我试过这样做:

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)
Run Code Online (Sandbox Code Playgroud)

现在这个查询结果让我困惑:

4. Query: nonvar(f(X)). Result: Yes, X=X.
Run Code Online (Sandbox Code Playgroud)

查询1,2,3按预期工作.对我来说,4的结果很奇怪.根据eclipse中nonvar/1的文档,参数可以是任何PROLOG TERM(因此,f(X)很好),如果参数是INSTANTIATED则非变量测试.

在4的情况下,它没有被实例化,因此它应该是NO而不是YES(X = X).如果我的理解不正确,请纠正我,还是ECLiPSe prolog中的文档问题?我正在使用最新版本.

谢谢!

Fre*_*Foo 5

在您的查询4中,f(X) 包含非实例化变量,X但它本身不是未实例化的变量.

SWI-Prolog的帮助可能有点清楚nonvar:

nonvar(Term):如果Term当前不是自由变量,则为True .

您可以检查术语是否包含自由变量ground/1:

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

?- ground(f(X)).
false.
Run Code Online (Sandbox Code Playgroud)

  • @kallakafar:复合词永远不是变量.它可能包含变量,但它本身不是变量. (3认同)