为什么在定义中使用 "or" 而不是 "xor"?
Why use "or" instead of "xor" in definitions?
这可能是一个微不足道的问题,但我真的找不到答案。计算机科学中有一个惯例,我觉得很奇怪。
在haskell datatypes中可以这样定义:
data Bool = False | True
在xml中qualified names是这样定义的:
QName ::= PrefixedName | UnprefixedName
可能还有更多类似的例子,但这应该足够了。
通常it is well understood |
(管或棒)应读作or
。但这似乎很奇怪。当 A 和 B 都为真时,A or B
也为真。虽然它在第一个例子中是有意义的(有可能某些东西同时是 True
和 False
,但我们隐含地假设了非矛盾定律),它在第二:某物要么是 PrefixedName
要么是 UnprefixedName
,但不能两者兼而有之。
那为什么经常这样写呢?为什么不使用独占或?有什么非常规的原因吗?
我觉得这里的"or"是字面意思,不是数学意思。使用术语 "or" 意味着该值可以有一个值或另一个值。它不是一个旨在确定真值的运算符。
虽然为此使用 "or" 操作符号可能不完全合乎逻辑,但它足以很好地表达 reader 的要点。这种清晰度最终是一种语言所追求的目标。只要更大比例的 readers 能够将其解释为 "literal" 用法而不是 "mathematical" 运算符用法,使用或在字面意义上意味着您,作为一种语言,在传达您的观点方面做得更好,使该方法优于使用异或之类的方法。
这个 data X = A | B
符号实际上根本不应该被理解为逻辑或(尽管这与直观的含义相当吻合)。它真正的意思是 X
是 A
和 B
的 和类型 ,即 coproduct。现在,对布尔值的 product 运算实际上是 AND,因此对偶自然就是 OR。
尽管话又说回来,对布尔值向量 space 的求和运算实际上是 XOR,所以我们稍微转了个圈...
我只是不会对此读太多。 |
只是一个符号;在 C-like 语言中,它恰好也表示按位或,但实际的逻辑或通常表示不同,无论是 ||
还是 ∨
.
|
长期以来一直用于分隔互斥选项列表中的项目:
正则表达式:a* | b*
表示一个字符串可以是 0 个或多个 a
或 0 个或多个 b
,但不能两者都是。
Backus-Naur 表示 context-free 文法的形式:
Expr ::= Term | Expr AddOp Term
其中表达式可以是单个术语,也可以是另一个表达式与带有加法运算符的术语组合。 (两者不能同时存在。)
command-line 个程序的使用信息:
git branch (-d | -D) [-r] <branchname>...
这里的 git branch
命令可以使用 -d
或 -D
选项,但不能在同一个调用中同时使用这两个选项。
Haskell中的data
语句延续了这一传统;它与 |
作为逻辑或 bit-wise 运算符的使用无关。
(如果有的话,|
用于按位 OR
的使用可能受到 Backus-Naur 形式的启发,在这种情况下你可能会问为什么 |
用于 OR
而不是 XOR
。)
这可能是一个微不足道的问题,但我真的找不到答案。计算机科学中有一个惯例,我觉得很奇怪。
在haskell datatypes中可以这样定义:
data Bool = False | True
在xml中qualified names是这样定义的:
QName ::= PrefixedName | UnprefixedName
可能还有更多类似的例子,但这应该足够了。
通常it is well understood |
(管或棒)应读作or
。但这似乎很奇怪。当 A 和 B 都为真时,A or B
也为真。虽然它在第一个例子中是有意义的(有可能某些东西同时是 True
和 False
,但我们隐含地假设了非矛盾定律),它在第二:某物要么是 PrefixedName
要么是 UnprefixedName
,但不能两者兼而有之。
那为什么经常这样写呢?为什么不使用独占或?有什么非常规的原因吗?
我觉得这里的"or"是字面意思,不是数学意思。使用术语 "or" 意味着该值可以有一个值或另一个值。它不是一个旨在确定真值的运算符。
虽然为此使用 "or" 操作符号可能不完全合乎逻辑,但它足以很好地表达 reader 的要点。这种清晰度最终是一种语言所追求的目标。只要更大比例的 readers 能够将其解释为 "literal" 用法而不是 "mathematical" 运算符用法,使用或在字面意义上意味着您,作为一种语言,在传达您的观点方面做得更好,使该方法优于使用异或之类的方法。
这个 data X = A | B
符号实际上根本不应该被理解为逻辑或(尽管这与直观的含义相当吻合)。它真正的意思是 X
是 A
和 B
的 和类型 ,即 coproduct。现在,对布尔值的 product 运算实际上是 AND,因此对偶自然就是 OR。
尽管话又说回来,对布尔值向量 space 的求和运算实际上是 XOR,所以我们稍微转了个圈...
我只是不会对此读太多。 |
只是一个符号;在 C-like 语言中,它恰好也表示按位或,但实际的逻辑或通常表示不同,无论是 ||
还是 ∨
.
|
长期以来一直用于分隔互斥选项列表中的项目:
正则表达式:
a* | b*
表示一个字符串可以是 0 个或多个a
或 0 个或多个b
,但不能两者都是。Backus-Naur 表示 context-free 文法的形式:
Expr ::= Term | Expr AddOp Term
其中表达式可以是单个术语,也可以是另一个表达式与带有加法运算符的术语组合。 (两者不能同时存在。)
command-line 个程序的使用信息:
git branch (-d | -D) [-r] <branchname>...
这里的
git branch
命令可以使用-d
或-D
选项,但不能在同一个调用中同时使用这两个选项。
Haskell中的data
语句延续了这一传统;它与 |
作为逻辑或 bit-wise 运算符的使用无关。
(如果有的话,|
用于按位 OR
的使用可能受到 Backus-Naur 形式的启发,在这种情况下你可能会问为什么 |
用于 OR
而不是 XOR
。)