Esiste una parola chiave o un operatore per "nor"?

56

Esiste un equivalente di operatore ? Ad esempio, il mio colore preferito non è né verde né blu.

E il codice sarebbe equivalente a:

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

}

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

7 risposte

72

Sebbene le lingue tradizionali non abbiano operatori NOR e NAND dedicati, alcune lingue meno conosciute (ad esempio alcune lingue "golf") lo fanno. Ad esempio, APL ha e rispettivamente per NOR e NAND.

Un'altra classe di esempi può essere trovata nei linguaggi di progettazione hardware come VHDL , Verilog , ecc. Le porte NAND e NOR sono abbastanza utili nella progettazione dell'hardware, perché di solito sono più economiche (richiedono meno transistor) rispetto al circuito equivalente realizzato da AND / OR / NOT gates, che è uno dei motivi per cui i linguaggi di progettazione hardware tendono ad includerli; un'altra ragione è che possono essere utili per alcuni trucchetti.

    
risposta data 06.02.2018 - 10:49
fonte
46

No, non esiste un operatore nor in nessun linguaggio di programmazione mainstream di alto livello.

Perché?

Principalmente perché è difficile da leggere:

  • richiede la combinazione mentale di più operatori (" e non ", o in uno stile più letterario: " ulteriore negativo ", " ogni falso " )
  • implica implicito not sul primo operando, ma il lettore lo capisce solo in seguito
  • è diverso dai linguaggi umani, che usano una negazione esplicita sul primo operando, come " né x né y ", " né x né y ". Quindi un lettore potrebbe confondere (x nor y) con (x and not y) invece di ((not x) and (not y))
  • alcuni lettori sono confusi con l'apparente or semantica che non si applica

Ma è così comune nell'hardware ...

nor è un gate hardware elementare che può essere utilizzato per creare tutte le altre porte logiche. Quindi si potrebbe sostenere che tutti gli altri operatori logici sono combinazioni e nor è l'operatore logico elementare più semplice.

Tuttavia, ciò che è vero per l'hardware non è necessariamente vero per gli umani. E nonostante la sua popolarità a livello hardware, alcune CPU tradizionali non offrono nemmeno un NOR nel set di istruzioni assembler (ad esempio x86 ).

Alternative

La leggibilità è importante. E a volte può essere migliorato con altri mezzi.

Uso di operatori esistenti

Ad esempio:

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

Ordinamento delle condizioni

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

invece di

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

Uso di until loop

Alcune lingue offrono anche istruzioni di ciclo che consentono di esprimere condizioni con while o con until , consentendo di scegliere il modo più "positivo". Queste istruzioni sono ad esempio until c do ... in rubino , do until c ... in vb o repeat ... until c in pascal e i suoi discendenti.

Ad esempio:

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

è equivalente a:

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

Crea una funzione

Ora, se preferisci ancora la sintassi nor , potresti definire una funzione, ma solo se non prevedi che si verifichi un collegamento:

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

C'è un vantaggio di leggibilità della funzione rispetto all'operatore, poiché il lettore capisce immediatamente che la negazione si applica a tutti gli argomenti. In alcune lingue è possibile definire una funzione con un numero variabile di argomenti.

    
risposta data 06.02.2018 - 09:47
fonte
18

@ Il commento di KilianFoth sulla domanda è azzeccato.

Puoi sintetizzare nor da not e or :

if (x nor y)

è esattamente uguale a

if (not (x or y))

L'introduzione di nor come operatore separato introdurrebbe ridondanze al linguaggio, che non sono né necessarie né ricercate (o - che non sono necessarie e non richieste).

Allo stesso modo, non sono a conoscenza di alcun linguaggio con un operatore nand - probabilmente perché può essere sintetizzato da not e and operatori.

Potresti, in teoria, creare una lingua con solo nand o solo nor operatori. Tutto il and , or e not potrebbero quindi essere sintetizzati da essi. L'unico problema è che questo sarebbe ridicolmente ingombrante. Per esempi, vedi logica NOR e Logica NAND su Wikipedia.

    
risposta data 06.02.2018 - 10:11
fonte
11

Sì, APL e alcuni dei suoi dialetti hanno nor (e nand ). In APL, è denotato (poiché è o e ~ è non ):

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

Prova online!

    
risposta data 06.02.2018 - 13:29
fonte
10

Questa risposta proviene dal linguaggio assemblatore per un computer realizzato a metà degli anni '60. È piuttosto oscuro, ma per certi aspetti affronta la tua domanda.

DEC (Digital Equipment Corporation) ha lanciato il computer PDP-6 a metà degli anni '60. Questa macchina aveva un totale di 64 istruzioni che erano operazioni booleane su due operandi (inclusi alcuni casi degenerati). Queste 64 istruzioni erano in realtà 16 operatori con 4 varianti in ciascun operatore.

Due operatori, ANDCB e ORCB hanno implementato NOR e NAND rispettivamente (a meno che non sia confuso con la logica doppia negativa). Puoi consultare la tabella opcode . La tabella opcode è in realtà per il computer PDP-10, un successore del PDP-6.

Se osservi le istruzioni numeriche in binario, diventa più interessante. Risulta che per tutti gli opcode nel range 400-477 (ottale), quattro bit nell'istruzione stessa forniscono una tabella di verità a quattro bit per 16 possibili operatori booleani. Alcuni di questi operatori ignorano uno o entrambi gli input. Ad esempio SETZ e SETO ignorano entrambi gli ingressi.

I progettisti del PDP-6 hanno sfruttato questo fatto per implementare tutte queste istruzioni con meno logica di quanto avrebbe dovuto implementare solo alcune di esse. Alcune di queste istruzioni sono apparse raramente, se mai, in codice linguaggio assembly. Ma erano tutti lì.

Quindi ANDCB è l'equivalente di NOR. (ancora, a meno che non abbia ottenuto la mia logica all'indietro, nel qual caso l'ORCB è l'equivalente).

    
risposta data 06.02.2018 - 15:39
fonte
3

Perl ha la parola chiave unless che ti permette di invertire condizionali:

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

Sebbene non sia l'operatore NOR, puoi esprimere il tuo intento in un modo simile.

    
risposta data 06.02.2018 - 21:51
fonte
2

L'operatore nor come lo hai descritto non sarebbe ripetibile, il che porterebbe a molti bug difficili da individuare.

Il tuo "Esempio 2" è essenzialmente questo:

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

Ma prova di nuovo con tre variabili e guarda cosa succede:

if (false nor false nor false) {
becomes
if ((false nor false) nor false) {
becomes
if (true nor false) {
becomes
if (false) {
    
risposta data 07.02.2018 - 17:21
fonte

Leggi altre domande sui tag