360 likes | 485 Views
Il tipo boolean. Un ponte tra due mondi. Una normativa.
E N D
Il tipo boolean Un ponte tra due mondi AN Fondam98 Numeri
Una normativa • Un certificato di residenza puo' venire rilasciato se il richiedente e' un uomo che possiede il certificato di lavoro e ha famiglia a carico, oppure se non ha il certificato di lavoro ma e' una donna con famiglia a carico, oppure se e' un uomo o donna maggiorenne con certificato di lavoro, oppure se non e' maggiorenne ma ha certificato di lavoro e famiglia a carico, oppure se e' minorenne senza famiglia a carico ma con certificato di lavoro AN Fondam98 Numeri
Una diversa rappresentazione • u = e' un uomo • cl = ha il certificato di lavoro • fc = ha famiglia a carico • m = e' maggiorenne AN Fondam98 Numeri
Una diversa rappresentazione • u = e' un uomo • cl = ha il certificato di lavoro • fc = ha famiglia a carico • m = e' maggiorenne AN Fondam98 Numeri
Un teorema • Una arbitraria funzione f(A1,...,An) di n variabili booleane A1,...,An puo' essere espressa in uno e un solo modo in forma disgiuntiva normale cioe' come somma (or) di prodotti (and) delle n variabili. I prodotti si dicono mintermini della funzione. AN Fondam98 Numeri
xor a b z 0 0 0 0 1 1 1 0 1 1 1 0 boolean xor(boolean a,boolean b){ return !a && b || a && !b; }//xor AN Fondam98 Numeri
L’algebra di Boole Proprieta' commutativa: a+b=b+a; P1a a*b=b*a P1b Proprieta' associativa: (a+b)+c = a+(b+c) P2a (a*b)*c = a*(b*c) P2b Proprieta' di idempotenza: a+a=a P3a a*a= a P3b Proprieta' di assorbimento: a+(a*b) =a P4a a*(a+b) =a P4b Proprieta' distributiva: a * ( b + c )= a*b + a * c P5a a + (b * c)=(a+b) *(a+c) P5b AN Fondam98 Numeri
L’algebra di Boole Proprieta' del minimo: a*0 =0 P6a Proprieta' del massimo: a+1=1 P6b Proprieta' del complemento: a * !a =0 P7a a+!a=1 P7b AN Fondam98 Numeri
I vantaggi dell’algebra • I teoremi dell'algebra Booleana consentono di trasformare la espressione nella espressione equivalente: cl or (not u and fc ) • Il certificato di residenza viene rilasciato se il richiedente ha un certificato di lavoro oppure se e' una donna con famiglia a carico. AN Fondam98 Numeri
Mappe di Karnaugh • Anziche' ricorerre direttamente ai teoremi dell'algebra Booleana per trovare la forma minima equivalente di una funzione booleana, i progettisti hardware sono soliti ricondursi ad una forma geometrica (mappa di Karnaugh) che riconduce l'adiacenza logica di due mintermini (il fatto che differiscono per un solo bit) ad adiacenza geometrica. • L'uso delle proprieta' di idempotenza e distributiva e' implicito nella individuazione di caselle adiacenti di 2p elementi (con p>1) detti raggruppamenti rettangolari AN Fondam98 Numeri
Termini adiacenti c \ ab 00 01 11 10 0 1 11 1 1 1 0 0 0 !c!a!b+!c!ab= (distributiva) !c!a(!b+b)= !c!a !cab+!ca!b= !ca (distributiva) !c!a+!ca=!c (distributiva) AN Fondam98 Numeri
La mappa di Karnaugh fc,m/u,cl 00 01 11 10 00 0 1 1 0 01 0 1 1 0 11 1 1 1 0 10 1 1 1 0 cl fc,m/u,cl 00 01 11 10 00 0 1 1 0 01 0 1 1 0 11 1 1 1 0 10 1 1 1 0 fc && !u AN Fondam98 Numeri
Rappresentazione degli interi Strutture dinamiche o modifiche di stato? AN Fondam98 Numeri
Una rappresentazione degli interi a0 a1 a2 a3 a4 a5 a6 a7ai = false o true ha la seguente interpretazione (essendo n=7): b0 2n + b1 2n-1 + ...+ b6 2n-6 + b7 2n-7 f f f f f f f f denota zero f f f f f f f t denota uno AN Fondam98 Numeri
L’operazione succ Data la rappresentazione a0 a1 a2 a3 a4 a5 a6 a7 occorre determinare la rappresentazione b0 b1 b2 b3 b4 b5 b6 b7 tale che • a7=false : b7=true e bi=ai, per i=0,..,6; • a7=true: b7=false e bi=!ai per i=6,..,k tale che ai=true, e bi=ai per i=k-2,...,0; AN Fondam98 Numeri
L’operazione succ Sono necessari n=8 passi computazionali tali che: • il risultato del passo kmodipenda dal risultato del passo (k-1)mo; • il risultato del passo kmo aggiunga una cifra binaria alla rappresentazione ottenuta nel passo (k-1)mo AN Fondam98 Numeri
Generare informazione • Si introducono operazioni che permettano di costruire collezioni di dati. • Un’operazione di questo tipo e’ la concatenazione sul tipo String di Java. Infatti, date due stringhe s1 e s2 di lunghezza n1 e n2 rispettivamente, l’operazione s1+s2 restituisce una stringa di n1+n2 caratteri AN Fondam98 Numeri
La rappresentazione come ADT intRep consIRep(boolean x,intRep bv) data la rappresentazione bv a n bit (1<=n<8) di un intero restituisce la rappresentazione di un intero di n+1 bit cosi’ formata: x bv0,…,bvn AN Fondam98 Numeri
Il punto iniziale Per evitare un regresso all’infinito, viene data come primitiva la sequenza vuota emptyRep denotata anche mediante eR AN Fondam98 Numeri
Il numero tre consIRep(false, consIRep(false, consIRep(true, consIRep(true, emptyRep)))); AN Fondam98 Numeri
Altre operazioni primitive int length( intRep x) restituisce il numero di bit di x boolean bitAt(intRep x,int i) restituisce il valore del bit di posizione i-ma di x (0<=i<length(x)). boolean isEq(intRep x,intRep y ) restituisce true se x e y hanno la stessa configurazione di bit, false altrimenti AN Fondam98 Numeri
Altre operazioni primitive String toString(intRep x) restituisce la rappresentazione binaria di x come stringa intRep shl( intRep x ) restituisce la rappresentazione di x traslata di una posizione a sinistra intRep shr( intRep x ) restituisce la rappresentazione di x traslata di una posizione a destra AN Fondam98 Numeri
succ 0100 => 0101 0011 => 0100 AN Fondam98 Numeri
succ: specifica eseguibile intRep succ(intRep a ){ //a e’ un intero rappresentato da length(a) bit int n=length(a)-1;//indice componente meno significativa return(!bitAt(a,n)) ?//tuuto uguale ad a tranne a[n] copyRep(a,0,n,consIRep(!bitAt(a,n),eR)) : compl(a,n,consIRep(!bitAt(a,n),eR)); } AN Fondam98 Numeri
copia intRep copyRep( intRep a,int n1,int n,intRep v){ //v e’ la copia corrente di a fino ad a[n] essendo n1 <= n //copia la rappresentazione di a fino ad a[n1] return (n1==n) ? v : copyRep( a,n1,n-1, consIRep(bitAt(a,n-1),v)); } AN Fondam98 Numeri
Propagazione del complemento intRep compl(intRep a,int n,intRep v){ //somma 1 con la tecnica del complemento del bit i-mo //v e’ il risultato dalla fine di a alla componente di indice n return (n==0) ? v : (bitAt(a,n-1))? compl(a,n-1,consIRep(!bitAt(a,n-1),v)) :(n==1) ? consIRep(!bitAt(a,0),v) :copyRep(a,0,n-2,consIRep(bitAt(a,n-2), consIRep(!bitAt(a,n-1),v))); } AN Fondam98 Numeri
Complemento a due v + (-v) = 2n (-v) = 2n – v = 2n – 1 – v + 1 Il valore di 2n–1 e’ rappresentato da una collezione n bit di valore 1. Quindi la rappresentazione del valore di 2n–1–v si ottiene complementando ogni bit della rappresentazione di v. Questa operazione si dice anche complemento a1. AN Fondam98 Numeri
Complemento a uno intRep compl1( intRep v, int n, intRep vc1 ){ //vc1 e’ il complemento a 1 della rappresentazione di v //dal bit meno significativo fino al bit di indice n compreso return (n==0) ? vc1 : compl1(v,n-1, consIRep(!bitAt(v,n-1),vc1)); } AN Fondam98 Numeri
Somma binaria • r\a,b 00 01 11 10 | 00 01 11 10 • 0 0 1 0 1 | 0 0 1 0 • 11 0 1 0 | 0 111 • somma s riporto r’ S = !r*(!a*b+a*!b) + r*(!a*!b+a*b) = = !r*(a xor b) + r*!(a xor b) = = r xor (a xor b) r’ = !r ( a xor b) + a*b AN Fondam98 Numeri
Full adder a b r sfn mfn r’ s AN Fondam98 Numeri
Somma di due bit con riporto boolean mfn(boolean a,boolean b,boolean r){ return xor(r, xor( a, b )); }//mfn boolean sfn(boolean a,boolean b,boolean r ){ return r && xor( a, b ) || ( a && b ); }//sfn AN Fondam98 Numeri
Full adder intRep fa( boolean a,boolean b,boolean r){ //full adder: restituisce una coppia di bit return consIRep(sfn(a,b,r), consIRep(mfn(a,b,r),eR) ); }//fa AN Fondam98 Numeri
Una macchina per sommare AN Fondam98 Numeri
Sommatore a N bit intRep FA( intRep a, intRep b){ //full adder a N (N>1) bit: restituisce la rappresentazione di a+b //IPOTESI: length(a)=length(b)=N return FA(a,b,length(a),eR,false); } AN Fondam98 Numeri
FA a N bit che usa fa a due bit intRep Fa( intRep a,intRep b, int n,intRep s,boolean r ){ //full adder a N (N>1) bit //s e’ la rappresentazione della somma dei bit meno significativi fino a n //r e’ il valore corrente del riporto intRep sbn=fa(bitAt(a,n-1),bitAt(b,n-1),r); return(n==1)?consIRep(bitAt(sbn,1),s): Fa(a,b,n-1, consIRep(bitAt(sbn,1),s),bitAt(sbn,0)); }//Fa AN Fondam98 Numeri
FA a N bit che usa mfn e sfn intRep FA( intRep a,intRep b, int n,intRep s,boolean r ){ //s e’ la rappresentazione della somma dei bit meno significativi fino a n //r e’ il valore corrente del riporto return(n==0)? s : FA(a,b,n-1,consIRep( mfn(a.bitAt(n-1),b.bitAt(n-1),r),s), sfn(a.bitAt(n-1),b.bitAt(n-1),r)); }//FA AN Fondam98 Numeri