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”
Scarica

Codifica di ∃ in Python Esempi d`uso della codifica di ∃ in Python