【问题标题】:How many different functions are there from Bool to Bool?从 Bool 到 Bool 有多少种不同的函数?
【发布时间】:2020-12-30 22:53:13
【问题描述】:

因为这(至少在我看来)与编程密切相关,所以我在这里而不是在 mathcs 上提问,但如果您认为它最适合那里或另一边,请只是发表你的意见。

在 Bartosz Milewski 的 Category Theory for Programmers 第 2 章末尾,有一个问题:

BoolBool 有多少种不同的功能?你能全部实现吗?

这是我的推理:

  • Bool 里面只有两个元素,TrueFalse
  • 不同是指如果考虑黑盒,函数会做什么,而不管它们内部发生了什么(例如,两个函数将两个Ints 的总和分别编码为arg1 + arg2arg2 + arg1,将从IntInt 的功能相同);
  • 所以不同的功能是从两个Bools 之一到两个Bools 中的另一个:
    1. TT
    2. TF
    3. FT
    4. FF
  • 我需要哪些功能才能使这些进出方案成为可能?好吧,我想我只需要两个,例如允许 1 和 4 的恒等函数,以及允许 2 和 3 的否定。

我的推理正确吗?

【问题讨论】:

  • 您仍然可以使用两个不同于身份和否定的函数,但仍然可以涵盖所有内容。一个函数只返回T,覆盖1. + 3。另一个只返回F,覆盖2. + 4。
  • 我确实也想过这个,但根据我得到的答案,这似乎也是一个错误的结论。
  • 1.返回假。 2. 返回真。 3. 返回输入。 4.返回输入否定。

标签: functional-programming boolean-logic category-theory


【解决方案1】:

有四个功能:

1

假->假
真 -> 假

2

假->假
真->真

3

假->真
真 -> 假

4

假->真
真->真

说明

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

【讨论】:

    【解决方案2】:

    不同的功能是从两个Bools 之一到两个Bools 中的另一个

    没有。函数确实将其domain 中的每个 值映射到其codomain 中的一个值。您需要考虑所有可能的映射组合。为此,将函数视为 relation 并列出它们可能是有意义的:

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

    这些对应4个功能

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

    【讨论】:

      【解决方案3】:

      您问的是编程而不是数学或 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) 惰性常数假
      • (T->T, F->T, ⊥->⊥) 严格常量为真
      • (T->F, F->F, ⊥->⊥) 严格常数假
      • (T->⊥, F->F, ⊥->⊥) 身份在 true 时失败
      • (T->T, F->⊥, ⊥->⊥) 身份因错误而失败
      • (T->⊥, F->T, ⊥->⊥) 在 true 上不会失败
      • (T->F, F->⊥, ⊥->⊥) 不失败
      • (T->⊥, F->⊥, ⊥->⊥) 失败

      (这个答案很诙谐:我认为实际上大多数学术 CS 类型会说 4 或 11。)

      【讨论】:

      • 您能解释一下您认为数学、CS 和编程人员会给出的答案的差异吗?也许我会发现自己,一个数学家会说除了 true 或 false 之外没有其他可能的值,它给出了 4 种组合。但是是什么让 27 和 11 场景不同?
      • 基本上在数学中(以及总编程,tbf,可能包括 OP 正在使用的书) Bool 只有两个值。但是在编程中,我们不使用函数本身,我们使用计算。并且计算可能无法返回(参见停止问题),因此在指称语义中,Bool 有第三个值,底部,表示非终止或其他失败。从三值集到三值集共有 27 个函数。但是当然这还不是全部,因为当它的参数是底部时返回一些东西的函数是不存在的,除非它是惰性的......
      • ...并完全忽略它们。这消除了一堆可能的函数/计算,比如 T->F F->T bottom->T,只剩下 11 个。27 个主要是个玩笑;真正的计算机科学家当然会注意到三个状态函数中的大多数无法计算,并消除它们,因为计算是我们首先添加底部来解释的。 (Tldr:这主要是个玩笑,正如其他答案所说,您的书正在寻找的答案是“4”。)
      猜你喜欢
      • 2013-05-05
      • 2013-09-14
      • 2023-02-10
      • 1970-01-01
      • 2013-12-01
      • 2017-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多