以下查询都返回true。
1 @< 2.
true
1 < 2.
true
在课堂上,我们被告知@<
可以做的不仅仅是 <
,因为它还可以在算术比较旁边进行字母比较。因为我觉得这听起来像hogwash(为什么你需要两个操作员,如果一个包含另一个操作员)我做了一些基本的测试。对我来说,似乎更合乎逻辑的是@<
只有进行字母测试,在这种情况下,数字只不过是字母表的扩展。因为
9 @< a.
true
Z @< a.
true
似乎'字母顺序'是这样的(不包括变音符号和特殊字符):
0123456789ABCDEFGHIJKLMNOPQRSTUVWQYZabcdefghijklmnopqrstuvwqyz
使用<
优于@<
的优势在于,前者首先解决了两边的方程,而后者只是字符串比较:
(2/5) < (1/2).
true
(2/5) @< (1/2).
false
即使上面的解释对我来说似乎是合乎逻辑的(并经过测试),但我不确定,因为它只是简单介绍并且有缺陷或至少含糊不清地解释(参见上面的斜体引用)。那么,我的问题是,我的假设是正确的,@<
只是一个字符串比较,而<
实际上解决了双方然后进行比较? <
在解决双方之后是否实际进行了数字比较,还是回归到字符串比较?(在将双方解为实数之后会产生与算术解决方案。如果是这样,那么非理性数字呢?)我对'包括数字的字母'的假设也是正确的,还是我错过了一些重要的细节?
答案 0 :(得分:4)
@<
根据条款的标准顺序进行比较; <
比较算术表达式。两者都做不到&#34;更多&#34;或者&#34;较少&#34;比另一个,因为他们做不同的事情。您可以说有些情况可以使用@<
,但<
不能,但也有两种情况会给您相反的答案。
SWI-Prolog文档是一个获取详细信息的地方。 @<
使用standard order of terms以及所有其他此类谓词进行比较:==
,\==
,@<
,@=<
,{{1} },@>
。这里最有趣的可能是谓词@>=
。但是,标准的术语顺序定义了您在Prolog程序中可能具有的任何术语的顺序,包括自由变量。
另一方面,arithmetic comparisons 评估两侧的算术表达式,并比较它们的值。重要的是,在双方,表达式应该评估为一个数字,你不能有变量留在那里。换句话说:
compare/3
这是?- 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
可以为您提供答案的示例,&#34;变量@<
按照术语的标准顺序排序X
整数{#1}; 1
只是告诉你&#34;不能这样做&#34; (既不是&#34;是&#34;也不是&#34;没有&#34;)。
另一个例子:
<
这是两个比较给出相反答案的例子。如果您使用?- 1 + 2 < 5.
true.
?- 1 + 2 @< 5.
false.
,则会得到答案&#34; 1 + 2小于5&#34;,如果您使用<
,则会得到答案&#34;术语{{1在标准的术语#34;中,不会在整数@<
之前排序。这是因为所有复合术语在所有数字后排序。
这意味着您不能使用例如根据术语的标准顺序排序的+(1, 2)
来排序数字或算术表达式。首先,根据ISO,所有浮动数字都在所有整数之前(如果我错了,有人会纠正我)。然后,SWI-Prolog以5
的形式支持有理数,例如sort/2
表示&#34;一半&#34;。因为这只是一个复合词:
Numerator rdiv Denominator
至于#34;无理数&#34;从你的问题来看,你确定你的意思并不是“理性的”#34;
最后,如果您使用标准的术语比较顺序,请确保您了解所比较事物的类型是什么!同样,来自SWI-Prolog documentation:
变量&lt;数字&lt;字符串&lt;原子&lt;复合词
数字和原子:
1 rdiv 2
字符串和原子:
?- 1 rdiv 2 < 1.
true.
?- 1 rdiv 2 @< 1.
false.
变量和字符串:
?- 9 @< '0'.
true.
具有相同参数的两个复合词,但?- "Z" @< 'A'.
true.
:
?- Z @< "A".
true.
因此,某些基本字符串比较不是 ,所比较的术语类型很重要。