X10*_*10D 2 scheme code-generation equality equals racket
如果两个布尔值相同,则两个布尔值相等,两个数字相似。如果两个集合具有相同的元素,则它们相等。如果检查两组是否相等,我们可以使用以下方案/球拍函数:
\n\n(define (same-set? l1 l2)\n (and (subset? l1 l2) (subset? l2 l1)))\nRun Code Online (Sandbox Code Playgroud)\n\n那么这样的函数是如何自动生成的呢?可以为任意数据类型生成它吗?
\n\n等价关系的基本性质是:
\n\n替换性质:对于任意数量a和b以及任意表达式F(x),如果a = b,则F(a) = F(b)(如果两边都有意义,即格式良好)。\n一些具体例子其中:
\n\n对于任何实数a、b和c,如果a = b,则a + c = b + c(这里F(x)是x + c);
\n\n对于任何实数 a、b 和 c,如果 a = b,则 a \xe2\x88\x92 c = b \xe2\x88\x92 c (这里 F(x) 是 x \xe2\x88\x92 c) ;
\n\n对于任何实数a、b和c,如果a = b,则ac = bc(这里F(x)是xc);
\n\n对于任何实数 a、b 和 c,如果 a = b 且 c 不为零,则 a/c = b/c(此处 F(x) 为 x/c)。
\n\n自反性质:对于任何数量 a,a = a。\n对称性质:对于任何数量 a 和 b,如果 a = b,则 b = a。\n传递性质:对于任何数量 a、b 和 c,如果 a = b 且 b = c,则 a = c。
\n\n是否可以生成一个遵循上述属性的函数?这样就够了吗?了解数据类型有帮助吗?
\n\n如果您对如何改进此问题有任何想法或对其进行标记,请发表评论。
\n我只是想扩展一下@Sorawee Porncharoenwase 的答案。他们提到了两种平等,参照平等eq?和结构平等equal?。
这些不同的平等概念都应该遵循自反性、对称性和传递性的基本要求。但它们的不同之处在于它们在返回 true 或 false 时所提供的保证。
需要记住的一些有用的平等类别是引用平等、所有时间的结构平等、当前的结构平等以及特定领域的等价。
该eq?函数实现了引用相等,并且当它返回 true 时它有最强的保证,但是当它返回 false 时你还没有学到很多东西。
(eq? x y)暗示x和y从字面上看是同一个对象,并且 上的任何操作都x可以替换为相同的 上y,包括突变。帮助我解释这一点的一件事是《球拍领域》一书中说,如果你刮胡子x,那么y也会被刮胡子,因为它是同一个物体。
然而,当(eq? x y)返回 false 时,那就很弱了。在涉及分配内存的许多数据结构上,eq?可能会因为指针不同而返回 false,即使它们是不可变的并且其他所有内容都相同。
这可以由编程语言自动提供,因为它实际上只不过是指针相等,并且不必为新数据结构生成任何新行为。
尽管 Rackjure 等库可以通过诸如egal?. 它在可变数据结构上实现引用相等,但在不可变数据结构上实现结构相等。
这是为了保证如果(egal? x y)现在返回 true,那么它在过去就是 true,并且只要x和y两者都存在,将来就将继续为 true。
这可以由编程语言自动提供,只要该语言允许您指定哪些数据结构是不可变的、哪些是可变的,并强制执行不变性。
我不确定,但chaperone-of?也可能是遵循“有史以来的结构平等”思想的一个例子,只不过它chaperone-of?不是对称的(并且天真的对称闭包会失去传递性)。
编辑:自 2022 年 8 月 10 日发布的 Racket v8.6 起,现在由equal-always?.
如果您想了解更多信息,请参阅Pyret 中的平等类型或功能对象的平等权利。
该equal?函数实现当前时间的结构相等。这意味着如果两个可变数据结构当前具有所有相同的组件,那么它们现在可以相等,即使它们在过去不相等或由于突变而在将来不会相等。
只要编程语言始终知道数据结构中包含的数据的所有子部分,这就可以由编程语言自动提供。
例如,对于数字和数学领域,您可能希望不精确的数字2.0等于精确的整数2。对于字符串搜索领域,您可能需要字符串和字符不区分大小写的等效性,以便A和a等效。对于集合域,您可能希望顺序无关,以便(a b)和(b a)相等。
每个领域都是不同的,因此这需要在每个领域付出更多的努力。编程语言无法读懂你的想法。
| 归档时间: |
|
| 查看次数: |
250 次 |
| 最近记录: |