ESC
其他 1 分钟阅读

在 Dummit 和 Foote 的《抽象代数》中发现一个 bug

一篇博客指出经典教材《Abstract Algebra》的第一道证明题存在错误。作者从函数、单射与左逆的定义出发,以程序员熟悉的确定性视角解读函数,并用反例论证"函数是单射当且仅当它有左逆"并不总成立:当 A 为空集、B 非空时,空函数是单射,但不存在从 B 到 A 的函数,因此没有左逆。

来源:Hacker News

一个从集合 A 到集合 B 的函数 f(记作 “f: A -> B”)是一个有序对的集合,满足:

  • 每个有序对的第一项来自 A。
  • 每个有序对的第二项来自 B。
  • 对于 A 中的每个元素,它恰好是其中一个有序对的第一项。

换句话说,对于各位程序员来说,一个函数由它所有输入-输出对构成的集合来定义,并且必须是确定性的。

如果一个函数没有任何两个不同的输入映射到相同的输出,它就是单射(injective)的。 例如,f: int -> int 定义为 f(x) = x^2 就不是单射,因为 f(1) = f(-1)。

函数 f: A -> B 拥有左逆(left inverse),是指存在一个函数 g: B -> A,使得对 A 中所有 a,都有 g(f(a)) = a。 换句话说,f 的左逆能够"撤销" f。

书中的第一道证明练习题是:证明一个函数是单射的当且仅当它有左逆。

这个命题是错误的。设 A = {},B = {1}。 令 f: A -> B = {}。 函数 f 确实是一个函数,因为它满足上面定义中列出的三个条件。 函数 f 是单射的,因为"没有两个不同的输入映射到相同的输出"平凡地(vacuously)成立。 然而,f 并没有左逆,因为根本不存在从 B 到 A 的函数。