Linguaggi di Programmazione (5 Ottobre 2010)
Esercizio 1
(a)
Perche' dimostrare proprieta' di programmi funzionali dovrebbe essere piu'
semplice, in genere, che per programmi imperativi?
(b)
Si considerino le seguenti definizioni Haskell contenure in un file di nome esercizio.hs.
contains x [] = False
contains x (y:ys) = if (x == y) then True else (contains x ys)
data Giuggiolo = Giuggiolo Int
deriving(Show)
data Paperino = Paperosimple Giuggiolo | Paperocomplex [Giuggiolo]
deriving(Show)
cucu :: Paperino -> Giuggiolo -> Bool
cucu (Paperosimple (Giuggiolo n)) (Giuggiolo m) = (n == m)
cucu (Paperocomplex lg) g = (contains g lg)
Se facciamo valutare il file esercizio.hs all'interprete Haskell
riceviamo la seguente segnalazione di errore:
ERROR "esercizio.hs":17 - Instance of Eq Giuggiolo required for definition of cucu
Perche'? Come si risolve il problema?
Esercizio 2
(a)
Supponiamo di avere le seguenti definizioni in FJ:
class A extends Object {
A() { super(); }
}
class B extends Object {
B() { super(); }
}
La seguente espressione FJ e' correttamente tipabile?
(A)(Object)new B()
Perche?
Perche' si e' introdotta in FJ la seguente
regola di tipo?
Gamma |- e : D C non sottotipo di D D non sottotipo di C
stupid warning
----------------------------------------------------------------------
Gamma |- (C)e : C
(b)
Cos'e' la structural congruence per i termini del pi-calcolo?
La seguente condizione, che deve essere soddisfatta dalla
structural congruence, e' scritta correttamente?
P | new x in Q = new x in (P | Q)
(ovviamente, per motivi tipografici abbiamo utilizzato il
simbolo '=' al posto di quello che rappresenta la congruenza).
Perche' e' indispensabile postulare la validita' di questa
condizione? qual e' il suo scopo?
Esercizio 3
(a)
Si supponga di avere una base di dati composta
da asserzioni del tipo
parent(tizio, caio).
che indicano che tizio e' figlio di caio.
Scrivere un programmino Prolog per controllare
se due persone sono cugini.
Scrivere una query la cui valutazione permetta di
ricavare tutti i cugini di Roberto, eventualmente anche
con ripetizioni. Se il programma potrebbe produrre delle ripetizioni,
indicare quali potrebbero essere le cause di output ripetuti.
(b)
VanRoy suggerisce, per i linguaggi O.O., di utilizzare il
meccanismo dell'Inheritance il meno possibile e di utilizzare
al suo posto il meccanismo della Composition. Perche'?