Codifica di ∃ in Python Quantificatore esistenziale: ∃ ∃ x ∈ D : B(x) Assunzione: D è rappresentabile come una sequenza Python def exist(D) :" # @param D : …" # @return bool" for item in D :" if B(item, …) :" return true" return false" 38 Esempi d’uso della codifica di ∃ in Python Problema: data un’immagine e un colore, verificare se quel colore è presente nell’immagine B() definito come: def B(x,r,g,b) :" # @param x : pixel;" # @param r: int; (0≤r≤255)" # @param g: int; (0≤g≤255)" # @param b: int; (0≤b≤255)" # @return bool" return getColor(x) == makeColor(r,g,b)" Funzione logica che risolve il problema (per il colore [55, 21,143]) : def exist(D) :" # @param D : sequence of pixels" # @return bool" for item in D :" if B(item, 55, 21,143) :" return true" return false" chiamata di B(): tre parametri aggiuntivi, in questo caso 39 Codifiche alternative di ∃ in Python def exist(D) :" # @param D : …" # @return bool" res = false" for item in D :" if B(item) :" res = true" return res" def exist(D) :" # @param D : …" # @return bool" for item in D :" if B(item) :" return true" return false" le due formulazioni sono equivalenti ! (ma non ugualmente efficienti …) 41 Qualcosa in più … Notazione preliminare: D1, D2 : insiemi di “valori” numeri, immagini, stringhe di caratteri, colori, pixel, … x, y : elementi degli insiemi D1, D2 C : D1×D2 → {vero, falso} proposizione logica sugli insiemi D1 e D2 dati x ∈ D1 e y ∈ D2, C(x,y) può valere vero oppure falso 42 Esempio D1, D2 : insiemi di pixel (da due immagini diverse, o dalla stessa immagine) C : D1×D2 → {vero, falso} definita in questo modo: C(x,y) = vero se il colore di x è uguale al colore di y C(x,y) = falso altrimenti def C(x,y) :" # @param x : pixel;" # @param y: pixel;" # @return bool" return getColor(x) == getColor(y)" 43 Quantificatori “annidati” ∀ x ∈ D1 : ( ∃ y ∈ D2 : C(x,y) ) ∃ x ∈ D1 : ( ∀ y ∈ D2 : C(x,y) ) Nota: un problema formalizzabile in questo modo è : date due immagini, verificare se ogni colore presente nella prima esiste anche nella seconda Come codificare queste proposizioni logiche in Python ? 44 Quantificatori “annidati” : codifica Python (caso ∀-∃) ∀ x ∈ D1 : ( ∃ y ∈ D2 : C(x,y) ) Assunzione: D1 e D2 sono rappresentabili come sequenze Python def exist(x, D2) :" # @param x : …" # @param D2 : …" # @return bool" for item2 in D2 :" if C(x, item2, …) :" return true" return false" def univ(D1) :" # @param D1 : …" # @return bool" for item1 in D1 :" if not B(item1, …) :" return false" return true " ∀ x ∈ D1 : B(x) def univ_exist(D1,D2) :" # @param D1 : …" ∃ y ∈ D2 : C(x,y) # @param D2 : …" # @return bool" for item1 in D1 :" lo schema seguito è quello if not exist(item1, D2) :" della codifica di ∀; la return false" condizione logica del 45 return true" comando if è la codifica di ∃ Quantificatori “annidati” : codifica Python (caso ∃-∀) ∃ x ∈ D1 : ( ∀ y ∈ D2 : C(x,y) ) Assunzione: D1 e D2 sono rappresentabili come sequenze Python def exist(D1) :" # @param D1 : …" # @return bool" for item1 in D1 :" if B(item1, …) :" return true" return false" ∃ x ∈ D1 : B(x) def exist_univ(D1,D2) :" # @param D1 : …" # @param D2 : …" # @return bool" for item1 in D1 :" if univ(item1, D2, …) :" return true" return false" def univ(x, D2) :" # @param x : …" # @param D2 : …" # @return bool" for item2 in D2 :" if not C(x, item, …) :" return false" return true" ∀ y ∈ D2 : C(x,y) lo schema seguito è quello della codifica di ∃; la condizione logica del 46 comando if è la codifica di ∀ Esempi d’uso della codifica di ∀-∃ in Python Problema: date due immagini, verificare se ogni colore presente nella prima esiste anche nella seconda def C(x,y) :" # @param x : pixel;" # @param y: pixel;" # @return bool" return getColor(x) == getColor(y)" C() definito come: Funzioni logiche che risolvono il problema : la prima crea le sequenze di pixel, poi chiama la funzione che codifica ∀-∃ … def checkColor(pict1,pict2) :" # @param pict1: picture" # @param pict2: picture" # @return bool" seq1 = getPixels(pict1)" seq2 = getPixels(pict2)" return univ_exist(seq1,seq2)" def univ_exist(D1,D2) :" # @param D1 : sequence of pixels" # @param D2 : sequence of pixels" # @return bool" for item1 in D1 :" if not exist(item1, D2) :" return false" return true" def exist(x, D2) :" # @param x : pixel" # @param D2 : sequence " of pixels" # @return bool" for item2 in D2 :" if C(x, item2) :" return true" 47 return false" Codifica alternativa di ∀-∃ in Python utilizzando due cicli esplicitamente annidati def univ_exist(D1,D2) :" # @param D1 : …" # @param D2 : …" # @return bool" for item1 in D1 :" Found = false" for item2 in D2" if C(item1,item2) :" Found = true" if not Found :" return false " return true" def univ_exist(D1,D2) :" # @param D1 : …" # @param D2 : …" # @return bool" for item1 in D1 :" Found = false" for item2 in D2" if C(item1,item2) :" Found = true" return …?! if not Found :" return false " return true" potrebbe essere corretto? 49 Ancora sul comando if (e altro…) if annidati (e regole di indentazione di Python) tutti i comandi indentati della stessa quantità appartengono allo stesso blocco di codice blocco : un insieme di comandi da eseguire come un tutt’uno if x == 1 :" if y == 2 :" print ʻblock 2ʼ" print ʻblock 1ʼ" print ʻblock 0ʼ" vero falso test1! if test1 :! comando1! comando1! 50 Ancora sul comando if (e altro…) Considerate queste due varianti : if x == 1 :" == 22 :":" ifif yy == print ʻblock ʻblock 2ʼ" 2ʼ" print print ʻblock 1ʼ" print ʻblock 1ʼ" print ʻblock 0ʼ" che cosa viene stampato se : x = 1, y = 2 x = 1, y ≠ 2 x≠1 if x == 1 :" == 22 :":" ifif yy == print ʻblock ʻblock 2ʼ" 2ʼ 2ʼ" print else ::"" else print ʻblock ʻblock 1ʼ" 1ʼ 1ʼ" print print ʻblock 0ʼ" == 11 :" " ifif xx == if ==22:":" if yy== printʻblock ʻblock2ʼ" 2ʼ" print ʻblock 2ʼ print else :" else : " print ʻblock ʻblock 1ʼ" 1ʼ" print print ʻblock 0ʼ" vero if test1 :! comando1! else :! comando! falso test1! comando1! comando! 51 Comandi iterativi for index in sequence :! ! block il comando for in Python viene eseguito un numero di volte pari alla lunghezza di sequence ma non sempre desideriamo effettivamente esaminare tutti gli elementi della sequenza … def univ(D) :" # @param D : …" # @return bool" for item in D :" if not B(item) :" return false" return true " def univ(D) :" # @param D : …" # @return bool" res = true" for item in D :" if not B(item) :" res = false" return res" 53 Comandi iterativi … oppure potremmo voler definire una iterazione che non comporta l’uso di sequenze p.es.: finchè l’utente non scrive “stop” : » seleziona una nuova immagine » modifica l’immagine dando un effetto tramonto (non sappiamo a priori quando l’utente vorrà smettere …) come definire iterazioni di durata non nota a priori? 54 Il comando iterativo while semantica: Il test è una proposizione logica Il comando è, in generale, un blocco Il ciclo può essere eseguito zero o più volte vero falso test! comando! 55 Esempio finchè l’utente non scrive “stop” : » seleziona una nuova immagine » modifica l’immagine dando un effetto tramonto userIntent = acquisisci una stringa che esprima intenzione utente" while userIntent != ʻSTOPʼ" pict = makePicture(pickAFile())" makeSunset(pict)" userIntent = acquisisci una stringa che esprima intenzione utente" problema collaterale: come acquisire una stringa interattivamente (dall’utente, durante l’esecuzione) ? o un altro tipo di valore (p.es., numerico) ? 56 Input interattivo in JES input di stringhe di caratteri requestString(prompt_string) funzione JES che prende come argomento una stringa (prompt string), apre una finestra di dialogo dove l’utente può scrivere una sequenza di caratteri, e ritorna la sequenza di caratteri scritta dall’utente il valore ritornato è sempre di tipo string !! >>> name = requestString(“What is your name”)" 57 Input interattivo in JES input di valori numerici requestNumber(prompt_string) funzione JES che prende come argomento una stringa (prompt string), apre una finestra di dialogo dove l’utente può scrivere un valore numerico (intero o reale), e ritorna il valore scritto dall’utente requestInteger(prompt_string) funzione JES che prende come argomento una stringa (prompt string), apre una finestra di dialogo dove l’utente può scrivere un valore numerico (intero!), e ritorna il valore scritto dall’utente per entrambe le funzioni il valore ritornato è di tipo numerico!! 58 Input interattivo in Python requestString(), requestNumber(), requestInteger() sono funzioni JES ! non sono usabili fuori da questo ambiente il linguaggio Python dispone di una sua funzione base per input interattivo : ! input(prompt_string) funzione Python che prende come argomento una stringa (prompt string), e ritorna il valore scritto a linea di comando dall’utente il tipo del valore viene preservato – costanti numeriche (p.es.: 34 0.425 12.0041 …) vengono lette come valori numerici – costanti di tipo string (p.es.: “Marco” ‘una stringa’ …) vengono lette come valori di tipo string » sequenze di caratteri alfabetici non racchiusi tra virgolette generano errore ! 59 Esempio userIntent = acquisisci una stringa che esprima intenzione utente" while userIntent != ʻSTOPʼ" pict = makePicture(pickAFile())" makeSunset(pict)" userIntent = acquisisci una stringa che esprima intenzione utente" userIntent = requestString(ʻwrite STOP to stop operationʼ)" while userIntent != ʻSTOPʼ" pict = makePicture(pickAFile())" makeSunset(pict)" userIntent = requestString(ʻwrite STOP to stop operationʼ)" userIntent = requestString(ʻwrite STOP to stop operationʼ)" while userIntent != ʻSTOPʼ or useriIntent !=ʻstopʼ" finezza … pict = makePicture(pickAFile())" makeSunset(pict)" userIntent = requestString(ʻwrite STOP to stop operationʼ)" 60 Esempio Ricorda: in Python, data una sequenza D : D[i] indica l’elemento in posizione i (a partire da 0) len(D) è una funzione che restituisce la lunghezza (num. di elementi) di D def univ(D) :" # @param D : …" # @return bool" for item in D :" if not B(item) :" return false" return true " equivalenti def univ(D) :" # @param D : …" # @return bool" i=0" Found = false" while i < len(D) and not Found :" if not B(D[i]) :" Found = true" i = i+1" return Found" 61 Che cosa abbiamo appreso Obiettivi di apprendimento generali espressioni e proposizioni logiche comandi condizionali – selezione tra alternative (if-else) – iterazione condizionale (while) casi di studio modifiche controllate di immagini – rimozione “occhi rossi” – “posterizzazione”