以下查询都返回 true。
1 @< 2.
true
1 < 2.
true
Run Code Online (Sandbox Code Playgroud)
在课堂上我们被告知@< 可以做更多的事情, < 因为它还可以在算术比较旁边进行字母比较。因为我认为这听起来像是废话(如果一个操作员包含另一个操作员的行为,为什么还需要两个操作员)我做了一些基本测试。对我来说,@< 只进行字母测试似乎更合乎逻辑,在这种情况下,数字只不过是字母表的扩展。因为
9 @< a.
true
Z @< a.
true
Run Code Online (Sandbox Code Playgroud)
似乎“字母顺序”是这样的(不包括变音符号和特殊字符):
0123456789ABCDEFGHIJKLMNOPQRSTUVWQYZabcdefghijklmnopqrstuvwqyz
Run Code Online (Sandbox Code Playgroud)
使用<over的好处是@<前者首先解决两边的方程,而后者只是一个字符串比较:
(2/5) < (1/2).
true
(2/5) @< (1/2).
false
Run Code Online (Sandbox Code Playgroud)
尽管上面的解释对我来说似乎合乎逻辑(并经过测试),但我不确定,因为它只是简要介绍和错误或至少解释含糊不清(参见上面的斜体引用)。那么,我的问题是,我的假设是否正确,@<只不过是字符串比较,而<实际上解决了双方然后进行了比较?是否<真正做到解决双方经过数比较,还是它回落到字符串比较?(哪个,在将两边都解决为实数后会产生与算术解决方案相同的结果。如果是这样,那么无理数呢?)我对“包括数字的字母表”的假设也正确,还是我错过了一些重要的细节?
小智 5
@<根据术语的标准顺序进行比较;<比较算术表达式。两者都不能比另一个“多”或“少”,因为他们做不同的事情。你可以说有@<能用不能用的情况<,但也有两者给你相反答案的情况。
SWI-Prolog 文档是获取这方面详细信息的地方。该@<比较使用术语的标准顺序,与所有其他这样的谓词沿着:==,\==,@<,@=<,@>,@>=。这里最有趣的可能是谓词compare/3。但是,是的,术语的标准顺序定义了 Prolog 程序中任何术语的顺序,包括自由变量。
另一方面,算术比较 计算两边的算术表达式,并比较它们的值。重要的是,在两边,表达式都应该计算为一个数字,你不能在那里留下变量。换句话说:
?- X @< 1.
true. % because free variables come before all other terms
?- X < 1.
ERROR: Arguments are not sufficiently instantiated
% An exception is thrown because X is not a valid arithmetic expression
Run Code Online (Sandbox Code Playgroud)
这是一个@<可以给你答案的例子,“变量X按照1标准的术语顺序在整数之前排序”,而<只是告诉你“不能这样做”(既不是“是”也不是“否”)。
另一个例子:
?- 1 + 2 < 5.
true.
?- 1 + 2 @< 5.
false.
Run Code Online (Sandbox Code Playgroud)
这是两个比较给出相反答案的示例。如果您使用<,您会得到答案“1 + 2 小于 5”,而如果您使用 ,@<您会得到答案“该术语+(1, 2)不会按照术语5的标准顺序在整数之前排序”。这是因为所有复合词都排在所有数字之后。
这意味着您不能使用 example sort/2,根据术语的标准顺序进行排序,对数字或算术表达式进行排序。首先,根据 ISO,所有浮点数都在所有整数之前(如果我错了,有人纠正我)。然后,SWI-Prolog 支持有理数,形式Numerator rdiv Denominator为 ,例如1 rdiv 2表示“二分之一”。因为这目前只是一个复合词:
?- 1 rdiv 2 < 1.
true.
?- 1 rdiv 2 @< 1.
false.
Run Code Online (Sandbox Code Playgroud)
至于你的问题中的“无理数”,你确定你的意思不是“有理数”?
最后,如果您使用标准的术语顺序比较,请确保您了解要比较的事物的类型!同样,来自SWI-Prolog 文档:
变量 < 数字 < 字符串 < 原子 < 复合词
数量和原子:
?- 9 @< '0'.
true.
Run Code Online (Sandbox Code Playgroud)
字符串和原子:
?- "Z" @< 'A'.
true.
Run Code Online (Sandbox Code Playgroud)
变量和字符串:
?- Z @< "A".
true.
Run Code Online (Sandbox Code Playgroud)
具有相同参数的两个复合术语,但是'+' @< '-':
?- 1 + 2 @< 1 - 2.
true.
Run Code Online (Sandbox Code Playgroud)
因此,这不仅仅是某种基本的字符串比较,您要比较的术语类型也很重要。