¿Hay una palabra clave u operador para "ni"?

56

¿Hay un operador equivalente de ni ? Por ejemplo, mi color favorito no es ni 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
}
    
pregunta 1.21 gigawatts 06.02.2018 - 08:51

7 respuestas

72

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

Otra clase de ejemplos se puede encontrar en lenguajes de diseño de hardware como VHDL , Verilog , etc. Las compuertas NAND y NOR son muy ú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 / NO 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 manipulación de bits.

    
respondido por el nomadictype 06.02.2018 - 10:49
46

No, no hay un operador nor en ningún lenguaje de programación 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 uno falso " )
  • implica un not implícito en 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 ". Por lo tanto, un lector puede confundir (x nor y) con (x and not y) en lugar de ((not x) and (not y))
  • algunos lectores se confunden con el aparente or semantic que no se aplica

Pero es tan común en hardware ...

nor es una puerta de hardware elemental que puede usarse para hacer todas las demás puertas lógicas. Por lo tanto, se podría argumentar que todos los otros operadores lógicos son combinaciones y nor es 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 NOR en su conjunto de instrucciones de 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

Orden 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 loop

Algunos idiomas también ofrecen instrucciones de bucle que permiten expresar condiciones con while o con until , permitiéndole elegir la forma más "positiva". Estas instrucciones son, por ejemplo, until c do ... en ruby , do until c ... en vb , o repeat ... until c en pascal y sus descendientes.

Por ejemplo:

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

es equivalente a:

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

Haz una función

Ahora, si aún prefiere la sintaxis nor , podría definir una función, pero solo si no espera que ocurra un atajo:

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 entiende inmediatamente 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.

    
respondido por el Christophe 06.02.2018 - 09:47
18

El comentario de @ KilianFoth sobre la pregunta es acertado.

Puedes sintetizar nor a partir de not y or :

if (x nor y)

es exactamente igual que

if (not (x or y))

La introducción de nor como un operador independiente introduciría redundancias en el idioma, que no son necesarias ni deseadas (o que no son necesarias ni deseadas).

De manera similar, no conozco ningún idioma que tenga un operador nand , probablemente porque se puede sintetizar a partir de los operadores not y and .

Podrías, en teoría, crear un idioma con solo nand o solo nor operadores. Todos los and , or y not podrían luego sintetizarse a partir de ellos. El único problema es que esto sería ridículamente difícil de manejar. Para ver ejemplos, vea Lógica NOR y Lógica NAND en Wikipedia.

    
respondido por el Mael 06.02.2018 - 10:11
11

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

∇ result←ExampleOne color
  :If (color≡'green')⍱(color≡'blue')
      result←'warm'
  :Else
      result←'cold'
  :EndIf
∇

∇ result←ExampleTwo(x y)
  :If x⍱y
      result←'x is false and y is false'
  :Else
      result←'at least one of them is true'
  :EndIf
∇

Trate en línea!

    
respondido por el Adám 06.02.2018 - 13:29
10

Esta respuesta es del lenguaje ensamblador para una computadora hecha a mediados de los años sesenta. Eso es bastante oscuro, pero en algunos aspectos aborda tu pregunta.

DEC (Digital Equipment Corporation) lanzó la computadora PDP-6 a mediados de los años sesenta. Esta máquina tenía un total de 64 instrucciones que eran operaciones booleanas en dos operandos (incluidos algunos casos degenerados). Estas 64 instrucciones eran 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 doble negativa). Puede ver la tabla de códigos de operación . La tabla de códigos de operación es en realidad para la computadora PDP-10, una sucesora del 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 propia instrucción proporcionan una tabla de verdad de cuatro bits para 16 posibles operadores booleanos. 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 tomado implementar solo algunas de ellas. Algunas de estas instrucciones aparecían raramente, si acaso, en el código de lenguaje ensamblador. Pero todos estaban allí.

Entonces ANDCB es el equivalente de NOR. (de nuevo, a menos que haya recuperado mi lógica, en cuyo caso ORCB es el equivalente).

    
respondido por el Walter Mitty 06.02.2018 - 15:39
3

Perl tiene la palabra clave unless que te permite invertir condicionales:

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

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

    
respondido por el Rory Hunter 06.02.2018 - 21:51
2

El operador nor tal como lo describiste no sería repetible, lo que puede llevar a muchos errores difíciles de detectar.

Su "Ejemplo 2" es esencialmente esto:

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

Pero intente eso de nuevo 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) {
    
respondido por el Buh Buh 07.02.2018 - 17:21

Lea otras preguntas en las etiquetas