如何减少逻辑表达式?

时间:2012-06-15 22:47:19

标签: c++ logic boolean-logic

{
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])

是否有任何关于这种逻辑表达式简化的指南或书籍?

4 个答案:

答案 0 :(得分:1)

这实际上很简单。

使用(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]的时间。在这种情况下,您会看到您发布的第一个是假的,因为!=两侧的两个术语都评估为true,这意味着!=评估为false。这种情况也会导致第二个语句解析为false,因为||周围的两个术语中没有一个评估为true,它们都评估为false。

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

然而,这一切都忽略了a[i] == a[j]b[i] == b[j]的可能性,这个问题的另一个答案可能导致两个陈述不能评估相同的事情。但如果你认为两者不能相等,那么你的问题中的两个陈述将是相同的,遵循上面说明的逻辑。

答案 1 :(得分:0)

这些表达方式不相同。

例如,当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

答案 2 :(得分:0)

如果您认为

,您发布的代码是正确的
!(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])

希望现在很清楚。

答案 3 :(得分:0)

我们来看看:

((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)