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 !?


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 ]


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.


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.


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 |
_______________________________________________________

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.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.