¿Existe una palabra clave u operador para "nor"?

56

¿Hay un operador equivalente a nor ? Por ejemplo, mi color favorito no es verde ni azul.

Y el código sería equivalente a:

// example one
if (color!="green" && color!="blue") { 

}

// example two
if (x nor y) {
    // x is false and y is false
}
1,21 gigavatios
fuente
12
No, porque ya tenemos ory !porque rara vez se usan dobles negativos, la mayoría de las personas los encuentran especialmente difíciles de leer.
Kilian Foth
70
@KilianFoth tiene razón. Sin embargo, los votos negativos deberían ser para malas preguntas, no para preguntas que no nos gustan. Además, ya hay tres votos para cerrar la pregunta porque estaría "basada en una opinión", a pesar de que la pregunta es totalmente neutral y no controvertida (o existen operadores en algún idioma exótico o no).
Christophe
3
¿Existe un nombre para eso? Sí ¿Es un operador? ¿En que idioma? Y dado un idioma, puede buscarlo en las especificaciones / documentos.
jonrsharpe
99
@Troyer Su comentario demuestra el problema: se equivocó de lógica. ;) Eso no es equivalente a un nor.
jpmc26
3
En idiomas con más operadores, esto sería (por ejemplo, en python)color not in ['green', 'blue']
Izkata

Respuestas:

71

Aunque los idiomas principales no tienen operadores NOR y NAND dedicados, algunos idiomas menos conocidos (por ejemplo, algunos idiomas de "golf") sí. Por ejemplo, APL tiene y para NOR y NAND, respectivamente.

Se puede encontrar otra clase de ejemplos en lenguajes de diseño de hardware como VHDL , Verilog , etc. Las compuertas NAND y NOR son bastante útiles en el diseño de hardware debido a que generalmente son más baratas (requieren menos transistores) que el circuito equivalente hecho de AND / OR / NOT puertas, que es una de las razones por las que los lenguajes de diseño de hardware tienden a incluirlos; Otra razón es que pueden ser útiles para ciertos trucos de juguete.

tipo nómada
fuente
40
APL no es un lenguaje de golf , sino más bien un lenguaje orientado a matrices que permite el desarrollo interactivo de aplicaciones multi-paradigma full-stack con fuerza industrial.
Adám
59
@ Adám: Bingo .
Eric Duminil
66
@EricDuminil :-) Sin embargo, todo es cierto.
Adám
20
@EricDuminil No, de verdad. APL no es un lenguaje de golf, es un lenguaje práctico que resulta bueno para jugar golf. Perl es similar en este sentido, ¿no?
Pavel
13
OP en realidad no dijo que APL era un lenguaje de "golf", por cierto.
Will Crawford
45

No, no hay noroperador en ningún lenguaje de programación convencional de alto nivel.

Por qué ?

Principalmente porque es difícil de leer:

  • requiere la combinación mental de varios operadores (" y no ", o en un estilo más literario: " más negativo ", " cada falso " )
  • implica un implícito noten el primer operando, pero el lector solo entiende esto después
  • es diferente de los lenguajes humanos, que usan una negación explícita en el primer operando, como " ni x ni y ", " ni x ni y ". Entonces un lector podría confundir (x nor y)con en (x and not y)lugar de((not x) and (not y))
  • algunos lectores están confundidos con la aparente orsemántica que no aplica

Pero es tan común en el hardware ...

nores una puerta de hardware elemental que se puede usar para hacer todas las otras puertas lógicas. Entonces, uno podría argumentar que todos los demás operadores lógicos son combinaciones y nores el operador lógico elemental más simple.

Sin embargo, lo que es cierto para el hardware no es necesariamente cierto para los humanos. Y a pesar de su popularidad a nivel de hardware, algunas CPU convencionales ni siquiera ofrecen un NORconjunto de instrucciones en su ensamblador (por ejemplo, x86 ).

Alternativas

La legibilidad importa. Y a veces se puede mejorar por otros medios.

Uso de operadores existentes.

Por ejemplo:

if x not in [1,2]    // use of 'in' or 'not in' operator instead of x!=1 and x!=2

Ordenamiento de condiciones

if x==1 or x==2 
     action A
else 
     action B  

en lugar de

if x!=1 and x!=2 
    action B
else 
    action A

Uso de hasta bucle

Algunos idiomas también ofrecen instrucciones de bucle que permiten expresar condiciones con whileo con until, lo que le permite elegir la forma más "positiva". Estas instrucciones son, por ejemplo, until c do ...en rubí , do until c ...en vb o repeat ... until cen pascal y sus descendientes.

Por ejemplo:

Until (x==1 or x==2) do
     ...

es equivalente a:

While (x!=1 and x!=2)
    ...

Hacer una función

Ahora, si aún prefiere la norsintaxis, puede definir una función, pero solo si no espera que ocurra un acceso directo:

If ( nor(x,y) )   // attention, x and y will always be evaluated
    ...  

Hay una ventaja de legibilidad de la función sobre el operador, porque el lector comprende de inmediato que la negación se aplica a todos los argumentos. En algunos idiomas, puede definir una función con un número variable de argumentos.

Christophe
fuente
55
Es curioso, normalmente escribo eso while (not (x == 1 or x == 2))porque encuentro que la x != 1 and x != 2versión es difícil de leer y encuentro que "x no es ni 1 ni 2" mucho más fácil de procesar que "x no es 1 y x no es 2".
Mael
1
@Baldrickk puedes elaborar?
HopefulHelpful
44
@HopefullyHelpful Repeat... Untilsiempre ejecuta el cuerpo del bucle al menos una vez. Si x es 1, el cuerpo del bucle todavía se ejecuta, pero no se repite. El Whilebucle no ejecutará el cuerpo en este caso.
sina
2
@Baldrickk sí, tienes toda la razón. Cuando escribo equivalente, solo hablaba de la condición del bucle, ya que los operadores booleanos eran el tema de la pregunta. Gracias, lo reformularé para aclararlo
Christophe
3
Si x e y nor(x,y)siempre se evalúan depende del idioma y de cómo nor()se implementa. Hay lenguajes (D, Io, ...) donde la función llamada puede decidir si y cuándo evaluar argumentos.
BlackJack
18

El comentario de @ KilianFoth sobre la pregunta es acertado.

Puede sintetizar nordesde noty or:

if (x nor y)

es exactamente lo mismo que

if (not (x or y))

La presentación norcomo un operador separado introduciría redundancias en el lenguaje, que no son necesarias ni deseadas (o que no son necesarias ni deseadas).

Del mismo modo, no tengo conocimiento de ningún idioma que tiene un nandoperador - probablemente debido a que puede ser sintetizado a partir noty andoperadores.

Podría, en teoría, crear un lenguaje con operadores únicos nando únicos nor. Todos and, ory notluego por podría synthesied de ellos. El único problema es que esto sería ridículamente difícil de manejar. Para ver ejemplos, vea la lógica NOR y la lógica NAND en Wikipedia.

Mael
fuente
44
Las redundancias también podrían no ser necesarias o deseadas :)
Dave
@Dave Ese juego de palabras fue intencional, me alegro de que te hayas dado cuenta ;-)
Mael
55
Las redundancias por sí solas realmente no explican por qué norno están incluidas. De lo contrario, ¿por qué los idiomas tienen andy or? Son redundantes, gracias a De Morgan. De hecho, se podría sustituir los tres operadores lógicos convencionales ( and, or, not), proporcionando simplemente nor , como se ha observado con razón.
Konrad Rudolph
1
@KonradRudolph Técnicamente, todo lo que necesita es un operador lambda . La razón por la que hacemos más es hacer coincidir el modelo mental que tienen la mayoría de los programadores. La mayoría de los programadores piensan en la lógica en términos de and, ory notporque eso es lo que usan la mayoría de los lenguajes humanos. Una vez que coincida con el modelo mental de y / o / no, entonces ni & nand se vuelven redundantes. Su redundancia incluso está codificada en sus nombres: "n (ot) y" y "n (ot) o". Si tuviéramos términos en inglés distintos y preexistentes para ellos, y no solo los sintetizados, entonces probablemente los verías con más frecuencia.
RM
1
Re redundancia como argumento: Hay lenguas con más de not, and, or. Por ejemplo, algunos dialectos BÁSICOS (GW-BASIC, QuickBASIC, ...) tienen implicación exclusiva o XOR, IMP (→ NO (x XOR y)) y equivalencia EQV (→ NO (x) O y) como operadores adicionales.
BlackJack
11

Sí, APL y algunos de sus dialectos tienen nor (y nand ). En APL, ni se denota (ya que es o y ~es no ):

 resultExampleOne color
  :If (color'green')⍱(color'blue')
      result'warm'
  :Else
      result'cold'
  :EndIf


 resultExampleTwo(x y)
  :If xy
      result'x is false and y is false'
  :Else
      result'at least one of them is true'
  :EndIf

Pruébalo en línea!

Adán
fuente
10

Esta respuesta es del lenguaje ensamblador para una computadora hecha a mediados de la década de 1960. Eso es bastante oscuro, pero en algunos aspectos aborda su pregunta.

DEC (Digital Equipment Corporation) lanzó la computadora PDP-6 a mediados de la década de 1960. Esta máquina tenía un total de 64 instrucciones que eran operaciones booleanas en dos operandos (incluidos algunos casos degenerados). Estas 64 instrucciones fueron realmente 16 operadores con 4 variantes en cada operador.

Dos de los operadores, ANDCB y ORCB implementaron NOR y NAND respectivamente (a menos que esté confundido con la lógica negativa doble). Puedes ver la tabla de códigos de operación . La tabla de código de operación es en realidad para la computadora PDP-10, una sucesora de la PDP-6.

Si nos fijamos en la instrucción numérica en binario, se vuelve más interesante. Resulta que para todos los códigos de operación en el rango 400-477 (octal), cuatro bits en la instrucción proporcionan una tabla de verdad de cuatro bits para 16 operadores booleanos posibles. Algunos de estos operadores ignoran una o ambas entradas. Por ejemplo, SETZ y SETO ignoran ambas entradas.

Los diseñadores del PDP-6 explotaron este hecho para implementar todas estas instrucciones con menos lógica de la que hubiera requerido implementar solo algunas de ellas. Algunas de estas instrucciones aparecían raramente, si es que alguna vez, en código de lenguaje ensamblador. Pero estaban todos allí.

Entonces ANDCB es el equivalente de NOR. (de nuevo, a menos que tenga mi lógica al revés, en cuyo caso ORCB es el equivalente).

Walter Mitty
fuente
3

Perl tiene la unlesspalabra clave que le permite invertir condicionales:

unless ($color eq 'green' or $color eq 'blue') {
    # code
}

Si bien no es operador NOR, puede expresar su intención de manera similar.

Rory Hunter
fuente
3

El noroperador, como lo describió, no sería repetible, lo que seguramente generará muchos errores difíciles de detectar.

Su "Ejemplo 2" es esencialmente esto:

if (false nor false) {
becomes
if (true) {

Pero intente nuevamente con tres variables y vea qué sucede:

if (false nor false nor false) {
becomes
if ((false nor false) nor false) {
becomes
if (true nor false) {
becomes
if (false) {
Buh Buh
fuente