Использование закона Де Моргана для написания выражений на С

Мне трудно понять закон де Моргана и его отношение к булевой логике и выражениям. Специально переписывать эквивалентные выражения, используя логическую логику и &&, ||, и! операторы.

Итак, я знаю, что в программировании на Си закон Де Моргана - это способ переопределить выражение по-разному (используя NOT, OR и AND), пока оно остается эквивалентным.

Такие как:

!(condition1 && condition2)

Также равняется:

!condition1 || !condition two

А также:

condition1 && !(condition2)

Также равняется:

condition1 || !condition2 

(мы просто умножаем скобки на оператор унарного отрицания НЕ здесь? Как в хорошие дни алгебры оле?)

Мой мозг начинает жариться, когда я оцениваю немного более хитрое выражение и как переписать его с помощью логической логики. Я искал любые прошлые темы, с некоторой помощью, но все еще не могу обернуть мою голову вокруг этого. Я начал писать таблицы истинности, но не мог понять, как создать таблицу, основанную на выражении, подобном приведенному ниже. Я стараюсь изо всех сил, поэтому, пожалуйста, извините за любые ошибки или плохую практику.

(ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ, НИЖЕ КОД НЕ ТЕХНИЧЕСКИ ПОЛНЫЙ КОД С, ПРОСТО ПРИМЕР ВЫРАЖЕНИЯ, КОТОРЫЙ Я ПЫТАЮСЯ НАПИСАТЬ С ИСПОЛЬЗОВАНИЕМ БУЛЕВСКОЙ ЛОГИКИ, ДЛЯ ВКЛЮЧЕНИЯ В КОД С)

Я не могу включить это ни в одну из моих программ на C, потому что я просто не могу получить это.

например:

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

по сути, утверждает (правда, прежде чем НЕ):

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 )

и напишите (попробуйте) эквивалент, используя закон де Моргана: так что...

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

ЭКВИВАЛЕНТНО

a < 12 || b < 3 

(есть ли способ сравнить их в таблице истинности, чтобы увидеть, действительно ли они эквивалентны?)

Еще один, на этот раз немного сложнее...

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

ЭКВИВАЛЕНТНО:

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

наконец

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

ЭКВИВАЛЕНТНО:

a > 9 && b > 3

Я не уверен, что кто-то из них прав, но я решил, что лучше всего перестать читать об этом и просто попробовать.

2 ответа

Решение

Кажется, вы смотрите на условные части и продуманные вещи.

Давайте посмотрим на правила:

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 )

Это соответствует первой версии правила. Покидая > а также >= как они есть, вы можете распределить НЕ с обеих сторон и получить это:

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

Я думаю, что вас смутило то, что вы пытались изменить условия и одновременно применять законы Деморгана. Не делай этого. Выполните каждую часть отдельно по мере необходимости.

Это было давно, но то, как я всегда это помню, дает общее выражение:

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
Другие вопросы по тегам