1

我很难理解德摩根定律,以及它与布尔逻辑和表达式的关系。专门重写等效表达式,使用布尔逻辑和 &&、|| 和 ! 运营商。

所以我知道在 C 编程中,De Morgans Law 是一种以不同方式重新陈述表达式(使用 NOT、OR、AND)同时保持等价的方法。

如:

!(condition1 && condition2)

也等于:

!condition1 || !condition two

和:

condition1 && !(condition2)

也等于:

condition1 || !condition2 

(我们只是在这里将括号乘以一元否定 NOT 运算符吗?就像在良好的 ole' 代数时代一样?)

当我评估一个更棘手的表达式以及如何用布尔逻辑重新编写它时,我的大脑开始煎熬。我在一些帮助下搜索了任何过去的线程,但仍然无法解决这个问题。我开始写真值表,但不知道如何根据下面的表达式来制作真值表。我正在尽我所能,所以请原谅任何错误或不良做法。

(请注意,以下代码在技术上不是完整的 C 代码,只是我尝试使用布尔逻辑编写的表达式示例,以合并到 C 代码中。)

我无法将它合并到我的任何 C 程序中,因为我无法得到它。

例如:

!( a > 12 ) && !(b >= 3 )

本质上说(NOT之前的真值形式):

a > 12 && b >= 3

表示 A 大于 12,并且 b 大于或等于 3。

把它带到一个真值表:

a   b   a&&b

1   0   false - a is greater than 12, but b is not greater than or equal to 3.

0   1   false - this time a is less than 12 while b >= 3.

0   0   false - a is not > 12 and b is not >= 3.

1   1   true -  a is greater than 12, and b is >= 3.

现在应用 NOT 运算符:(这是我开始迷路的地方)

!( a > 12 ) && !( b >= 3 )

并使用德摩根定律写(尝试)等价物:所以……</p>

!( a > 12 ) && !( b >= 3 )

相当于

a < 12 || b < 3 

(有没有办法在真值表中交叉比较它们,看看它们是否真的等价?)

另一个,这次有点棘手……

!( a == b ) && !( c != 2 )

相当于:

(a != b) || (c = 2)

最后

!( (a < 9 ) || ( b <=3 ) )

相当于:

a > 9 && b > 3

我不确定这些是否正确,但我认为最好的办法是停止阅读它并继续尝试。

4

2 回答 2

1

已经很久了,但我一直记得它的方式是一般的表达方式:

A op B (where op is and,or) NOTE: A and B could be "sub-expressions"

1) Change or to and, and to or
2) Invert the individual terms
3) Invert the entire expression

A and B => !(!A or !B)

A or B => !(!A and !B)

A 和 B 情况的真值表:

A B | A&B
------------
T T |  T   
T F |  F   
F T |  F   
F F |  F


A B   !A !B   !A|!B   !(!A|!B)
------------------------------
T T    F  F     F         T
T F    F  T     T         F
F T    T  F     T         F
F F    T  T     T         F
于 2019-02-17T04:09:22.623 回答
0

似乎您正在查看条件部分并过度思考事情。

我们来看看规则:

not A AND not B = not (A OR B)
not A OR not B = not (A AND B)

用简单的英语来说,这意味着您可以分配一个 NOT 并反转 AND 和 OR。所以给定这个表达式:

!( a > 12 ) && !(b >= 3 )

这符合规则的第一个版本。保留>and>=原样,您可以从双方分配 NOT 并得到:

!(( a > 12 ) || (b >= 3 ))

AND 获得对 OR 的更改,并且(这是您错过的部分)NOT 被拉出。同样,这个:

!( a == b ) && !( c != 2 )

变成:

!(( a == b ) || ( c != 2 ))

然后是最后一个:

!( (a < 9 ) || ( b <=3 ) )

通过德摩根定律变成这样:

!(a < 9 ) && !(b <=3 )

然后切换条件:

(a >= 9 ) && (b > 3 )

我认为您感到困惑的地方是您试图翻转条件并同时应用德摩根定律。不要那样做。根据需要分别执行每个部分。

于 2019-02-17T04:00:02.097 回答