Son || y! operadores suficientes para hacer todas las expresiones lógicas posibles?

294

La expresión lógica ( a && b ) (ambos ay btienen valores booleanos) puede escribirse como !(!a || !b), por ejemplo. ¿No significa esto que &&es "innecesario"? ¿Significa esto que todas las expresiones lógicas se pueden hacer solo con ||y !?

JakeTheSnake
fuente
83
Esta es más una pregunta lógica simbólica básica que un problema de Java, pero sí. O y NO en combinación se pueden usar para construir todo lo demás. Lo mismo con AND y NOT. Por ejemplo, cuando estaba en la escuela nos enseñaron a construir todo usando solo puertas NAND porque tomaban menos transistores.
azurefrog
79
No confunda la capacidad de escribir una declaración de esta manera con la conveniencia de hacerlo. El azúcar sintáctico es algo bueno .
azurefrog
20
Muchos chips de compuerta lógica solo proporcionan compuertas NAND o NOR, ya que es posible implementar todas las operaciones con ellos y los hace baratos de producir A and B == !A nor !B == !(!A or !B). Del mismo modo A or B == !A nand !B == !(!A and !B). Obviamente, pasar el mismo valor a ambas entradas de un NAND o NOR dará el mismo resultado que un simple NOT. XOR y XNOR también son posibles pero más complejos. Ver el teorema de De Morgan
Básico
16
¿No es una pregunta de informática? No veo ningún código aquí. En particular, si esto es cierto en la práctica variará según la aplicación, por ejemplo, en C ++ con la operación de sobrecarga es no en general.
Carreras de ligereza en órbita
66
@SnakeDoc No creo que nadie aquí esté abogando por hacer tal cosa. Creo que esta pregunta era más una cuestión de lógica teórica, que una de programación, realmente.
ryuu9187

Respuestas:

425

Sí, como señalaron las otras respuestas, el conjunto de operadores que comprende ||y !está funcionalmente completo . Aquí hay una prueba constructiva de eso, que muestra cómo usarlos para expresar las dieciséis posibles conexiones lógicas entre las variables booleanas Ay B:

Tenga en cuenta que tanto NAND como NOR son por sí mismos funcionalmente completos (lo que se puede probar usando el mismo método anterior), por lo que si desea verificar que un conjunto de operadores esté funcionalmente completo, es suficiente para demostrar que puede expresar NAND o NOR con eso.

Aquí hay un gráfico que muestra los diagramas de Venn para cada uno de los conectores enumerados anteriormente:

ingrese la descripción de la imagen aquí

[ fuente ]

Peter Olson
fuente
20
Es difícil saber si la pregunta tiene la intención de esto, pero esta respuesta no aborda el comportamiento de cortocircuito (relevante, ya que la pregunta se refiere a ||más que a |) o los efectos secundarios (relevante porque la expansión de verdadero, falso, XOR y XNOR evalúan sus argumentos más veces que la constante u operador original)
David Richerby
55
Los círculos que contienen círculos y las transiciones forman un diagrama de Hasse ( en.wikipedia.org/wiki/Hasse_diagram ). (¡Sí, aprendí algo nuevo hoy!)
Kasper van den Berg
55
@DavidRicherby Eso es cierto. Aparte de XOR, XNOR, verdadero y falso, por lo que puedo decir, los efectos secundarios y el número de evaluaciones deben ser los mismos que los equivalentes incorporados (por ejemplo, !(!A || !B)tiene el mismo recuento de cortocircuitos y evaluación A && B). No creo que pueda hacer esto para XOR y XNOR sin construcciones adicionales (por ejemplo a ? !b : b), y verdadero o falso no es un problema si puede guardar valores, ya que podría iniciar su programa definiendo truey falseusando alguna variable booleana ficticia.
Peter Olson
Es interesante notar que la lista anterior comprende 16 operaciones. Esto es consistente con el hecho de que hay 16 posibles tablas de verdad para el caso en el que tiene 2 entradas y 1 salida.
Paul R
1
Solo quería agregar otra visualización como tabla para referencia de las personas. Misma fuente que la anterior.
ago
125

Lo que estás describiendo es integridad funcional .

Esto describe un conjunto de operadores lógicos que es suficiente para "expresar todas las tablas de verdad posibles". Su conjunto de operadores Java, { ||, !}, es suficiente; corresponde al conjunto {∨, ¬}, que se enumera en la sección "Conjuntos de operadores funcionalmente completos mínimos".

El conjunto de todas las tablas de verdad significa todos los conjuntos posibles de 4 valores booleanos que pueden ser el resultado de una operación entre 2 valores booleanos. Debido a que hay 2 valores posibles para un booleano, hay 2 4 , o 16, posibles tablas de verdad.

A B | 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
----+------------------------------------------------
T T | T  T  T  T  T  T  T  T  F  F  F  F  F  F  F  F
T F | T  T  T  T  F  F  F  F  T  T  T  T  F  F  F  F
F T | T  T  F  F  T  T  F  F  T  T  F  F  T  T  F  F 
F F | T  F  T  F  T  F  T  F  T  F  T  F  T  F  T  F

Aquí hay una tabla de los números de la tabla de verdad (0-15), las combinaciones ||y !que la producen, y una descripción.

Table  |  Operation(s)                    | Description
-------+----------------------------------+-------------
  0    | A || !A                          | TRUE
  1    | A || B                           | OR
  2    | A || !B                          | B IMPLIES A
  3    | A                                | A
  4    | !A || B                          | A IMPLIES B
  5    | B                                | B
  6    | !(!A || !B) || !(A || B)         | XNOR (equals)
  7    | !(!A || !B)                      | AND
  8    | !A || !B                         | NAND
  9    | !(A || !B) || !(!A || B)         | XOR
 10    | !B                               | NOT B
 11    | !(!A || B)                       | NOT A IMPLIES B
 12    | !A                               | NOT A
 13    | !(A || !B)                       | NOT B IMPLIES A
 14    | !(A || B)                        | NOR
 15    | !(A || !A)                       | FALSE

Hay muchos otros conjuntos funcionalmente completos, incluidos los conjuntos de un elemento {NAND} y {NOR}, que no tienen operadores individuales correspondientes en Java.

rgettman
fuente
44
+1 para la edición. A pesar de la diferencia en el recuento de votos, creo que su respuesta es en realidad más detallada que la mía ahora.
Peter Olson
Tablas de la verdad pensé que los había dejado atrás después del primer año en la universidad
Barkermn01
80

Si.

Todas las puertas lógicas pueden estar hechas de puertas NOR.

Dado que una compuerta NOR se puede hacer desde un NOT y un OR, el resultado sigue.

Paul Boddington
fuente
64
@PaulDraper o NAND gates
slebetman
25
Se necesitaron 4100 puertas NOR para aterrizar dos personas en la luna.
Hans Passant
44
@HansPassant Y algunas cuerdas. Un montón de cuerda. (Memoria de cuerda central, no la variedad de lata).
un CVn
3
@HansPassant A veces desearía que Stack Exchange fuera Wikipedia, luego insertaría una [citation-needed]marca allí mismo.
Simon Forsberg
11
Sí, lo siento, la computadora de guía Apollo .
Hans Passant
64

Tómese el tiempo para leer las Leyes de DeMorgan si puede.

Encontrará la respuesta en la lectura allí, así como referencias a las pruebas lógicas.

Pero esencialmente, la respuesta es sí.

EDITAR : Para ser explícito, mi punto es que uno puede inferir lógicamente una expresión OR a partir de una expresión AND, y viceversa. También hay más leyes para la equivalencia lógica y la inferencia, pero creo que esta es la más adecuada.


EDIT 2 : Aquí hay una prueba a través de la tabla de verdad que muestra la equivalencia lógica de la siguiente expresión.

Ley de DeMorgan: !(!A || !B) -> A && B

 _____________________________________________________
El | A | B | ! A | ! B | ! A || ! B | ! (! A ||! B) | A y B |
-------------------------------------------------- -----
El | 0 | 0 | 1 | 1 | 1 | 0 | 0 |
-------------------------------------------------- -----
El | 0 | 1 | 1 | 0 | 1 | 0 | 0 |
-------------------------------------------------- -----
El | 1 | 0 | 0 | 1 | 1 | 0 | 0 |
-------------------------------------------------- -----
El | 1 | 1 | 0 | 0 | 0 | 1 | 1 |
_______________________________________________________
ryuu9187
fuente
19
Algunas personas tienen que rechazar el voto como parte de su "integridad funcional"
Jesse
3
A + 27 / -2, no me preocuparía mucho por un voto a favor perdido.
un CVn
2
@ MichaelKjörling Tengo curiosidad por saber por qué algunas personas pensaron que mi respuesta no fue útil / dañina.
ryuu9187
3
En general, las respuestas que dependen de los enlaces no son del agrado (ya que los enlaces mueren), pero en este caso hay tantas explicaciones alternativas de las Leyes de DeMorgan, que no veo un problema; sin embargo, esa es mi suposición sobre el DV's
usuario2813274
@ user2813274 Gracias por la explicación. Con suerte, mis ediciones ayudarán a cerrar la brecha entre la investigación personal y llegar a la respuesta.
ryuu9187
11

NAND y NOR son universales, se pueden utilizar para construir cualquier operación lógica que desee en cualquier lugar; otros operadores están disponibles en lenguajes de programación para facilitar la escritura y la creación de códigos legibles.

Además, todas las operaciones lógicas que se necesitan para cablearse en el circuito también se desarrollan utilizando circuitos integrados NAND o NOR solamente.

anand
fuente
10

Sí, de acuerdo con el álgebra booleana, cualquier función booleana se puede expresar como una suma de minterms o un producto de maxterms, que se llama forma canónica normal . No hay ninguna razón por la cual esa lógica no pueda aplicarse a los mismos operadores que se usan en informática.

https://en.wikipedia.org/wiki/Canonical_normal_form

Michał Szydłowski
fuente