2

我正在尝试在 Haskell 上创建一个关联 xor 图表,据我了解,这在每种情况下都应该是正确的。虽然,当我调用我的函数时,我得到:[True, True, True, False, True, False, True, True]。谁能看到我犯的错误?

bools = [True, False]

xor_assoc = [   ((r || (p || q)) && not (r || (p && q)))
             == ((p || (r || q)) && not (p || (r && q)))
            | r <- bools,
              p <- bools,
              q <- bools]
4

3 回答 3

3

你的原则是错误的:(r || (p && q)) /= (p || (r && q))。反例是(p, q, r) = (T, F, F)我们有

(F || (T && F)) /= (T || (F && F))
(F || F       ) /= (T || F       )
F               /= T

值得注意的是,两者(||)(&&)都是单独关联的,但不会彼此关联。

于 2013-09-14T06:19:29.937 回答
0

我不知道你到底在做什么。但是你做列表理解的方式,它会产生所有可能的2^3情况。你的谓词False 在其中两个中返回。

(p,q,r) = (False,False,True)then(r || (p && q))变成True因此 lhs 是False,而(p || (r && q))isFalse并且因此 rhs 是True

类似的情况是(True,False,False)lhs 是Truerhs 是False

于 2013-09-14T06:17:19.570 回答
0

您是否正在尝试实施r xor p xor q?那应该有4个真和4个假。

[r /= (p /= q) | let bools = [True, False], r <- bools, p <- bools, q <- bools]

或者,如果您要证明 xor 是关联的,那么:

[(r /= (p /= q)) == ((r /= p) /= q) |
 let bools = [True, False], r <- bools, p <- bools, q <- bools]

这个确实有全部 8 True

于 2013-09-14T10:10:21.477 回答