Existe palavra-chave ou operador para "nor"?

56

Existe um operador equivalente a nem ? Por exemplo, minha cor favorita não é nem verde nem azul.

E o código seria equivalente a:

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

}

// example two
if (x nor y) {
    // x is false and y is false
}
    
por 1.21 gigawatts 06.02.2018 / 08:51
fonte

7 respostas

72

Embora os idiomas tradicionais não tenham operadores NOR e NAND dedicados, algumas linguagens menos conhecidas (por exemplo, algumas linguagens de "golfe") fazem. Por exemplo, APL tem e para NOR e NAND, respectivamente.

Outra classe de exemplos pode ser encontrada em linguagens de design de hardware, como VHDL , Verilog , etc. Os portões NAND e NOR são bastante úteis no projeto de hardware devido a serem geralmente mais baratos (requerendo menos transistores) que o circuito equivalente feito de AND / OR / NOT gates, que é uma das razões pelas quais as linguagens de design de hardware tendem a incluí-las; Outra razão é que eles podem ser úteis para certos truques de bit-fiddling.

    
por 06.02.2018 / 10:49
fonte
46

Não, não há nenhum operador nor em qualquer linguagem de programação mainstream de alto nível.

Por quê?

Principalmente porque é difícil de ler:

  • requer a combinação mental de vários operadores (" e não ", ou em um estilo mais literário: " mais negativo ", " cada falso " )
  • implica um implícito not no primeiro operando, mas o leitor só entende isso depois
  • é diferente das linguagens humanas, que usam uma negação explícita no primeiro operando, como " nem x nem y ", " nem x nem y ". Então, um leitor pode confundir (x nor y) com (x and not y) em vez de ((not x) and (not y))
  • alguns leitores estão confusos com a aparente semântica or que não se aplica

Mas é tão comum em hardware ...

nor é um portão de hardware elementar que pode ser usado para criar todas as outras portas lógicas. Assim, pode-se argumentar que todos os outros operadores lógicos são combinações e nor é o operador lógico elementar mais simples.

No entanto, o que é verdade para o hardware não é necessariamente verdadeiro para os humanos. E apesar de sua popularidade no nível de hardware, algumas CPUs convencionais nem sequer oferecem NOR em seu conjunto de instruções assembler (por exemplo, x86 ).

Alternativas

Questões de legibilidade. E às vezes pode ser melhorado por outros meios.

Uso de operadores existentes

Por exemplo:

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

Ordenação de condições

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

em vez de

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

Uso de loop até

Alguns idiomas também oferecem instruções em loop que permitem expressar condições com while ou until , permitindo que você escolha a maneira mais "positiva". Essas instruções são, por exemplo, until c do ... em ruby , do until c ... em vb , ou repeat ... until c em pascal e seus descendentes.

Por exemplo:

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

é equivalente a:

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

Faça uma função

Agora, se você ainda preferir a sintaxe nor , poderá definir uma função, mas somente se não esperar que um atalho aconteça:

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

Existe uma vantagem de legibilidade da função sobre o operador, porque o leitor compreende imediatamente que a negação se aplica a todos os argumentos. Em alguns idiomas, você pode definir uma função com um número variável de argumentos.

    
por 06.02.2018 / 09:47
fonte
18

@ O comentário de KilianFoth sobre a questão está no local.

Você pode sintetizar nor de not e or :

if (x nor y)

é exatamente o mesmo que

if (not (x or y))

A introdução de nor como um operador separado introduziria redundâncias na linguagem, que não são necessárias nem desejadas (ou - que não são necessárias nem desejadas).

Da mesma forma, não conheço nenhum idioma que possua um operador nand - provavelmente porque ele pode ser sintetizado dos operadores not e and .

Você poderia, em teoria, criar um idioma com apenas nand ou somente nor operadores. Todos os and , or e not poderiam ser sintetizados a partir deles. O único problema é que isso seria ridiculamente desajeitado. Para exemplos, consulte lógica NOR e Lógica NAND na Wikipedia.

    
por 06.02.2018 / 10:11
fonte
11

Sim, APL e alguns de seus dialetos têm nor (e nand > ). Em APL, nem é denotado (pois é ou e ~ não é ):

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

Experimente online!

    
por 06.02.2018 / 13:29
fonte
10

Esta resposta é da linguagem assembler para um computador feito em meados da década de 1960. Isso é bem obscuro, mas em alguns aspectos ele trata da sua pergunta.

A DEC (Digital Equipment Corporation) lançou o computador PDP-6 em meados da década de 1960. Esta máquina tinha um total de 64 instruções que eram operações booleanas em dois operandos (incluindo alguns casos degenerados). Essas 64 instruções eram na verdade 16 operadores com 4 variantes em cada operador.

Dois dos operadores, ANDCB e ORCB implementaram NOR e NAND, respectivamente (a menos que eu esteja misturado na lógica negativa dupla). Você pode ver a tabela de códigos de atividade . A tabela opcode é, na verdade, para o computador PDP-10, um sucessor do PDP-6.

Se você olhar a instrução numérica em binário, fica mais interessante. Acontece que, para todos os opcodes no intervalo 400-477 (octal), quatro bits na própria instrução fornecem uma tabela de verdade de quatro bits para 16 possíveis operadores booleanos. Alguns desses operadores ignoram uma ou ambas as entradas. Por exemplo, SETZ e SETO ignoram ambas as entradas.

Os projetistas do PDP-6 exploraram este fato para implementar todas essas instruções com menos lógica do que seria necessário para implementar apenas algumas delas. Algumas dessas instruções apareciam raramente, ou nunca, no código da linguagem de montagem. Mas eles estavam todos lá.

Então, o ANDCB é o equivalente da NOR. (novamente, a menos que eu tenha a minha lógica para trás, caso em que o ORCB é o equivalente).

    
por 06.02.2018 / 15:39
fonte
3

Perl tem a palavra-chave unless que permite inverter os condicionais:

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

Embora não seja o operador NOR, você pode expressar sua intenção de maneira semelhante.

    
por 06.02.2018 / 21:51
fonte
2

O operador nor , conforme descrito, não seria repetitivo, o que pode levar a muitos erros difíceis de detectar.

Seu "Exemplo 2" é essencialmente isto:

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

Mas tente novamente com três variáveis e veja o que acontece:

if (false nor false nor false) {
becomes
if ((false nor false) nor false) {
becomes
if (true nor false) {
becomes
if (false) {
    
por 07.02.2018 / 17:21
fonte

Tags