FUNZIONI BOOLEANE Le funzioni booleane prendono il nome da Boole, un matematico che introdusse un formalismo che opera su variabili (dette variabili booleane o variabili logiche o asserzioni) che possono assumere due soli valori: Vero Falso Tale formalismo è detto algebra booleana e nasce come tentativo di definire in forma algebrica processi di tipo logico-deduttivo. Tuttavia, poiché l algebra di Boole opera su variabili binarie, che possono cioè assumere solo due valori, è possibile definire una corrispondenza fra i valori logici vero e falso e i valori binari e, includendo di fatto gli operatori booleani fra gli operatori dell algebra binaria. Al valore vero viene normalmente fatto corrispondere il valore binario, mentre al valore falso viene fatto corrispondere il valore binario. L algebra booleana è definita su un dominio finito ed estremamente limitato, che comprende solo i due valori vero e falso. In tale dominio è possibile definire funzioni di un numero arbitrario di variabili indipendenti. Le funzioni elementari più comunemente usate rappresentano le operazioni logiche di uso più comune e operano su una o due variabili booleane e producono come risultato un solo valore, anch esso booleano. Le funzioni più comunemente usate sono 3: NOT (opera su una sola variabile; il risultato è la negazione della variabile) AND (congiunzione logica di due variabili; il risultato è vero se entrambe hanno valore vero) OR (disgiunzione logica di due variabili; il risultato è vero se almeno una ha valore vero) E possibile dimostrare che qualunque funzione booleana è equivalente, cioè produce gli stessi risultati parità di valori assunti delle variabili su cui opera, ad una opportuna composizione di 2 di questi operatori, di cui uno sia NOT. A puro titolo di esempio, la funzione F(A,B,C) = (A AND B) OR C è equivalente alla funzione F2(A,B,C) = NOT ((NOT A) OR (NOT B)) OR C. Operatori e funzioni booleane possono essere descritte attraverso le cosiddette tabelle di verità, che associano a ciascuna possibile combinazione di valori delle variabili il corrispondente valore della funzione. In ogni riga sono quindi riportati i valori corrispondenti ad una delle possibili combinazioni delle variabili indipendenti, seguiti dal valore che assume la funzione in corrispondenza di tale combinazione. Le tabelle di verità per NOT, AND e OR sono le seguenti: X NOT X X X 2 X AND X 2 X X 2 X OR X 2 Si può notare che la tabella di verità di una funzione ad N variabili ha N+ colonne, una per ogni variabile di ingresso più una per il valore che assume la funzione. Inoltre, ovviamente, una tabella di verità ha tante righe quante sono le combinazioni possibili che le variabili di ingresso possono generare. Poiché i valori assunti da ciascuna variabile sono soltanto 2, con N variabili si hanno 2 N possibili combinazioni. Quindi una funzione booleana di N variabili potrà essere rappresentata da una tabella di verità costituita da N+ colonne e 2 N righe. Pertanto l operatore NOT, che opera su una singola variabile (N=), ha una tabella di verità costituita da 2 righe e 2 colonne, mentre le tabelle di verità relative agli operatori AND e OR, che operano su 2 variabili (N=2), sono costituite da 4 righe e 3 colonne.
Un altra considerazione che si può fare è relativa al numero di funzioni che possono essere ottenute a partire da un certo numero di variabili. Poiché ogni riga (corrispondente ad una possibile combinazione delle variabili di ingresso) può presentare due possibili valori nella colonna relativa al valore che la funzione assume in corrispondenza di tale combinazione, il numero di combinazioni possibili dei valori di uscita (e quindi di funzioni diverse che si possono generare) sarà 2 elevato al numero delle righe, che abbiamo detto essere 2 N, quindi 2 2 N. (Per analogia, ad esempio, nel Totocalcio, in cui si hanno 3 possibili risultati per ognuna delle 3 partite, il numero di possibili combinazioni vincenti è 3 3 ). Pertanto, ad esempio, è possibile ottenere 4 diverse funzioni di una sola variabile X, in cui l uscita:. è uno in entrambi i casi (X= e X=) 2. è zero in entrambi i casi 3. è uguale al valore assunto dalla variabile di ingresso (funzione identità) 4. è la negazione della variabile di ingresso (funzione NOT) Nel caso di 2 variabili avremo invece 6 possibili funzioni, fra le quali sono particolarmente importanti la funzione XOR (OR esclusivo, il valore dell uscita è vero se o l una o l altra delle variabili di ingresso, ma non entrambe, hanno valore vero) e le funzioni NAND e NOR che sono la negazione di AND e OR, cioè i cui valori sono la negazione dei valori assunti da AND e OR in corrispondenza delle omologhe configurazioni delle variabili di ingresso. X X 2 X XOR X 2 X X 2 X NAND X 2 X X 2 X NOR X 2 Come si può osservare, poiché i valori che le variabili e le funzioni possono assumere sono solo 2, è molto facile che funzioni ottenute mediante combinazioni diverse di operatori risultino equivalenti. Del resto, è stato detto che tutte le funzioni booleane possono essere espresse utilizzando la coppia di operatori NOT e AND, oppure la coppia NOT e OR. Per verificare che due funzioni booleane siano equivalenti, come ad esempio che X NAND X 2 equivale a NOT (X AND X 2 ), basterà quindi verificare che le loro tabelle di verità siano uguali, che cioè facciano corrispondere lo stesso valore a uguali combinazioni delle variabili su cui sono definite. INTERPRETAZIONE LOGICA DEGLI OPERATORI Come già detto, il primo obiettivo con cui è stata definita l algebra booleana è quello di rappresentare operazioni logiche in forma di operazioni algebriche. Da questo punto di vista, è possibile identificare le variabili di ingresso delle funzioni booleane come rappresentazioni di fatti o di asserzioni. 2
Ad esempio, se si considera il dominio logico delle figure geometriche e si associa alla variabile X l informazione ha 3 lati, alla variabile X 2 l informazione tutti i lati sono uguali, alla variabile A il concetto è un triangolo e alla variabile A 2 il concetto è un triangolo equilatero si potranno determinare le seguenti relazioni: A = X A 2 = X AND X 2 In questo caso il simbolo = rappresenta la relazione logica di equivalenza, quindi le espressioni precedenti vanno lette come una figura geometrica è un triangolo se e solo se ha 3 lati e una figura geometrica è un triangolo equilatero se e solo se ha tre lati e tutti i lati sono uguali. In modo analogo espressioni logiche possono essere utilizzate per esprimere criteri che devono essere soddisfatti, ad esempio quando si ricercano informazioni in una base di dati o con un motore di ricerca su Internet. In quest ultimo caso, l interfaccia utente permette di solito (esplicitamente o implicitamente) di esprimere criteri di ricerca sotto forma di funzioni booleane, le cui variabili sono le parole che le pagine Web che si stanno cercando devono contenere: se la parola è presente nella pagina, allora la corrispondente variabile assumerà il valore vero. I siti elencati saranno tutti quelli per cui l espressione booleana che viene usata come criterio di selezione ha come valore vero. Quindi, se si cercano le pagine che contengono informazioni su cavalli o cani (e non necessariamente su entrambi) si potrà usare come criterio cavalli OR cani. Se invece si cercano informazioni sui cavalli, ma si vogliono evitare le pagine in cui si parla di cavalli come unità di misura di potenza dei motori, si potrà adottare il criterio cavalli AND NOT motore. Un altro esempio pratico: se cerchiamo una ricetta per una macedonia di frutta e utilizziamo macedonia come criterio di ricerca otteniamo anche (e soprattutto) risultati che riguardano la Macedonia intesa come regione geografica. Occorre quindi restringere la ricerca, utilizzando un criterio più articolato, ad es. macedonia AND frutta. 3
OPERATORI BOOLEANI E CALCOLATORI Dal momento che gli operatori booleani possono essere assimilati in ogni caso a funzioni di variabili binarie, non solo vengono inclusi nel set di istruzioni delle CPU, ma tutti i circuiti digitali (reti logiche) che costituiscono l hardware di un calcolatore sono composti da un elevato numero di circuiti elementari (porte logiche) che realizzano gli operatori logici di base (NOT, AND, OR, NAND, NOR, XOR). Quindi la progettazione di una rete logica, dalle più semplici fino ai microprocessori, che sono sicuramente le più complesse, può essere ridotta alla ricerca della funzione logica che produce le uscite desiderate in presenza di certi ingressi. Tuttavia, come si è detto, ci sono molti modi per ottenere la stessa funzione booleana utilizzando diverse combinazioni di operatori logici elementari. Quindi la soluzione ottima per il progetto sarà quella che non solo rispetta le specifiche del progetto (cioè realizza correttamente la funzione desiderata), ma che riesce anche a farlo utilizzando il minor numero di porte logiche. Infatti un circuito più semplice (con meno componenti) è non solo più economico, ma anche più veloce nell eseguire l operazione per cui è stato progettato. Infatti, da un lato, i segnali elettrici che vengono elaborati all interno di un calcolatore si propagano ad una velocità prossima a quella della luce, che è elevatissima ma comunque finita. Pertanto abbreviare il percorso che i segnali devono attraversare per compiere una certa operazione comporta una riduzione del tempo di esecuzione dell operazione stessa. Dall altro lato, si deve tenere presente che, ogni volta che si attiva una porta logica, i circuiti che la compongono richiedono un tempo significativo (anche se molto piccolo, tipicamente inferiore a -6 / -9 secondi) per raggiungere una configurazione stabile che consente di leggerne il risultato correttamente. Per questo motivo, ridurre il numero di porte logiche comporta una riduzione del tempo richiesto per eseguire l operazione che queste realizzano. A livello di operazioni eseguite dalla CPU, si è visto come i dati su cui queste vengono eseguite siano normalmente raggruppati in byte o in multipli di un byte. Tuttavia abbiamo visto che gli operatori booleani operano su variabili che corrispondono a singoli bit. Quindi, come si può interpretare l istruzione A AND B, dove A e B sono, ad esempio, due parole da 8 bit? Il risultato dell applicazione di un operatore booleano a parole di più bit non è altro che una parola della stessa lunghezza in cui ciascun bit rappresenta il risultato dell operatore applicato ai due bit che si trovano in posizioni corrispondenti nei due operandi (v. Esempio ). A = A AND B = B = A OR B = A B A AND B (ogni bit è il risultato dell AND fra i due bit corrispondenti degli operandi) A OR B (ogni bit è il risultato dell OR fra i due bit corrispondenti degli operandi) Esempio L operatore AND può essere utilizzato per leggere il contenuto di un singolo bit all interno di una parola. Dalla tabella di verità dell operatore AND si può vedere che X AND =, qualunque sia il valore di X (infatti, perché l operatore AND restituisca il valore vero bisogna che entrambi gli operandi abbiano valore vero). Analogamente, X AND = X. Allora (v. Esempio 2) per conoscere il valore del bit più significativo di una parola K, ad es. di 8 bit, si può eseguire l operazione K AND, cioè applicare l operatore AND a K e a una parola composta da tutti zeri eccetto un nella posizione che vogliamo leggere. In questo modo, il risultato per i bit meno significativi sarà sicuramente, mentre il risultato sul bit più significativo sarà uguale al contenuto del bit più significativo di K. Quindi basterà verificare se la parola ottenuta è o meno uguale a zero (il confronto con lo zero fa sempre parte del set di istruzioni di una CPU): se è allora il bit che abbiamo letto ha valore, se è diversa da allora il bit è uguale a. 4
Determinare il valore del quinto bit (a partire dal meno significativo) della seguente parola: K = * Eseguo K AND Il risultato è, diverso da, quindi il bit che ho letto è uguale ad. Se fosse stato il risultato sarebbe stato. Esempio 2 Agli operatori booleani già visti si aggiungono anche i due operatori di shift (scorrimento) a destra e shift a sinistra. Il risultato di tali operatori è una parola derivata dalla parola cui sono applicati facendo scorrere ogni bit di una posizione a destra o a sinistra. Nel caso dello shift a destra (Shift Right, SHR), il bit più significativo diventa e il bit meno significativo sparisce a destra; nel caso dello shift a sinistra (Shift Left, SHL), il bit meno significativo diventa e, se consideriamo una rappresentazione con un numero finito di bit, il bit più significativo sparisce a sinistra, altrimenti si sposta di una posizione a sinistra come tutti gli altri e la parola risultante risulta più lunga di un bit rispetto a quella cui l operatore è stato applicato. P = SHR(P) = (ogni bit si è spostato a destra di una posizione; il MSB è diventato ). SHL(P) = se si hanno a disposizione più di 8 bit per rappresentare il risultato se anche il risultato è rappresentato su 8 bit (ogni bit si è spostato a sinistra di una posizione; il LSB è diventato ; il MSB è scomparso da sinistra). Esempio 3 5