Operazioni tra variabili booleane
La volta precedente, abbiamo ampiamente parlato delle variabili booleane, cercando di delineare quali siano le principali operazioni che si possono effettuare proprio a livello pratico.
Di tutti i casi esaminati, non abbiamo esaminato quello più importante e più ricorrente: il caso in cui le condizioni da esaminare siano più di una e, soprattutto, quando esiste una qualche relazione tra di loro.
Per risolvere queste situazioni, George Boole nel 1847 idea un tipo di algebra che comunemente viene chiamata algebra booleana. Nella letteratura, con algebra booleana si intende l'algebra in cui i valori, detti valori di verità, possono assumere solo i valori "vero" o "falso", denotati rispettivamente anche con 1 e 0. Si può notare subito che le entità "protagoniste" dell'algebra di Boole sono quelle che abbiamo definito variabili booleane.
Operatori booleani
Come nell'algebra tradizionale, anche nell'algebra booleana è stato necessario definire degli operatori per poter effettuare le operazioni tra valori di verità.
Prima di iniziare la disamina dei tre opratori fondamentali, è bene introdurre un nuovo termine. Definiamo congiunto ogni membro di un'espressione logica.
And - prodotto logico
La prima operazione che esaminiamo è quelal del prodotto logico.
La situazione è quella in cui vogliamo controllare che due o più condizioni siano vere allo stesso momento. Si vuole quindi verificare che una serie di condizioni si sia verificata. L'operatore and restituirà quindi true se tutti i congiunti della condizione sono veri contemporaneamente.
Il comportamento di un operatore logico può essere riassunto attraverso una tabella a doppia entrata. Vediamo quindi come si comporta l'operatore and con due variabili.
A | B | A and B |
true | true | true |
true | false | false |
false | true | false |
false | false | false |
Da questa tabella si può evincere il comportamento a cui si accennava prima. Il risultato dell'and tra due variabili ha come risultato true se e solo se entrambi i congiunti hanno il valore di verità true.
L'operatore and gode anche di diverse proprietà. Di seguito elencherò solo quelle utili ed essenziali per sviluppare codice funzionante:
- commutativa: A and B = B and A. Banalmente, significa che l'ordine con cui eseguiamo la congiunzione logica (modo alternativo di chiamare l'and) è irrilevante;
- associativa: A and (B and C) = (A and B) and C. Questa proprietà ci dice che in qualsiasi modo effettuiamo una serie di congiunzioni, il risultato sarà sempre equivalente.
La sintassi in Java utile per esprimere questo operatore è la seguente:
condizione1 && condizione2 && ... && condizionen
Vediamo quindi che in Java, l'operatore and è esprimibile così: &&.
Vediamo un semplice esempio
int a = 5; int b = 7; if(a > 3 && b < 10){ ... }
In questo particolare caso, abbiamo due congiunti che sono a > 3 e b < 10. Valutandoli separatamente otteniamo che entrambi sono true. Otteniamo quindi un'espressione del tipo true and true, che restituisce true.
Operatore OR - somma logica
Il secondo operatore fondamentale dell'algebra booleana è l'operatore or, detto anche somma logica o disgiunzione logica.
La disgiunzione logica restituisce il valore true se e solo se almeno uno dei congiunti è vero. Quindi, nel momento in cui ci si trova a dover valutare una condizione del tipo condizione1 or condizione2 or ... or condizioneN, avremo come risultato true se e solo se almeno una delle condizioni è vera.
Analizziamo la tabella di verità dell'operatore.
A | B | A or B |
true | true | true |
true | false | true |
false | true | true |
false | false | false |
Da questa tabella notiamo proprio come quanto detto prima, sia vero. La disgiunzione logica di due o più operandi è vera se e solo se almeno uno dei congiunti è vero.
Così come la and, anche la or ha qualche proprietà che può risultare utile ai fini dello sviluppo. Vediamone un paio:
- commutativa: questa proprietà è analoga a quella del prodotto logico. Ci dice che A or B = B or A.
- associativa: ci dice che A or (B or C) = (A or B) or C. Volendo leggerla con un linguaggio naturale, ci dice che possiamo associare in qualsiasi modo i congiunti ed effettuare le disgiunzioni, ottenendo un risultato equivalente.
Questo operatore può essere espresso mediante il seguente operatore: ||.
Vediamo un esempio analogo al precedente.
int a = 5; int b = 7; if(a > b || b < 10){ ... }
In questo caso, la valutazione della condizione restituisce vero, nonostante ci sia uno dei due congiunti falso. Infatti, a non è maggiore di b. Nonostante ciò, il secondo congiunto è vero, quindi tutta la disgiunzione è vera, in quanto riconducibile ad un espressione del tipo false or true, che restituisce true.
Operatore NOT - negazione logica
Questo è l'ultimo operatore di base ed è l'unico che in qualche maniera abbiamo già visto. L'operatore not, fondamentalmente, funge da invertitore. Nel momento in cui ha come ingresso true, restituisce false e viceversa.
Vediamo la tabella di verità della negazione logica.
A | NOT A |
true | false |
false | true |
Ora possiamo finalmente capire la notazione data la scorsa volta, che per comodità riporto qui di seguito.
Prima però dobbiamo sapere la sintassi da usare per esprimere l'operatore not. Ebbene, abbiamo già visto questa sintassi, che utilizza l'operatore ! (punto esclamativo).
int a = 5; boolean condizione = a < 3; if(!condizione){ ... }
Riusciamo finalmente a comprendere il significato di quanto scritto. La condizione dell'if verrà tradotta come
if(!false)
Dalla tabella data prima, si può notare che !false = true. Otteniamo quindi un codice come
if(true)
che è una scrittura valida e funzionante.
Ordine di valutazione lazy
Abbiamo introdotto i tre principali operatori logici. Per concludere questa prima carrellata, è bene introdurre un ultimo concetto, che è quello di ordine di valutazione lazy. Lazy, letteralmente, significa "pigro".
Questo significa che, quando una and o una or vengono valutate, viene utilizzata una tecnica tale per cui il numero di congiunti valutati sia il minimo. Vediamo meglio:
- valutazione lazy della congiunzione logica: il prodotto logico (and) viene valutato sino a quando i congiunti esaminati sono true. Nel momento in cui si trova un congiunto false, la valutazione dell'intera condizione viene interrotta.
- valutazione lazy della disgiunzione logica: la disgiunzione logica (or) viene valutata sino a quando si trova un congiunto true. Nel momento in cui si trova un congiunto vero, la valutazione viene interrotta e l'intera condizione viene valutata come vera.
Questo ci fa capire che, nel momento in cui abbiamo molte condizioni in and tra di loro, è bene scrivere all'inizio quelle che con una maggiore probabilità saranno false, in modo da evitare lunghe valutazioni. Al contrario, con le disgiunzioni, è preferibile scrivere per prime le condizioni che con una maggiore probabilità saranno true.
Alessio Mungelli
Computer Science student at UniTo (University of Turin), Network specializtion, blogger and writer. I am a kind of expert in Java desktop developement with interests in AI and web developement. Unix lover (but not Windows hater). I am interested in Linux scripting. I am very inquisitive and I love learning new stuffs.
Articoli correlati
Nuove unità grafiche della finestra - CSS
'Intercop 2022" è un progetto annunciato da Google, Microsoft, Apple e Mozzilla Foundation per far sì che tutti i browser offrano la stessa esperienza web. Il progetto ha 15 aree di…
Come scaricare un'e-mail in formato PDF in Gmail per Android
Ora scoprirete quanto sia facile salvare un'e-mail ricevuta o inviata tramite Gmail in formato PDF, il tutto con il vostro smartphone Android. Gmail è una delle applicazioni di posta elettronica più…
Come usare i codici segreti di Netflix nel 2020: Codici Cheat per fan di serie e film
Potresti aver sentito parlare dei codici cheat che sbloccano tesori sconosciuti nei giochi per computer. Ma se sei qualcuno che ama perdere tempo nel fare maratone di serie, allora puoi…
Un approccio a Java: switch statement
Ciao a tutti e bentornati! Dopo una pausa, torniamo oggi con un'altra parte del corso introduttivo alla programmazione, parlando di switch statement, conosciuto anche come costrutto di selezione multipla. Intuizione L'idea dello switch statement…
I migliori trucchi e le migliori caratteristiche per padroneggiare la vostra Smart TV Android
In questo articolo vi mostriamo una raccolta dei migliori trucchi per spremere Android TV, il sistema operativo di Google progettato per i televisori. Lo potete trovare sui televisori intelligenti di…
Un approccio a Java: Il ciclo while
Ciao a tutti e bentornati! Dopo aver fatto una breve, ma corposa, introduzione sui cicli, andiamo oggi a vedere finalmente le prime implementazioni che utilizzano quello che abbiamo definito ciclo precondizionale. In Java, come…
Un approccio a Java: I cicli - Introduzione
Ciao a tutti e bentornati! Sino ad ora, abbiamo parlato di variabili e di strutture di selezione, andando a considerare alcuni degli aspetti fondamentali di questi due concetti. Teoricamente, per…
Un approccio a Java: strutture di selezione - casi d'uso
Ciao a tutti e bentornati! Sino ad ora ci siamo preoccupati di fare una carrellata quanto più completa riguardo i concetti fondamentali di cui abbiamo bisogno per approcciarci all'utilizzo delle…
Un approccio a Java: le variabili booleane
Ciao a tutti e bentornati! La volta precedente, ho fatto un'introduzione alle strutture condizionali, definendo il loro funzionamento. Prima di poter dare qualche esempio pratico, è necessario chiarire in che modo ci…
Un approccio a Java: strutture condizionali
Ciao a tutti e bentornati! Le volte precedenti abbiamo introdotto il concetto di variabile, tentando di definire alcuni concetti basilari a riguardo. Alcune situazioni fanno però intuire come il solo concetto…
Un approccio a Java: Le variabili - caso d'uso
Ciao a tutti amici e bentornati! Dopo l'introduzione fatta sulle variabili, cerchiamo di analizzare alcune criticità che si possono presentare in situazioni alquanto comuni. Partiamo quindi analizzando degli esempi pratici. Esempio 1: divisione…
Un approccio a Java: Le variabili
Ciao a tutti e bentornati! Quest'oggi inizieremo un percorso che ci porterà a studiare, ed eventualmente ripassare, quelle che sono le basi della programmazione. Inizieremo parlando di variaibli. Introduzione Chiunque voglia approcciarsi al…