gpt4 book ai didi

prolog - Prolog中@<和<之间的算术差异

转载 作者:行者123 更新时间:2023-12-04 12:49:10 26 4
gpt4 key购买 nike

以下查询均返回 true。

1 @< 2.
true
1 < 2.
true

在类里面我们被告知 @< 可以做的比 < 因为它还可以在算术比较旁边进行字母比较。因为我认为这听起来像是胡说八道(如果一个运算符(operator)包含另一个运算符(operator),为什么您仍然需要两个运算符(operator))我做了一些基本测试。对我来说,@< 进行字母测试似乎更合乎逻辑,在这种情况下,数字只不过是字母表的扩展。因为

9 @< a.
true
Z @< a.
true

看起来“字母顺序”是这样的(不包括变音符号和特殊字符):

0123456789ABCDEFGHIJKLMNOPQRSTUVWQYZabcdefghijklmnopqrstuvwqyz

使用 < 而不是 @< 的优势在于前者首先求解方程两边,而后者仅做字符串比较:

(2/5) < (1/2).
true
(2/5) @< (1/2).
false

尽管上面的解释对我来说似乎是合乎逻辑的(并且经过测试),但我不确定,因为它只是简要介绍并且有错误或至少解释不明确(请参阅上面的斜体引用)。那么我的问题是,我的假设是否正确,@< 只不过是一个字符串比较,而 < 实际上解决了双方然后比较? < 是在求解两边之后实际进行数字比较,还是退回到字符串比较?(其中,在将两边求解为实数后会产生与算术解相同的结果。如果那么,无理数呢?)我对“包含数字的字母表”的假设是否也正确,还是我遗漏了一些重要的细节?

最佳答案

@<根据术语的标准顺序进行比较; <比较算术表达式。两者都不能比对方做得“更多”或“更少”,因为他们做的事情不同。你可以说在某些情况下 @<可以用但是<不能,但也有两种情况会给你相反的答案。

SWI-Prolog 文档是获得这方面详细信息的一个地方。 @<使用 standard order of terms 进行比较,以及所有其他此类谓词:== , \== , @< , @=< , @> , @>= .这里最有趣的可能是谓词 compare/3 .但是,是的,术语的标准顺序定义了您在 Prolog 程序中可能拥有的任何术语的顺序,包括自由变量。

另一方面,arithmetic comparisons 计算两边的算术表达式,并比较它们的值。重要的是,在两边,表达式的计算结果都应该是一个数字,你不能在那里留下变量。换句话说:

?- 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

这是一个例子,其中 @<可以给你一个答案,“变量 X 按照标准术语顺序排在整数 1 之前”,而 <只是告诉你“不能这样做”(既不是"is"也不是“否”)。

另一个例子:

?- 1 + 2 < 5.
true.

?- 1 + 2 @< 5.
false.

这是一个示例,其中两个比较给出了相反的答案。如果你使用 < ,你会得到答案“1 + 2 小于 5”,而如果你使用 @<您会得到答案“术语 +(1, 2) 未按术语的标准顺序排在整数 5 之前”。这是因为所有复合词都所有数字之后排序。

这意味着您不能使用例如 sort/2 , 根据术语的标准顺序排序,对数字或算术表达式进行排序。首先,根据 ISO,所有 float 都在所有整数之前(如果我对此有误,请纠正我)。然后,SWI-Prolog 支持有理数,形式为 Numerator rdiv Denominator ,例如 1 rdiv 2意思是“一半”。因为这目前只是一个复合词:

?- 1 rdiv 2 < 1.
true.

?- 1 rdiv 2 @< 1.
false.

至于你问题中的“无理数”,你确定你不是指“有理数”吗?

最后,如果您使用术语比较的标准顺序,请确保您了解所比较的事物的类型!同样,来自 SWI-Prolog documentation :

Variables < Numbers < Strings < Atoms < Compound terms

数和原子:

?- 9 @< '0'.
true.

字符串和原子:

?- "Z" @< 'A'.
true.

变量和字符串:

?- Z @< "A".
true.

具有相同参数的两个复合术语,但是 '+' @< '-' :

?- 1 + 2 @< 1 - 2.
true.

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

关于prolog - Prolog中@<和<之间的算术差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41531851/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com