为什么在定义中使用"or"而不是"xor"?



这可能是一个微不足道的问题,但我真的在任何地方都找不到答案。计算机科学中有一种惯例,我觉得很奇特。

在haskell中,数据类型可以这样定义:

data Bool = False | True

在xml中,限定名称的定义如下:

QName   ::=   PrefixedName | UnprefixedName

可能还有更多类似的例子,但这应该足够了。

通常,|(管道或棒)应读作or。但这似乎很奇怪。当A和B都为真时,CCD_ 3也为真。虽然在第一个例子中它是有意义的(有可能某个东西同时是TrueFalse,但我们隐含地假设了不矛盾定律),但在第二个例子中却没有意义:某个东西要么是PrefixedName,要么是UnprefixedName——不可能两者都是。

那么,为什么经常这样说呢?为什么不使用exclusive或?有什么非常规的原因吗?

这个data X = A | B表示法根本不应该被理解为逻辑OR(尽管这与直观的含义非常一致)。它的真正含义是XAB和类型,即一个副产物。现在,布尔值上的乘积运算实际上是AND,因此对偶很自然地是OR。

不过话说回来,布尔向量空间上的求和运算实际上是XOR,所以我们要稍微转圈。。。

我只是不想读太多。CCD_ 12只是一个符号;在类C语言中,它恰好也意味着按位OR,但实际的逻辑OR通常用不同的方式表示,无论是||还是

|有很长的历史被用来分隔互斥选项列表中的项目:

  1. 正则表达式:a* | b*表示字符串可以是0个或更多的as或0个或多个bs,但不能同时是这两个。

  2. 用于表示上下文无关语法的Backus-Naur形式:

    Expr ::= Term | Expr AddOp Term
    

    其中表达式可以是单个项,也可以是与具有加法运算符的项组合的另一个表达式。(两者不能同时出现。)

  3. 命令行程序的使用消息:

    git branch (-d | -D) [-r] <branchname>...
    

    这里,git branch命令可以采用-d-D选项,但不能在同一调用中同时采用这两个选项。

Haskell中的data语句延续了这一传统;它与使用CCD_ 23作为逻辑或逐位运算符无关。

(如果有什么不同的话,|用于逐位OR可能是受到Backus-Naur形式的启发,在这种情况下,您可能会问为什么|用于OR而不是XOR。)

我认为这里"或"的含义是字面意义上的,而不是数学意义上的。使用术语"或"意味着该值可以有一个或另一个值。它不是一个旨在确定真值的运算符。

虽然使用"或"运算符符号可能不完全合乎逻辑,但它在读者理解这一点方面做得足够好。这种清晰度最终是一种语言所追求的。只要有更大比例的读者能够将其解释为"字面"用法,而不是"数学"运算符用法,使用或从字面意义上来说,意味着作为一种语言,你在理解自己的观点方面做得更好,使该方法优于使用XOR等方法。

最新更新