Логика: есть (A &&! (B || C)) || (B || C) так же, как (A || B || C)? - PullRequest
10 голосов
/ 21 января 2011

Я столкнулся с некоторым кодом obj-c, и мне интересно, есть ли способ его упростить:

#if ( A && !(B || C)) || ( B || C )

это то же самое, что и?

#if ( A || B || C )

Еслинет, есть ли другой способ сформулировать его, который будет легче читать?

[править] Я попробовал таблицу истинности, прежде чем задавать вопрос, но подумал, что что-то упустил, потому что сомневался в том, что Foundation.framework/Foundation.h будет использовать эту более сложную форму.Есть ли для этого веская причина?

Вот оригинальный код (из Foundation.h):

#if (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE)) || (TARGET_OS_EMBEDDED || TARGET_OS_IPHONE)

Ответы [ 7 ]

13 голосов
/ 22 января 2011

Да.Как и другие говорили, вы можете правдиво изложить это.Правила Де Моргана также могут помочь.

Однако я думаю, что лучший вариант - использовать Карта Карно .Обучение занимает несколько минут, но Карты Карно позволяют вам постоянно находить самое минимальное выражение для логической логики.Таблицы истинности могут проверить минимизацию, но не могут дать ее вам.

Вот как я ее получил:

Во-первых, макет таблицы:

         AB
     00   01   11   10
  0|    |    |    |    |
C 1|    |    |    |    |

Теперь, учитывая ваше уравнение, B ||C всегда будет вызывать истину:

         AB
     00   01   11   10
  0|    |  T |  T |    |
C 1|  T |  T |  T |  T |

Это оставляет только два случая.В любом случае правая сторона оценивается как ложная.Для 000 левая сторона также оценивается как false (0 &&! (Что угодно) - false).Для 100 1 &&! (0 ||| 0) оценивается как true.Таким образом, утверждение верно.Заполнение:

         AB
     00   01   11   10
  0|  F |  T |  T |  T |
C 1|  T |  T |  T |  T |

Теперь нам нужно только «покрыть» все истины.«С» покроет нижний ряд.«B» покроет средний квадрат (из четырех значений).Таким образом, «B || C» охватывает все, кроме верхнего правого квадрата.Теперь «А» закроет правый квадрат с четырьмя пробелами.Это нормально, что это избыточно.Таким образом, «A || B || C» покрывает все истинные квадраты и пропускает единственный ложный.

8 голосов
/ 22 января 2011
A | B | C | (B || C) | (!(B || C)) | (A && !(B || C)) | (A && (!(B || C)) || (B || C) | (A || B || C)
------------------------------------------------------------------------------------------------------
T | T | T |     T    |       F     |         F        |                 T             |         T      
T | T | F |     T    |       F     |         F        |                 T             |         T 
T | F | T |     T    |       F     |         F        |                 T             |         T 
T | F | F |     F    |       T     |         T        |                 T             |         T 
F | T | T |     T    |       F     |         F        |                 T             |         T 
F | T | F |     T    |       F     |         F        |                 T             |         T 
F | F | T |     T    |       F     |         F        |                 T             |         T 
F | F | F |     F    |       T     |         F        |                 F             |         F 

Исходя из последних двух столбцов, я бы сказал, да.

7 голосов
/ 22 января 2011

Они одинаковы.Вы можете использовать Truth Table Generator для проверки.Оба эти выражения дают false только в одном случае, когда A, B и C равны false.

7 голосов
/ 21 января 2011

Получить ручку + бумагу + попробуйте, есть только 8 возможных вводов

2 голосов
/ 22 января 2011

Да, это то же самое.Используя правила де Моргана:

(A &&! (B || C)) ||(B || C) = (A &&! B &&! C) ||(B || C).Таким образом, вторая будет верна, когда A = 1 и B, C = 0. Если это не так, вторая часть (B || C) будет верна, когда B ||C. Так что он равен первому.

1 голос
/ 12 декабря 2011

Вы также можете сказать:

(A &&! (B || C)) ||(B || C) переписывает в (A &&! W) ||W (1)

(1) перезаписывает (A &&! W) ||(A!(A || W) ||(! A || W) (3)

(3) переписывает (A &&! W) ||! (A &&! W) ||(A || W) (4)

(4) приводит к A ||W и затем A ||B ||C

0 голосов
/ 22 января 2011

Да, два выражения эквивалентны.(Я только что написал пару функций для проверки всех восьми возможностей.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...