从 Bool 到 Bool 有多少种不同的函数?

How many different functions are there from Bool to Bool?

因为这(至少在我看来)与编程密切相关,所以我在这里而不是在 math or cs 上提问,但如果您认为它最适合那里或另一边,请说说你的看法吧。

在 Bartosz Milewski 的 程序员范畴论 第 2 章的末尾,有这个问题:

How many different functions are there from Bool to Bool? Can you implement them all?

这是我的推理:

我的推理是否正确?

有四个函数:

1

假 -> 假
真 -> 假

2

假 -> 假
真 -> 真

3

假 -> 真
真 -> 假

4

假 -> 真
真 -> 真

说明

你的推理大部分是正确的。函数是黑盒,我们将它们视为值。由于输入是一个布尔值并且有两个可能的值并且该函数可能有两个单独的值,基本上是数字 if 2^2 = 4

the different functions are those going from one of the two Bools to another of the two Bools

没有。一个函数确实从它的 domain to one value from its codomain. You need to consider all possible combinations of mappings. For this, it might make sense to look at the function as a relation 映射 每个 值,并将它们全部列出:

  • f -> f, t -> f
  • f -> f, t -> t
  • f -> tt -> f
  • f -> tt -> t

这些对应4个函数

  • x => f(常量错误)
  • x => x(身份)
  • x => not(x)(否定)
  • x => t(常量为真)

你问的是编程,而不是数学或 CS,这一点很重要。

在数学上,他们会告诉您其他答案中列出了四个这样的函数。

在 CS 上,他们会告诉你有 27 个:三个可能的输入 T F 和 ⊥ 中的每一个到三个可能的输出 T F 和 ⊥ 中的每一个。

在编程中,我可以告诉你有十一:

  • (T->T, F->F, ⊥->⊥) 身份
  • (T->F, F->T, ⊥->⊥) 不是
  • (T->T, F->T, ⊥->T) 惰性常数真
  • (T->F, F->F, ⊥->F) 惰性常量 false
  • (T->T, F->T, ⊥->⊥) 严格常量 true
  • (T->F, F->F, ⊥->⊥) 严格常量 false
  • (T->⊥, F->F, ⊥->⊥) 身份失败为真
  • (T->T, F->⊥, ⊥->⊥) identity fail on false
  • (T->⊥, F->T, ⊥->⊥) 不失败
  • (T->F, F->⊥, ⊥->⊥) 不失败 false
  • (T->⊥, F->⊥, ⊥->⊥) 失败

(这个答案相当tongue-in-cheek:我认为实际上大多数学术 CS 类型会说 4 或 11。)