Algebra Booleana
Come per la rappresentazione dell’informazione e la sua memorizzazione
anche per la logica di elaborazione i computer digitali utilizzano circuiti di
tipo ON/OFF con due stati elettrici. È quindi necessario disporre di un sistema
di calcolo che operi su variabili che possono assumere due soli valori.
Un tale sistema era stato creato nel XIX secolo dal matematico inglese
George Boole ed è noto come algebra booleana.
Le variabili booleane possono assumere i valori logici 0 e 1 oppure V (vero) e
F (falso) (true e false)
R. Grande - Corso di Informatica - 2006 - '07
1
Funzioni booleane
Come in qualsiasi algebra, anche in quella booleana si possono definire delle
funzioni f(a,b,c,…) che operano sulle variabili e possono quindi restituire due
soli risultati: 0 e 1 oppure V (vero) e F (falso) (true e false).
Potendo le variabili assumere solo 2 valori le possibili combinazioni di n
variabili sono 2n (un numero finito) e quindi per rappresentare le funzioni
logiche si possono usare delle tabelle dette tavole di verità
Esempio:
a
b
c
f(a,b,c)
0
0
0
0
0
0
1
0
0
1
0
1
0
1
1
0
1
0
0
0
1
0
1
1
1
1
0
1
1
1
1
1
Nella tavola di verità, per ogni
possibile combinazione delle
variabili si riporta il valore
assunto dalla funzione. Nel
caso dell’esempio con tre
variabili abbiamo 23=8
combinazioni possibili quindi
la tavola ha 8 righe. Al posto
dei simboli 0 e 1 avremmo
potuto usare Vero e Falso
R. Grande - Corso di Informatica - 2006 - '07
2
Operatori booleani
Come in ogni algebra, anche nell’algebra booleana, sono definite alcune operazioni
eseguibili sulle variabili.
Per costruire una funzione booleana si utilizzano gli operatori booleani o logici che
stabiliscono le relazioni tra le variabili della funzione.
Nell’algebra di Boole esistono tre operatori fondamentali:
• NOT
negazione o complemento
• OR
disgiunzione o somma logica
• AND
congiunzione o prodotto logico
E alcuni operatori derivati tra cui XOR (da eXclusive OR disgiunzione esclusiva)
R. Grande - Corso di Informatica - 2006 - '07
3
Operatore NOT
NOT è un operatore unario, cioè opera su una sola variabile
invertendone il valore secondo la seguente tavola di verità:
a
NOT(a)
0
1
1
0
L’operazione di negazione si indica anche con ā
R. Grande - Corso di Informatica - 2006 - '07
4
Operatore OR
OR è un operatore binario, cioè opera tra due variabili eseguendo la
somma logica secondo la seguente tavola di verità:
a
b
a OR b
0
0
0
0
1
1
1
0
1
1
1
1
Il risultato è 1 se almeno una delle
variabili è 1
Oppure
Il risultato è 0 se e solo se
entrambe le variabili sono 0
L’operazione di somma logica si indica anche con a + b
R. Grande - Corso di Informatica - 2006 - '07
5
Operatore AND
AND è un operatore binario, cioè opera tra due variabili eseguendo il
prodotto logico secondo la seguente tavola di verità:
a
b
a AND b
0
0
0
0
1
0
1
0
0
1
1
1
Il risultato è 1 se e solo se tutte le
variabili hanno il valore 1
Oppure
Il risultato è 0 se almeno una delle
variabili è 0
L’operazione di prodotto logico si indica anche con a . b
R. Grande - Corso di Informatica - 2006 - '07
6
Esempi di funzioni booleane (1)
Con i tre operatori visti si può realizzare qualsiasi funzione booleana ad esempio:
f(a,b,c) = a AND b OR NOT c che ha la seguente tavola di verità costituita da 23=8
righe, se avessimo una funzione di 4 variabili avremmo 24 = 16 righe, con 5
variabili 25=32 righe ecc.
a
b
c
f(a,b,c)
0
0
0
1
0
0
1
0
0
1
0
1
0
1
1
0
1
0
0
1
1
0
1
0
1
1
0
1
1
1
1
1
Tra gli operatori logici esiste la
seguente scala di precedenza:
NOT, AND, OR
Quindi nella funzione a fianco si
esegue prima il NOT c quindi si
esegue l’AND tra a e b e infine si
esegue l’OR tra i due risultati .
R. Grande - Corso di Informatica - 2006 - '07
7
Esempi di funzioni booleane (2)
L’ordine di precedenza visto può essere cambiato con l’uso delle
parentesi: f(a,b,c) = a AND (b OR NOT c), in questo caso si risolve prima
la parentesi quindi si esegue NOT c, quindi si fa l’OR con b e infine si
esegue l’AND tra a e il risultato della parentesi; la tavola di verità diventa:
a
b
c
f(a,b,c)
0
0
0
0
0
0
1
0
0
1
0
0
0
1
1
0
1
0
0
1
1
0
1
0
1
1
0
1
1
1
1
1
R. Grande - Corso di Informatica - 2006 - '07
8
Esempi di funzioni booleane (3)
Consideriamo la seguente funzione: f(a,b,c) = NOT(a OR b) OR c la
tavola di verità si ricava in questo modo: si risolve la parentesi facendo
l’OR tra a e b, quindi si applica il NOT al risultato e infine si esegue l’OR
con c
a
b
c
f(a,b,c)
0
0
0
1
0
0
1
1
0
1
0
0
0
1
1
1
1
0
0
0
1
0
1
1
1
1
0
0
1
1
1
1
R. Grande - Corso di Informatica - 2006 - '07
9
Operatore XOR
XOR è un operatore binario, cioè opera tra due variabili eseguendo
l’operazione di OR esclusivo secondo la seguente tavola di verità:
a
b
a XOR b
0
0
0
0
1
1
1
0
1
1
1
0
Il risultato è 1 se le variabili
hanno valore diverso
Oppure
Il risultato è 0 se le variabili
hanno lo stesso valore
L’operazione di OR esclusivo si indica anche con a (+) b
R. Grande - Corso di Informatica - 2006 - '07
10
Le basi dell’hardware e del software
L’algebra di Boole è alla base
• dei circuiti logici (Hardware)
• delle procedure logiche secondo le quali avvengono le elaborazioni
(Software)
R. Grande - Corso di Informatica - 2006 - '07
11
Logica e hardware
Un circuito logico (o rete logica) è costituito da porte logiche
elementari che realizzano le operazioni dell’algebra di Boole
• La porta NOT
• la porta OR
• La porta AND
• la porta XOR
R. Grande - Corso di Informatica - 2006 - '07
12
Logica e hardware (un esempio)
Il semi-sommatore
Nella somma di due bit si verificano i seguenti casi:
A
B
Somma
Riporto
0
0
0
0
0
1
1
0
1
0
1
0
1
1
0
1
Si vede che la somma è l’OR
esclusivo (XOR) dei due
ingressi, mentre il riporto è il
prodotto logico (AND) dei
due ingressi.
Quindi un semi-sommatore può essere realizzato dalla rete logica:
Somma
A
Riporto
B
R. Grande - Corso di Informatica - 2006 - '07
13
Logica e software (esempi)
Nella preparazione del software si ricorre spesso all’uso di operatori logici quando il
programma deve decidere le operazioni da eseguire in base al verificarsi o meno di una
combinazione di eventi (vero/falso).
Esempio 1: Decisione sulla procedura da eseguire in un programma
SE esami = sostenuti AND tasse = pagate
ALLORA
accesso esame di laurea = SI
ALTRIMENTI
accesso esame di laurea = NO
Si può accedere all’esame di laurea solo se sono stati sostenuti tutti gli esami E sono state pagate le tasse
Esempio 2: Interrogazione di un archivio
(autore = “Pirandello” OR autore = “Verga”) AND (prezzo NOT > 20)
Cerchiamo i libri di Pirandello O Verga E che NON costino più di 20 euro
Esempio 3: Impostazione di una ricerca nel Web
Trova i documenti in cui siano presenti i termini (Olimpiadi OR Giochi) AND
invernali
Cerchiamo i documenti che contengano i termini “olimpiadi” O “giochi” E il termine “invernali”
R. Grande - Corso di Informatica - 2006 - '07
14
Sviluppo e produzione del software
Analisi
Problema
Algoritmo
Codifica
Programma sorgente
scritto in un
linguaggio di
programmazione
no
Fine
si
Funziona
?
si
Traduzione:
(compilatore o
Errori
interprete)
formali?
no
Programma eseguibile
linguaggio macchina
(binario)
Test
R. Grande - Corso di Informatica - 2006 - '07
15
Linguaggi di programmazione
Hardware
Linguaggio
macchina
Linguaggio assembler
Linguaggi di alto livello
R. Grande - Corso di Informatica - 2006 - '07
16
Linguaggio macchina
• Unico linguaggio effettivamente comprensibile al processore (CPU)
• Le istruzioni sono costituite da sequenze di bit: ad esempio un byte per
il Codice Operativo e altri byte per gli Operandi dell’istruzione:
Somma di due numeri
00010101
11001101
C.O. della somma
1° operando
11011011
2° operando
• Legato strettamente al particolare processore – ogni CPU ha il suo
set di istruzioni
R. Grande - Corso di Informatica - 2006 - '07
17
Linguaggio assembler
• Deve essere tradotto da un assemblatore;
• Le istruzioni sono costituite da codici mnemonici e operandi espressi
in vari modi (immediati, a registro, tramite indirizzamenti diretti o
indiretti): es. ADD A,B (somma il contenuto dei registri A e B e metti
il risultato in A)
• È molto efficiente in termini di velocità di esecuzione in quanto molto
vicino all’hardware
• È legato al processore
• Utilizzato per programmare procedure di basso livello (vicine
all’hardware) come ad esempio i driver dei dispositivi
R. Grande - Corso di Informatica - 2006 - '07
18
Linguaggi di alto livello (1)
• Fortran - Cobol
anni 50
• Algol60
anni 60
- PL1 - BASIC
• Pascal - C
anni 70
• C++
anni 80
• Java
anni 90
R. Grande - Corso di Informatica - 2006 - '07
19
Linguaggi di alto livello (2)
• Necessitano di programmi traduttori per ottenere codici eseguibili dal
processore:
• Compilatori programmi che traducono tutto il codice sorgente in un
codice macchina eseguendo controlli sintattici. Producono un
programma eseguibile indipendente dal sorgente e molto efficiente.
(Fortran, Cobol, Pascal, C, C++)
• Interpreti programmi che traducono ed eseguono il codice sorgente riga
per riga senza produrre un codice eseguibile. Ogni esecuzione richiede la
presenza e la traduzione del sorgente e ciò ne limita l’efficienza.
(BASIC)
• Virtual Machine sistema che combina i due precedenti: il codice
sorgente viene tradotto da un compilatore in un codice intermedio
(bytecode) il quale poi è interpretato dalla V.M. Ciò rende i programmi
portabili su piattaforme diverse (ognuna dispone della sua V.M.) (JAVA)
R. Grande - Corso di Informatica - 2006 - '07
20
Algoritmo (definizione)
Un algoritmo è una sequenza finita e ordinata di
operazioni che, eseguite su opportuni dati, portano alla
soluzione di un problema in un tempo finito.
Un algoritmo è quindi costituito da :
Operazioni
+ Dati
R. Grande - Corso di Informatica - 2006 - '07
21
Algoritmo (proprietà)
Un algoritmo deve essere:
• Eseguibile
costituito da operazioni che l’esecutore può fare
• Non ambiguo
ogni operazione deve essere univocamente interpretabile
dall’esecutore
• Finito
il numero totale delle operazioni da eseguire deve essere
finito ed eseguibile in un tempo finito
• Deterministico
la sequenza delle operazioni è esattamente
determinata e non dipende da elementi aleatori
• Completo
deve prevedere tutte le situazioni che si possono
presentare nella risoluzione del problema
R. Grande - Corso di Informatica - 2006 - '07
22
Algoritmo & Programma
Un algoritmo può essere codificato in un linguaggio di
programmazione per dar vita a un programma
Un programma è una sequenza ordinata di istruzioni
che dicono a un esecutore (computer) come operare sui
dati per ottenere i risultati
Programma
Dati di
ingresso
Esecutore
R. Grande - Corso di Informatica - 2006 - '07
Risultati
23
Dati - Variabili
Una variabile è un dato il cui valore può essere modificato durante
l’esecuzione del programma
Una variabile è caratterizzata da un nome, da un tipo e da un contenuto
Esempi:
n1
numero intero
15
n2
numero reale
12,34
s1
stringa di caratteri
pippo
log
booleano
true
Nome
Tipo
R. Grande - Corso di Informatica - 2006 - '07
Contenuto o valore
24
Dati - Costanti
Una costante è una rappresentazione simbolica di un dato che non
deve cambiare durante l’esecuzione del programma:
Costante numerica
23
Costante stringa
“pippo”
Le costanti stringa si scrivono tra virgolette per distinguerle dai
nomi di variabile
R. Grande - Corso di Informatica - 2006 - '07
25
Dati - Espressioni
Un’espressione è un insieme di dati, variabili e costanti, operatori e parentesi a cui
corrisponde un risultato:
Espressione
risultato
(n1+n2)/2
somma dei contenuti delle variabili n1 e n2 diviso 2
3 + 4 * 12
51 (si applicano le regole di precedenza dell’algebra)
“conto” + “corrente”
“contocorrente” (l’operatore + tra stringhe ha
significato di concatenazione)
R. Grande - Corso di Informatica - 2006 - '07
26
Linguaggio di progetto e Pseudocodifica
Per introdurre i concetti di base della programmazione usiamo un
linguaggio di progetto che ci consente di eseguire una pseudocodifica.
Il linguaggio di progetto è uno strumento linguistico (vocabolario,
sintassi e semantica) per rappresentare algoritmi.
Il passo successivo è la traduzione in un vero e proprio linguaggio di
programmazione cioè la codifica
R. Grande - Corso di Informatica - 2006 - '07
27
Un esempio di linguaggio di progetto
Definiamo un linguaggio di progetto molto semplificato con un
minimo di regole di sintassi:
• Il programma è costituito da due parti:
la parte dichiarativa -
in cui si definiscono le variabili
utilizzate nel programma e inizia
con la parola var
la parte esecutiva -
in cui si definiscono le operazioni
da eseguire chiusa tra le parole
inizio e fine
• Un blocco di istruzioni è un insieme di istruzioni chiuso tra le parole
inizio e fine
• Ogni istruzione è terminata da un “;”
R. Grande - Corso di Informatica - 2006 - '07
28
Istruzioni di Ingresso e Uscita
Un’operazione di ingresso (input) è normalmente indicata come
una lettura di un’informazione da parte dell’esecutore
Un’operazione di uscita (output) è normalmente indicata come
una scrittura di un’informazione da parte dell’esecutore
leggi(Variabile): prende il dato presente in ingresso e lo mette nella variabile
scrivi(Variabile): manda il contenuto della variabile in uscita;
R. Grande - Corso di Informatica - 2006 - '07
29
Ingresso e Uscita - Esempio
var
Parte
dichiarativa
cognome, nome: stringa;
anni: numero intero;
inizio
leggi (cognome);
leggi (nome):
Parte
esecutiva
leggi (anni);
scrivi (nome, cognome, anni);
fine
R. Grande - Corso di Informatica - 2006 - '07
30
Istruzione di Assegnamento
L’istruzione di assegnamento dà un valore a una variabile:
Variabile = espressione
Esempi:
n1 = 1;
n2 = n1 + 2;
somma = n1 + n2;
media = (n1 + n2 + n3 + n4 + n5)/5;
R. Grande - Corso di Informatica - 2006 - '07
31
Istruzione Condizionale
L’istruzione condizionale decide quali operazioni eseguire in base al
verificarsi o meno di una condizione:
se (condizione) allora
blocco-istruzioni 1
altrimenti
blocco-istruzioni 2
La condizione è un’espressione booleana, se è vera viene eseguito il blocco
di istruzioni 1, altrimenti (se è falsa) viene eseguito il blocco di istruzioni 2
R. Grande - Corso di Informatica - 2006 - '07
32
Istruzione Condizionale - Esempio
var
x, y: numero intero;
………….
inizio
leggi x;
leggi y;
se (x>=y)
allora scrivi (x)
altrimenti scrivi (y);
……….
fine
R. Grande - Corso di Informatica - 2006 - '07
33
Istruzioni di Iterazione
Un’iterazione è la ripetizione ciclica di un blocco di istruzioni
per un certo numero di volte.
Il numero di cicli da effettuare è determinato da una condizione
di uscita dall’iterazione.
La posizione della condizione di uscita classifica le iterazioni
in due tipi:
• Iterazione a condizione iniziale
• Iterazione a condizione finale
R. Grande - Corso di Informatica - 2006 - '07
34
Iterazione a condizione iniziale
mentre (condizione) esegui
blocco-istruzioni
Viene esaminata, all’inizio di ogni ciclo, la condizione di
uscita e, se questa è vera, viene eseguito il blocco di
istruzioni; quando la condizione risulta falsa si esce
dall’iterazione.
In questo modo il blocco potrebbe anche non essere eseguito
per niente, nel caso in cui la condizione di uscita sia subito
falsa
R. Grande - Corso di Informatica - 2006 - '07
35
Iterazione a condizione iniziale - Esempio
var c, max: numero intero;
Vengono scritti i numeri naturali
da 1 a max.
…………….
inizio
Nel caso in cui nella variabile max
venga letto un valore nullo o
negativo l’iterazione non avviene
neanche una volta e non viene
scritto nessun numero.
leggi (max):
c = 1;
mentre (c<=max) esegui
inizio
scrivi (c);
c = c +1;
fine
……….
fine
R. Grande - Corso di Informatica - 2006 - '07
36
Iterazione a condizione finale
esegui
blocco-istruzioni
finché (condizione)
Viene esaminata, alla fine di ogni ciclo, la condizione di
uscita e, se questa è vera, viene rieseguito il blocco di
istruzioni; quando la condizione risulta falsa si esce
dall’iterazione.
In questo modo il blocco viene eseguito almeno la prima
volta.
R. Grande - Corso di Informatica - 2006 - '07
37
Iterazione a condizione finale - Esempio
var
c, max: numero intero;
………………
inizio
…………….
Vengono ancora scritti i numeri
naturali da 1 a max.
Nel caso in cui nella variabile max
venga letto un valore nullo o negativo
l’iterazione avviene una volta e
viene scritto il numero 1.
leggi (max);
In questo caso quindi sarebbe più
opportuno usare l’iterazione a
condizione iniziale
c = 1;
esegui
scrivi (c);
c = c +1;
finché (c<=max);
……….
fine
R. Grande - Corso di Informatica - 2006 - '07
38
var
Esempio di
programma (1)
valore, cont: numero intero;
inizio
cont = 1;
Si vuole un programma che riceva
in ingresso una serie di 10 valori e
li controlli mandando in uscita solo
quelli che rientrano in un certo
range (ad es. 10 – 50), mentre per
gli altri emette il messaggio “fuori
range”.
mentre (cont <= 10)
esegui
inizio
leggi(valore);
se (valore >= 10) AND (valore <= 50)
Una possibile soluzione contiene
una iterazione a condizione iniziale
per leggere i dieci valori e, al suo
interno, una struttura condizionale
per controllare il valore ricevuto.
Notare l’uso dell’operatore logico
AND nella condizione
allora scrivi (valore)
altrimenti scrivi(“fuori range”);
cont = cont + 1;
fine;
scrivi (“fine valori”);
fine.
R. Grande - Corso di Informatica - 2006 - '07
39
Esempio di
programma (2)
var
a, b, r: numero intero;
inizio
leggi (a); leggi (b);
Si vuole un programma che,
ricevuti in ingresso due numeri a e
b, calcoli il loro Massimo Comun
Divisore (MCD).
esegui
r = a mod b;
a = b; b = r;
Una possibile soluzione è
l’algoritmo di Euclide che
funziona così:
1.
Si calcola il resto r della divisione
intera a/b;
2.
Se r = 0 b è il risultato cercato e il
processo finisce;
finchè (r < > 0);
scrivi a;
fine.
altrimenti si pone a = b e b = r e si
ripete dal punto 1
R. Grande - Corso di Informatica - 2006 - '07
40