Sono || e ! operatori sufficienti a rendere ogni possibile espressione logica?


294

L'espressione logica ( a && b ) (entrambe ae bhanno valori booleani) può essere scritta come !(!a || !b), ad esempio. Questo non significa che &&è "inutile"? Questo significa che tutte le espressioni logiche possono essere fatte solo usando ||e !?


83
Questa è più una domanda di logica simbolica di base che un problema di Java, ma sì. OR e NOT in combinazione possono essere usati per costruire tutto il resto. Lo stesso con AND e NOT. Ad esempio, quando ero a scuola, ci hanno insegnato a costruire tutto usando solo cancelli NAND perché hanno preso meno transistor.
Azurefrog,

79
Non confondere la capacità di scrivere una dichiarazione in questo modo con l'opportunità di farlo. Lo zucchero sintattico è una buona cosa.
azurefrog,

20
Molti chip di gate logici forniscono solo porte NAND o NOR in quanto è possibile implementare tutte le operazioni con loro e ciò li rende economici da produrre - A and B == !A nor !B == !(!A or !B). Allo stesso modo A or B == !A nand !B == !(!A and !B). Ovviamente passare lo stesso valore ad entrambi gli ingressi di una NAND o NOR darà lo stesso risultato di un semplice NOT. XOR e XNOR sono anche possibili ma più complessi. Vedi il teorema di De Morgan
Basic

16
Non è una domanda di informatica? Non vedo alcun codice qui. In particolare, se ciò sia vero nella pratica varierà in base all'implementazione, ad esempio in C ++ con sovraccarico operativo non è in generale.
Razze di leggerezza in orbita

6
@SnakeDoc Non credo che nessuno qui stia sostenendo di fare una cosa del genere. Credo che questa domanda fosse più una questione di logica teorica, che di programmazione, davvero.
ryuu9187,

Risposte:


425

Sì, come sottolineato dalle altre risposte, l'insieme di operatori che comprende ||ed !è funzionalmente completo . Ecco una dimostrazione costruttiva di ciò, che mostra come usarli per esprimere tutti i sedici possibili connettivi logici tra le variabili booleane Ae B:

Si noti che sia NAND che NOR sono di per sé completi dal punto di vista funzionale (il che può essere dimostrato utilizzando lo stesso metodo sopra), quindi se si desidera verificare che un set di operatori sia funzionalmente completo, è sufficiente dimostrare che è possibile esprimere NAND o NOR con esso.

Ecco un grafico che mostra i diagrammi di Venn per ciascuno dei connettori sopra elencati:

inserisci qui la descrizione dell'immagine

[ fonte ]


20
È difficile dire se la domanda lo intenda, ma questa risposta non affronta il comportamento di cortocircuito (rilevante, poiché la domanda chiede ||piuttosto che |) o effetti collaterali (rilevanti perché l'espansione di vero, falso, XOR e XNOR valuta i loro argomenti più volte rispetto alla costante o all'operatore originale).
David Richerby,

5
I cerchi contenenti i cerchi e le transizioni formano un diagramma di Hasse ( en.wikipedia.org/wiki/Hasse_diagram ). (Già, ho imparato qualcosa di nuovo oggi!)
Kasper van den Berg,

5
@DavidRicherby È vero. A parte XOR, XNOR, vero e falso, per quanto ne so, gli effetti collaterali e il numero di valutazioni dovrebbero essere gli stessi degli equivalenti incorporati (ad esempio !(!A || !B)ha lo stesso numero di cortocircuiti e di valutazione di A && B). Non penso che tu possa farlo per XOR e XNOR senza costrutti aggiuntivi (es. a ? !b : b), E vero o falso non è un problema se puoi salvare valori, dato che potresti avviare il tuo programma definendo truee falseusando alcune variabili booleane fittizie.
Peter Olson,

È interessante notare che l'elenco sopra comprende 16 operazioni. Ciò è coerente con il fatto che ci sono 16 possibili tabelle di verità per il caso in cui si hanno 2 ingressi e 1 uscita.
Paolo R

1
Volevo solo aggiungere un'altra visualizzazione come tabella per riferimento delle persone. Stessa fonte di cui sopra.
agosto

125

Quello che stai descrivendo è completezza funzionale .

Questo descrive un insieme di operatori logici che è sufficiente per "esprimere tutte le possibili tabelle di verità". Il tuo set di operatori Java, { ||, !}, è sufficiente; corrisponde al set {∨, ¬}, che è elencato nella sezione "Set di operatori completi funzionalmente minimi".

L'insieme di tutte le tabelle di verità indica tutti i possibili insiemi di 4 valori booleani che possono essere il risultato di un'operazione tra 2 valori booleani. Poiché ci sono 2 possibili valori per un valore booleano, ci sono 2 4 o 16 possibili tabelle di verità.

A B | 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
----+------------------------------------------------
T T | T  T  T  T  T  T  T  T  F  F  F  F  F  F  F  F
T F | T  T  T  T  F  F  F  F  T  T  T  T  F  F  F  F
F T | T  T  F  F  T  T  F  F  T  T  F  F  T  T  F  F 
F F | T  F  T  F  T  F  T  F  T  F  T  F  T  F  T  F

Ecco una tabella con i numeri della tabella della verità (0-15), le combinazioni ||e !che la producono e una descrizione.

Table  |  Operation(s)                    | Description
-------+----------------------------------+-------------
  0    | A || !A                          | TRUE
  1    | A || B                           | OR
  2    | A || !B                          | B IMPLIES A
  3    | A                                | A
  4    | !A || B                          | A IMPLIES B
  5    | B                                | B
  6    | !(!A || !B) || !(A || B)         | XNOR (equals)
  7    | !(!A || !B)                      | AND
  8    | !A || !B                         | NAND
  9    | !(A || !B) || !(!A || B)         | XOR
 10    | !B                               | NOT B
 11    | !(!A || B)                       | NOT A IMPLIES B
 12    | !A                               | NOT A
 13    | !(A || !B)                       | NOT B IMPLIES A
 14    | !(A || B)                        | NOR
 15    | !(A || !A)                       | FALSE

Esistono molti altri set funzionalmente completi, inclusi i set di elementi {NAND} e {NOR}, che non hanno corrispondenti singoli operatori in Java.


4
+1 per la modifica. Nonostante la differenza nei voti, penso che la tua risposta sia in realtà più dettagliata della mia ora.
Peter Olson,

Tabelle della verità pensavo di averle lasciate indietro dopo il primo anno di università
Barkermn01,

80

Sì.

Tutte le porte logiche possono essere realizzate da porte NOR.

Poiché un gate NOR può essere creato da un NOT e un OR, il risultato segue.


64
@PaulDraper o NAND gates
slebetman,

25
Ci sono voluti 4100 cancelli NOR per sbarcare due persone sulla luna.
Hans Passant,

4
@HansPassant E qualche stringa. Un sacco di spago. (Memoria di corda centrale, non varietà di lattine.)
CVn

3
@HansPassant A volte vorrei che Stack Exchange fosse Wikipedia, quindi avrei inserito un [citation-needed]segno proprio lì.
Simon Forsberg,


64

Prenditi il ​​tempo di leggere le leggi di DeMorgan se puoi.

Lì troverai la risposta nella lettura, nonché riferimenti alle prove logiche.

Ma essenzialmente, la risposta è sì.

EDIT : Per esplicito, il mio punto è che si può inferire logicamente un'espressione OR da un'espressione AND e viceversa. Ci sono anche più leggi per l'equivalenza logica e l'inferenza, ma penso che questa sia la più adatta.


EDIT 2 : Ecco una prova tramite la tabella di verità che mostra l'equivalenza logica della seguente espressione.

Legge di DeMorgan: !(!A || !B) -> A && B

 _____________________________________________________
| A | B | ! A | ! B | ! A || ! B | ! (! A ||! B) | A && B |
-------------------------------------------------- -----
| 0 | 0 | 1 | 1 | 1 | 0 | 0 |
-------------------------------------------------- -----
| 0 | 1 | 1 | 0 | 1 | 0 | 0 |
-------------------------------------------------- -----
| 1 | 0 | 0 | 1 | 1 | 0 | 0 |
-------------------------------------------------- -----
| 1 | 1 | 0 | 0 | 0 | 1 | 1 |
_______________________________________________________

19
Alcune persone devono votare verso il basso come parte della loro "completezza funzionale"
Jesse,

3
A + 27 / -2, non mi preoccuperei molto di un downvote vagante.
un CVn

2
@ MichaelKjörling Sono solo curioso di sapere perché alcune persone pensavano che la mia risposta non fosse utile / dannosa.
Ryuu9187,

3
Generalmente le risposte che si basano su collegamenti non sono piaciute troppo (man mano che i collegamenti muoiono), ma in questo caso ci sono così tante spiegazioni alternative delle Leggi di DeMorgan, che non vedo un problema - tuttavia, questa è la mia ipotesi riguardo al DV's
user2813274,

@ user2813274 Grazie per la spiegazione. Spero che le mie modifiche aiuteranno a colmare il divario tra la ricerca personale e arrivare alla risposta.
Ryuu9187,

11

NAND e NOR sono universali e possono essere utilizzati per creare qualsiasi operazione logica desiderata ovunque; altri operatori sono disponibili in linguaggi di programmazione per facilitare la scrittura e la creazione di codici leggibili.

Inoltre, tutte le operazioni logiche necessarie per essere cablate nel circuito vengono sviluppate utilizzando solo circuiti integrati NAND o NOR.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.