从 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?
这是我的推理:
Bool
里面只有两个元素,True
和False
;
- different 指的是函数在被视为黑盒时所做的事情,而不管它们内部发生了什么(例如,两个函数将两个
Int
的总和编码为arg1 + arg2
和 arg2 + arg1
分别是从 Int
到 Int
) 的相同函数);
- 所以不同的功能是从两个
Bool
之一到两个 Bool
另一个的功能:
T
到 T
T
到 F
F
到 T
F
到 F
- 我需要哪些功能才能使这些进出场景成为可能?好吧,我想我只需要两个,例如允许 1 和 4 的恒等函数,以及允许 2 和 3 的否定函数。
我的推理是否正确?
有四个函数:
1
假 -> 假
真 -> 假
2
假 -> 假
真 -> 真
3
假 -> 真
真 -> 假
4
假 -> 真
真 -> 真
说明
你的推理大部分是正确的。函数是黑盒,我们将它们视为值。由于输入是一个布尔值并且有两个可能的值并且该函数可能有两个单独的值,基本上是数字 if 2^2 = 4
the different functions are those going from one of the two Bool
s to another of the two Bool
s
没有。一个函数确实从它的 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 -> t
、t -> f
f -> t
、t -> 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。)
因为这(至少在我看来)与编程密切相关,所以我在这里而不是在 math or cs 上提问,但如果您认为它最适合那里或另一边,请说说你的看法吧。
在 Bartosz Milewski 的 程序员范畴论 第 2 章的末尾,有这个问题:
How many different functions are there from
Bool
toBool
? Can you implement them all?
这是我的推理:
Bool
里面只有两个元素,True
和False
;- different 指的是函数在被视为黑盒时所做的事情,而不管它们内部发生了什么(例如,两个函数将两个
Int
的总和编码为arg1 + arg2
和arg2 + arg1
分别是从Int
到Int
) 的相同函数); - 所以不同的功能是从两个
Bool
之一到两个Bool
另一个的功能:T
到T
T
到F
F
到T
F
到F
- 我需要哪些功能才能使这些进出场景成为可能?好吧,我想我只需要两个,例如允许 1 和 4 的恒等函数,以及允许 2 和 3 的否定函数。
我的推理是否正确?
有四个函数:
1
假 -> 假
真 -> 假
2
假 -> 假
真 -> 真
3
假 -> 真
真 -> 假
4
假 -> 真
真 -> 真
说明
你的推理大部分是正确的。函数是黑盒,我们将它们视为值。由于输入是一个布尔值并且有两个可能的值并且该函数可能有两个单独的值,基本上是数字 if 2^2 = 4
the different functions are those going from one of the two
Bool
s to another of the twoBool
s
没有。一个函数确实从它的 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 -> t
、t -> f
f -> t
、t -> 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。)