2011-01-21 17 views
10

que he encontrado algo de código obj-c y me pregunto si hay una manera de simplificarlo:Lógica: is (A &&! (B || C)) || (B || C) lo mismo que (A || B || C)?

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

es esto lo mismo que?

#if (A || B || C) 

Si no, ¿hay alguna otra manera de formularlo que sea más fácil de leer?

[editar] Probé la tabla de verdad antes de hacer la pregunta, pero pensé que me faltaba algo porque dudaba de que Foundation.framework/Foundation.h empleara esta forma más compleja. ¿Hay una buena razón para eso?

Aquí está el código original (de Foundation.h):

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

¿por qué no simplemente implementar una pequeña tabla de verdad con los resultados y probarla usted mismo? Solo hay 8 entradas diferentes | A = verdadero, B = verdadero, C = verdadero | A = verdadero, B = verdadero. C = falso | y así sucesivamente y así sucesivamente. Compara las tablas de verdad. Si las salidas son iguales, entonces tu lógica es equivalente. – AndyPerfect

+3

Sus paréntesis en el encabezado de la pregunta son ligeramente diferentes que en la pregunta en sí. Si el encabezado es correcto, la sección "! (B || C) || (B || C)" se puede reemplazar por "verdadero", dejándolo con "A && true", que es equivalente a solo A. Por otro lado, parece que la versión de la pregunta no tiene un par de paréntesis, de lo contrario, tiene un error de sintaxis. Más allá de eso, estoy de acuerdo con los otros carteles, crear las tablas de verdad. – cobaltduck

+0

@Peter Perháč - ¡gracias por la edición! – jpwco

Respuesta

12

Sí. Como otros dijeron, puedes ponerlo en la mesa de verdad. Las reglas de De Morgan también pueden ayudar.

Sin embargo, creo que la mejor opción es usar un Karnaugh Map. Se necesitan unos minutos para aprender, pero los mapas de Karnaugh le permiten encontrar constantemente la expresión más mínima para la lógica booleana. Las tablas de verdad pueden verificar una minimización, pero no pueden dársela.

Así es como lo tengo:

primer lugar, el diseño de la mesa:

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

Ahora, teniendo en cuenta la ecuación, B || C siempre causará una verdad:

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

Esto deja solo dos casos. En cualquier caso, el lado derecho se evalúa como falso. Para 000, el lado izquierdo también evalúa como falso (0 & &! (Lo que sea) es falso). Para 100, 1 & &! (0 ||| 0) se evalúa como verdadero. Por lo tanto, la declaración es verdadera. Rellenar:

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

Ahora, solo tenemos que "cubrir" todas las verdades. "C" cubrirá la fila inferior. "B" cubrirá el cuadrado del medio (de cuatro valores). Por lo tanto, "B || C" cubre todos menos el recuadro superior derecho. Ahora, "A" cubrirá el cuadrado derecho de cuatro espacios.Está bien que esto sea redundante. Por lo tanto, "A || B || C" cubre todos los cuadrados verdaderos y omite el único falso.

+0

esta es una respuesta excelente. +1 para el "Mapa de Karnaugh". – jpwco

+1

Esta es una mejor respuesta que la pregunta merecida, y educativa para arrancar. – jpwco

7

Get pen + papel + probarlo, sólo hay 8 entradas posibles

+0

Naturalmente, lo intenté primero. Considero que la fuente del código está por encima de esta formulación aparentemente oscura: Foundation.h de OSX. Por lo tanto, dudaba de mis garabatos. Pero sí, +1 para su excelente primer instinto. – jpwco

+0

Soy un físico experimental: dada la opción de hacer matemáticas o hacer mediciones, me voy por la tonta solución –

+2

Yo también, pero cuál es tonto y cuál no depende del experimento. ;) – John

2

Sí, es el mismo. Utilizando las reglas de De Morgan:

(A & &! (B || C)) || (B || C) = (A & &! B & &! C) || (B || C). Entonces el segundo será verdadero cuando A = 1 y B, C = 0. Si ese no es el caso, la segunda parte (B || C) será verdadera cuando B || C. Entonces es igual al primero.

0

Sí, las dos expresiones son equivalentes. (Solo escribí un par de funciones para probar las ocho posibilidades).

7
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 

Basado en las dos últimas columnas, diría que sí.

+0

Algo debe estar mal con esta tabla. Por favor, verifíquelo nuevamente. – detunized

+0

@detunized, sí, hice las últimas dos en lugar de || 'ed. Son iguales – SwDevMan81

7

Son lo mismo. Puede usar Truth Table Generator para probarlo. Ambas expresiones dan false solo en un caso, cuando A, B y C son false.

+1

que es un enlace inteligente. Lo compartiré con mis amigos de matemáticas y docentes. +1 – jpwco

1

También se podría decir:

(! Un & & (B || C)) || (B || C) reescribe a (A & &! W) || W (1)

(1) reescribe a (A & &! W) || (A ||! A || W) (2)

(2) reescrituras (A & &! W) || (A || W) || (! A || W) (3)

(3) reescribe (A & &! W) || ! (A & &! W) || (A || W) (4)

(4) lleva a A || W y luego A || B || C

+0

También podría decir 'A^(B || C)' no? – Jay

Cuestiones relacionadas