如何减少逻辑表达式

How to reduce logic expressions?

本文关键字:表达式 何减少      更新时间:2023-10-16
{
ans += (a[i] > a[j]) != (b[i] > b[j]);
//ans += ((a[i] > a[j]) && (b[j] > b[i])) || ((a[j] > a[i]) && (b[i] > b[j]));
}

你在上面看到的是我从某个地方拿来的片段。有两种逻辑表达式。据说,注释掉的那个与未注释掉的那个相同。

你如何从:

((a[i] > a[j]) && (b[j] > b[i])) || ((a[j] > a[i]) && (b[i] > b[j])) 

到这样的东西

(a[i] > a[j]) != (b[i] > b[j])

有没有关于这种逻辑表达简化的指南或书籍?

这其实很简单。

对于(a[i] > a[j]) != (b[i] > b[j]),我们要说的是,只有当与a[i]a[j]的关系与从b[i]b[j]的关系相反时,这才是真的。如果a[i]>a[j]为真,那么b[i]>b[j]为假,这意味着b[j]>b[i]为真。这意味着当a[i]>a[j]为真时,b[j]>b[i]为真,它也意味着相反 - 当a[j]>a[i]为真时,b[i]>a[j]也是如此。

另一种说法是 ( (a[i]>a[j]) && (b[j]>a[i]) ) || ( (a[j]>a[i]) && (b[i]>b[j]) .只有在( (a[i] > a[j]) ) != (b[i] > b[j])为真的相同情况下,布尔逻辑才是正确的。

再举一个例子,考虑何时a[i] > a[j]b[i] > a[j]。在这种情况下,您将看到您发布的第一个术语为 false,因为!=两侧的两个术语的计算结果为 true,这意味着!=的计算结果为 false 。这种情况还会导致第二个语句解析为 false,因为||评估为 true 的两个项中的任何一个都没有,它们都计算为 false。

最后,这个问题对我来说看起来像家庭作业 - 如果是,你应该使用适当的标签。

然而,这一切都忽略了a[i] == a[j]b[i] == b[j]的可能性,这个问题的另一个答案表明这可能导致两个陈述不计算同一件事。但是,如果您假设两者不能相等,那么按照上面演示的逻辑,您的问题中的两个陈述将是相同的。

如果您假设您发布的代码是正确的

!(p > q) == (p < q)

这意味着出于某种原因,你忽略了平等。

考虑到这一点,让我们说:

a1 = a[i]
a2 = a[j]
b1 = b[i]
b2 = b[j]

然后你有:

ans += ((a1 > a2) && (b2 > b1)) || ((a2 > a1) && (b1 > b2));

由于我们忽略了平等,因此与:

ans += ((a1 > a2) && !(b1 > b2)) || (!(a1 > a2) && (b1 > b2));

如果你仔细观察,你会发现表达式是重复的,所以可以简化它们:

A = a1 > a2
B = b1 > b2

然后:

ans += (A && !B) || (!A && B);

这意味着 A 或 B,但不能两者兼而有之这是一个已知的布尔运算,称为 XOR,在您的情况下,它与不同的 (!=)

相同

因此:

ans += A != B;

并扩展:

ans += (a1 > a2) != (b1 > b2)

所以:

ans += (a[i] > a[j]) != (b[i] > b[j])

希望现在清楚了。

这些表达式不等效。

例如,当 a[i] == a[j]b[i] > b[j] 时,第一个表达式给出...

(a[i] > a[j]) != (b[i] > b[j]);
false != true
true

。而第二个给出:

((a[i] > a[j]) && (b[j] > b[i])) || ((a[j] > a[i]) && (b[i] > b[j]));
(false && false) || (false && true)
false || false
false

让我们拿这个:

((a[i] > a[j]) && (b[j] > b[i])) || ((a[j] > a[i]) && (b[i] > b[j]))

为简单起见,可以这样称呼它:

(w > x) && (y > z) || (x > w) && (z > y)

这在逻辑上不等同于:

(w > x) && (y > z) || !(w > x) && !(y > z)

因为它们可能是相等的,但它是:

(w > x) && (y > z) || !(w >= x) && !(y >= z)

因此,您可以将其简化为(w > x) == (y > z)(w > x) != (z >= y)