如果 Either 可以是 Left 或 Right 而不是两者,那么为什么它对应于 OR 而不是 Curry-Howard 对应关系中的 XOR?
If Either can be either Left or Right but not both, then why does it correspond to OR instead of XOR in Curry-Howard correspondence?
我问的时候, one of the answers, now deleted, was suggesting that the type Either
corresponds to XOR, rather than OR, in the Curry-Howard correspondence,因为不能同时Left
和Right
真相在哪里?
如果你有一个 P
类型的值和 类型 Q
的值(也就是说,你有两个 P
和 Q
的证明),那么您仍然可以提供 Either P Q
.
类型的值
考虑
x :: P
y :: Q
...
z :: Either P Q
z = Left x -- Another possible proof would be `Right y`
虽然 Either
没有明确表示这种情况的特定案例(与 These
不同),但它不会对 排除 它做任何事情(如 exclusive OR).
这第三种都有证明的情况与其他两种只有一个有证明的情况有点不同,这反映了直觉逻辑中“不排除”某物与“包括”某物有点不同, 因为 Either
没有为此事实提供特定的见证。但是 Either
不是 XOR 通常工作方式的 XOR,因为正如我所说,它不排除两个部分都有证明的情况。另一方面, 更接近 XOR。
Either
就其可能的证人而言有点像异或。另一方面,它就像一个 inclusive OR 当您考虑是否可以在四种可能的情况下实际创建见证时:具有 P 的证明和 Q 的反驳,具有Q 的证明和 P 的反驳,对两者都有证明或对两者都有反驳。[1] 当你可以构造一个 Either P Q
类型的值时有 P 和 Q 的证明(类似于包含性 OR),您无法将这种情况与只有 P 有证明或只有 Q 有证明仅使用类型 Either P Q
的值(种类类似于异或)。另一方面,Daniel Wagner 的解决方案类似于 both 构造和解构的异或。
另外值得一提的是,These
更明确的表示了两者都有证明的可能性。 These
类似于 inclusive OR 在构建和解构方面。但是,同样值得注意的是,当您同时拥有 P 和 Q 的证明时,没有什么可以阻止您使用“不正确”的构造函数。您可以扩展 These
以在这方面更能代表包容性 OR有点额外的复杂性:
data IOR a b
= OnlyFirst a (Not b)
| OnlySecond (Not a) b
| Both a b
type Not a = a -> Void
These
的潜在“错误构造函数”问题(以及 Either
中缺少“两者”见证)如果您只对证明不相关的逻辑感兴趣,那么这并不重要系统(这意味着无法区分同一命题的任何两个证明),但在逻辑中需要更多计算相关性的情况下,它可能很重要。[2]
在编写实际要执行的计算机程序的实际情况下,计算相关性通常非常重要。尽管 0
和 23
都是 Int
类型存在的证明,但我们当然喜欢在程序中区分这两个值,一般来说!
关于“建设”和“破坏”
本质上,我只是指通过构造“创建类型的值”和通过破坏“模式匹配”(有时人们在这里使用“引入”和“消除”这两个词,特别是在逻辑上下文中)。
以 Daniel Wagner 的解决方案为例:
构造:构造Xor A B
类型的值时,必须提供A
或B
和另一个的反驳。这类似于异或。除非你有一个A
或B
和的反驳,否则不可能构造这个的值另一个的证明。一个特别重要的事实是,如果你有 A
和 B
的证明并且你 没有 有反驳,你就不能构造这种类型的值它们中的任何一个(不同于 inclusive OR)。
破坏:当你对类型Xor A B
的值进行模式匹配时,你总是其中一种类型的证明和另一种类型的反驳。它 永远不会 为您提供两者的证明。这是根据它的定义得出的。
在IOR
的情况下:
构造:当你创建一个IOR A B
类型的值时,你必须恰好执行以下操作之一:(1) 只提供一个A
的证明和 B
的反驳,(2) 提供 B
的证明和 B
的反驳,(3) 同时提供 [=35] 的证明=] 和 B
。这就像包容性 OR。这三种可能性完全对应于 IOR
的三个构造函数中的每一个,没有重叠。请注意,与 These
的情况不同,如果您同时拥有 A
和 B
的证明,则不能使用“不正确的构造函数”:唯一在这种情况下,创建类型 IOR A B
的值的方法是使用 Both
(因为否则您需要提供 A
之一的 反驳 或 B
).
Destruction:由于三种可能的情况下你至少可以证明A
和B
之一是正好由IOR
表示,每个都有一个单独的构造函数(并且构造函数之间没有重叠),你将总是知道exactly A
和 B
中的哪一个是真的,哪个是假的(如果适用)通过对其进行模式匹配。
模式匹配 IOR
IOR
上的模式匹配与任何其他代数数据类型上的模式匹配完全相同。这是一个例子:
x :: IOR Char Int
x = Both 'c' 3
y :: IOR Char Void
y = OnlyFirst 'a' (\v -> v)
f :: Not p -> IOR p Int
f np = OnlySecond np 7
z :: IOR Void Int
z = f notVoid
g :: IOR p Int -> Int
g w =
case w of
OnlyFirst p q -> -1
OnlySecond p q -> q
Both p q -> q
-- We can show that the proposition represented by "Void" is indeed false:
notVoid :: Not Void
notVoid = \v -> v
然后是一个示例 GHCi 会话,上面的代码已加载:
ghci> g x
3
ghci> g z
7
[1]当您认为某些陈述是不可判定的,因此您无法构造证明时,这会变得有点复杂或对他们的反驳。
[2]同伦类型理论将是证明相关系统的一个例子,但这已达到我的知识极限截至目前。
也许尝试用“证据”替换Curry-Howard同构中的“证明”。
下面我会用斜体来表示命题和证明(我也称之为证据),同构的数学方面,我会用code
来表示类型和值。
问题是:假设我知道 P 为真的证据的 [values corresponding to] 的类型(我将称这种类型为 P
),并且我知道 Q 为真的证据类型(我称这种类型为 Q
),那么命题 R[=96 的证据类型是什么=] = P 或 Q?
那么有两种方法可以证明R:我们可以证明P,或者我们可以证明Q。我们可以同时证明两者,但这会比必要的工作更多。
现在请问类型应该是什么?它是 P 证据或 Q 证据的事物类型。 IE。 P
类型或 Q
类型的值。类型 Either P Q
恰好包含这些值。
如果你有 P AND Q 的证据怎么办?嗯,这只是一个 (P, Q)
类型的值,我们可以写一个简单的函数:
f :: (p,q) -> Either p q
f (a,b) = Left a
这为我们提供了一种方法来证明 P 或 Q 如果我们可以证明 P 和 Q。所以Either
不能对应xor.
P XOR Q 的类型是什么?
在这一点上我会说否定在这种建设性逻辑中有点烦人。
让我们将问题转化为我们理解的东西,以及我们不理解的更简单的东西:
P XOR Q = (P AND (NOT Q )) OR (Q AND (NOT P))
现在问:NOT P的证据类型是什么?
我没有直观的解释为什么这是最简单的类型,但如果 P 不是真的那么 P 的证据为真将是一个矛盾,我们称之为证明 FALSE,即无法证明的事物(又名 BOTTOM 或 BOT)。也就是说,NOT P 可以更简单地写成:P IMPLIES FALSE。 FALSE 的类型称为 Void(在 haskell 中)。它是一种没有价值的类型,因为没有它的证据。因此,如果您可以构造该类型的值,您就会遇到问题。 IMPLIES对应函数,所以NOT P对应的类型是P -> Void
.
我们把它与我们所知道的放在一起,并在命题的语言中得到以下等价物:
P XOR Q = (P AND (NOT Q )) OR (Q AND (NOT P)) = (P AND (Q 暗示错误)) 或 ((P 暗示错误) 和 Q)
那么类型是:
type Xor p q = Either (p, q -> Void) (p -> Void, q)
混淆源于逻辑的布尔truth-table 阐述。特别是,当两个参数都为 True 时,OR 为 True,而 XOR 为 False。从逻辑上讲,这意味着要证明 OR 就足以提供其中一个论点的证据;但如果另一个也是 True 也没关系——我们不在乎。
在Curry-Howard解释中,如果有人给你一个Either a b
的元素,而你能够从中提取a
的值,你仍然对[=一无所知12=]。可能有人居住也可能无人居住
另一方面,要证明XOR,你不仅需要一个论证的证明,你还必须提供另一个论证假的证明。
因此,根据 Curry-Howard 解释,如果有人给你一个 Xor a b
的元素并且你能够从中提取 a
的值,你会得出结论 b
无人居住(即与 Void
同构)。相反,如果您能够提取 b
的值,那么您就会知道 a
无人居住。
a
的错误证明是一个函数 a->Void
。给定 a
的值,这样的函数将能够产生 Void
的值,这显然是不可能的。所以不能有 a
的值。 (returnsVoid
只有一个函数,就是Void
上的恒等式。)
我问的时候Either
corresponds to XOR, rather than OR, in the Curry-Howard correspondence,因为不能同时Left
和Right
真相在哪里?
如果你有一个 P
类型的值和 类型 Q
的值(也就是说,你有两个 P
和 Q
的证明),那么您仍然可以提供 Either P Q
.
考虑
x :: P
y :: Q
...
z :: Either P Q
z = Left x -- Another possible proof would be `Right y`
虽然 Either
没有明确表示这种情况的特定案例(与 These
不同),但它不会对 排除 它做任何事情(如 exclusive OR).
这第三种都有证明的情况与其他两种只有一个有证明的情况有点不同,这反映了直觉逻辑中“不排除”某物与“包括”某物有点不同, 因为 Either
没有为此事实提供特定的见证。但是 Either
不是 XOR 通常工作方式的 XOR,因为正如我所说,它不排除两个部分都有证明的情况。另一方面,
Either
就其可能的证人而言有点像异或。另一方面,它就像一个 inclusive OR 当您考虑是否可以在四种可能的情况下实际创建见证时:具有 P 的证明和 Q 的反驳,具有Q 的证明和 P 的反驳,对两者都有证明或对两者都有反驳。[1] 当你可以构造一个 Either P Q
类型的值时有 P 和 Q 的证明(类似于包含性 OR),您无法将这种情况与只有 P 有证明或只有 Q 有证明仅使用类型 Either P Q
的值(种类类似于异或)。另一方面,Daniel Wagner 的解决方案类似于 both 构造和解构的异或。
另外值得一提的是,These
更明确的表示了两者都有证明的可能性。 These
类似于 inclusive OR 在构建和解构方面。但是,同样值得注意的是,当您同时拥有 P 和 Q 的证明时,没有什么可以阻止您使用“不正确”的构造函数。您可以扩展 These
以在这方面更能代表包容性 OR有点额外的复杂性:
data IOR a b
= OnlyFirst a (Not b)
| OnlySecond (Not a) b
| Both a b
type Not a = a -> Void
These
的潜在“错误构造函数”问题(以及 Either
中缺少“两者”见证)如果您只对证明不相关的逻辑感兴趣,那么这并不重要系统(这意味着无法区分同一命题的任何两个证明),但在逻辑中需要更多计算相关性的情况下,它可能很重要。[2]
在编写实际要执行的计算机程序的实际情况下,计算相关性通常非常重要。尽管 0
和 23
都是 Int
类型存在的证明,但我们当然喜欢在程序中区分这两个值,一般来说!
关于“建设”和“破坏”
本质上,我只是指通过构造“创建类型的值”和通过破坏“模式匹配”(有时人们在这里使用“引入”和“消除”这两个词,特别是在逻辑上下文中)。
以 Daniel Wagner 的解决方案为例:
构造:构造
Xor A B
类型的值时,必须提供A
或B
和另一个的反驳。这类似于异或。除非你有一个A
或B
和的反驳,否则不可能构造这个的值另一个的证明。一个特别重要的事实是,如果你有A
和B
的证明并且你 没有 有反驳,你就不能构造这种类型的值它们中的任何一个(不同于 inclusive OR)。破坏:当你对类型
Xor A B
的值进行模式匹配时,你总是其中一种类型的证明和另一种类型的反驳。它 永远不会 为您提供两者的证明。这是根据它的定义得出的。
在IOR
的情况下:
构造:当你创建一个
IOR A B
类型的值时,你必须恰好执行以下操作之一:(1) 只提供一个A
的证明和B
的反驳,(2) 提供B
的证明和B
的反驳,(3) 同时提供 [=35] 的证明=] 和B
。这就像包容性 OR。这三种可能性完全对应于IOR
的三个构造函数中的每一个,没有重叠。请注意,与These
的情况不同,如果您同时拥有A
和B
的证明,则不能使用“不正确的构造函数”:唯一在这种情况下,创建类型IOR A B
的值的方法是使用Both
(因为否则您需要提供A
之一的 反驳 或B
).Destruction:由于三种可能的情况下你至少可以证明
A
和B
之一是正好由IOR
表示,每个都有一个单独的构造函数(并且构造函数之间没有重叠),你将总是知道exactlyA
和B
中的哪一个是真的,哪个是假的(如果适用)通过对其进行模式匹配。
模式匹配 IOR
IOR
上的模式匹配与任何其他代数数据类型上的模式匹配完全相同。这是一个例子:
x :: IOR Char Int
x = Both 'c' 3
y :: IOR Char Void
y = OnlyFirst 'a' (\v -> v)
f :: Not p -> IOR p Int
f np = OnlySecond np 7
z :: IOR Void Int
z = f notVoid
g :: IOR p Int -> Int
g w =
case w of
OnlyFirst p q -> -1
OnlySecond p q -> q
Both p q -> q
-- We can show that the proposition represented by "Void" is indeed false:
notVoid :: Not Void
notVoid = \v -> v
然后是一个示例 GHCi 会话,上面的代码已加载:
ghci> g x
3
ghci> g z
7
[1]当您认为某些陈述是不可判定的,因此您无法构造证明时,这会变得有点复杂或对他们的反驳。
[2]同伦类型理论将是证明相关系统的一个例子,但这已达到我的知识极限截至目前。
也许尝试用“证据”替换Curry-Howard同构中的“证明”。
下面我会用斜体来表示命题和证明(我也称之为证据),同构的数学方面,我会用code
来表示类型和值。
问题是:假设我知道 P 为真的证据的 [values corresponding to] 的类型(我将称这种类型为 P
),并且我知道 Q 为真的证据类型(我称这种类型为 Q
),那么命题 R[=96 的证据类型是什么=] = P 或 Q?
那么有两种方法可以证明R:我们可以证明P,或者我们可以证明Q。我们可以同时证明两者,但这会比必要的工作更多。
现在请问类型应该是什么?它是 P 证据或 Q 证据的事物类型。 IE。 P
类型或 Q
类型的值。类型 Either P Q
恰好包含这些值。
如果你有 P AND Q 的证据怎么办?嗯,这只是一个 (P, Q)
类型的值,我们可以写一个简单的函数:
f :: (p,q) -> Either p q
f (a,b) = Left a
这为我们提供了一种方法来证明 P 或 Q 如果我们可以证明 P 和 Q。所以Either
不能对应xor.
P XOR Q 的类型是什么?
在这一点上我会说否定在这种建设性逻辑中有点烦人。
让我们将问题转化为我们理解的东西,以及我们不理解的更简单的东西:
P XOR Q = (P AND (NOT Q )) OR (Q AND (NOT P))
现在问:NOT P的证据类型是什么?
我没有直观的解释为什么这是最简单的类型,但如果 P 不是真的那么 P 的证据为真将是一个矛盾,我们称之为证明 FALSE,即无法证明的事物(又名 BOTTOM 或 BOT)。也就是说,NOT P 可以更简单地写成:P IMPLIES FALSE。 FALSE 的类型称为 Void(在 haskell 中)。它是一种没有价值的类型,因为没有它的证据。因此,如果您可以构造该类型的值,您就会遇到问题。 IMPLIES对应函数,所以NOT P对应的类型是P -> Void
.
我们把它与我们所知道的放在一起,并在命题的语言中得到以下等价物:
P XOR Q = (P AND (NOT Q )) OR (Q AND (NOT P)) = (P AND (Q 暗示错误)) 或 ((P 暗示错误) 和 Q)
那么类型是:
type Xor p q = Either (p, q -> Void) (p -> Void, q)
混淆源于逻辑的布尔truth-table 阐述。特别是,当两个参数都为 True 时,OR 为 True,而 XOR 为 False。从逻辑上讲,这意味着要证明 OR 就足以提供其中一个论点的证据;但如果另一个也是 True 也没关系——我们不在乎。
在Curry-Howard解释中,如果有人给你一个Either a b
的元素,而你能够从中提取a
的值,你仍然对[=一无所知12=]。可能有人居住也可能无人居住
另一方面,要证明XOR,你不仅需要一个论证的证明,你还必须提供另一个论证假的证明。
因此,根据 Curry-Howard 解释,如果有人给你一个 Xor a b
的元素并且你能够从中提取 a
的值,你会得出结论 b
无人居住(即与 Void
同构)。相反,如果您能够提取 b
的值,那么您就会知道 a
无人居住。
a
的错误证明是一个函数 a->Void
。给定 a
的值,这样的函数将能够产生 Void
的值,这显然是不可能的。所以不能有 a
的值。 (returnsVoid
只有一个函数,就是Void
上的恒等式。)