@<之间的算术差异和<在Prolog

时间:2017-01-08 10:47:02

标签: prolog comparison

以下查询都返回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

即使上面的解释对我来说似乎是合乎逻辑的(并经过测试),但我不确定,因为它只是简单介绍并且有缺陷或至少含糊不清地解释(参见上面的斜体引用)。那么,我的问题是,我的假设是正确的,@<只是一个字符串比较,而<实际上解决了双方然后进行比较? <在解决双方之后是否实际进行了数字比较,还是回归到字符串比较?(在将双方解为实数之后会产生与算术解决方案。如果是这样,那么非理性数字呢?)我对'包括数字的字母'的假设也是正确的,还是我错过了一些重要的细节?

1 个答案:

答案 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.

因此,某些基本字符串比较不是 ,所比较的术语类型很重要。