我正在阅读一些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的文档,参数可以是任何PROLOG TERM(因此,f(X)很好),如果参数是INSTANTIATED,则非变量测试。
在4的情况下,它没有被实例化,所以它应该是NO而不是YES(X = X)。如果我的理解不正确,请纠正我,还是ECLiPSe prolog中的文档问题?我使用的是最新版本。
谢谢!
答案 0 :(得分:5)
在您的查询4中,f(X)
包含非实例化变量X
,但本身不是未实例化的变量。
SWI-Prolog的帮助可能对nonvar
的含义更清楚一点:
nonvar(Term)
:如果Term
当前不是自由变量,则为真。
您可以检查某个术语是否包含ground/1
的自由变量:
?- X = 5, ground(f(X)).
X = 5.
?- ground(f(X)).
false.