Использование закона Де Моргана для написания выражений на С
Мне трудно понять закон де Моргана и его отношение к булевой логике и выражениям. Специально переписывать эквивалентные выражения, используя логическую логику и &&, ||, и! операторы.
Итак, я знаю, что в программировании на Си закон Де Моргана - это способ переопределить выражение по-разному (используя 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