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.
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.
@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.
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.
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.
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 simplementenor , 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 ):
∇ 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∇
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).
or
y!
porque rara vez se usan dobles negativos, la mayoría de las personas los encuentran especialmente difíciles de leer.color not in ['green', 'blue']
Respuestas:
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.
fuente
No, no hay
nor
operador en ningún lenguaje de programación convencional de alto nivel.Por qué ?
Principalmente porque es difícil de leer:
not
en el primer operando, pero el lector solo entiende esto después(x nor y)
con en(x and not y)
lugar de((not x) and (not y))
or
semántica que no aplicaPero es tan común en el hardware ...
nor
es 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 ynor
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 un
NOR
conjunto 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:
Ordenamiento de condiciones
en lugar de
Uso de hasta bucle
Algunos idiomas también ofrecen instrucciones de bucle que permiten expresar condiciones con
while
o conuntil
, 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 orepeat ... until c
en pascal y sus descendientes.Por ejemplo:
es equivalente a:
Hacer una función
Ahora, si aún prefiere la
nor
sintaxis, puede definir una función, pero solo si no espera que ocurra un acceso directo: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.
fuente
while (not (x == 1 or x == 2))
porque encuentro que lax != 1 and x != 2
versió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".Repeat
...Until
siempre 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. ElWhile
bucle no ejecutará el cuerpo en este caso.nor(x,y)
siempre se evalúan depende del idioma y de cómonor()
se implementa. Hay lenguajes (D, Io, ...) donde la función llamada puede decidir si y cuándo evaluar argumentos.El comentario de @ KilianFoth sobre la pregunta es acertado.
Puede sintetizar
nor
desdenot
yor
:es exactamente lo mismo que
La presentación
nor
como 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
nand
operador - probablemente debido a que puede ser sintetizado a partirnot
yand
operadores.Podría, en teoría, crear un lenguaje con operadores únicos
nand
o únicosnor
. Todosand
,or
ynot
luego 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.fuente
nor
no están incluidas. De lo contrario, ¿por qué los idiomas tienenand
yor
? Son redundantes, gracias a De Morgan. De hecho, se podría sustituir los tres operadores lógicos convencionales (and
,or
,not
), proporcionando simplementenor
, como se ha observado con razón.and
,or
ynot
porque 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.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.Sí, APL y algunos de sus dialectos tienen nor (y nand ). En APL, ni se denota
⍱
(ya que∨
es o y~
es no ):Pruébalo en línea!
fuente
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).
fuente
Perl tiene la
unless
palabra clave que le permite invertir condicionales:Si bien no es operador NOR, puede expresar su intención de manera similar.
fuente
El
nor
operador, como lo describió, no sería repetible, lo que seguramente generará muchos errores difíciles de detectar.Su "Ejemplo 2" es esencialmente esto:
Pero intente nuevamente con tres variables y vea qué sucede:
fuente