Linguaggi di Programmazione (5 Ottobre 2011)
Esercizio 1
(a)
Le seguenti definizioni HASKELL
f n = n:(f(n+1))
nums = f 0
corrispondono, in SCHEME, a
(define (f n) (cons n (f (+ n 1))))
(define nums (f 0))
Che cosa "dovrebbe" fare f? e cosa e' nums?
Perche' in Haskell possiamo utilizzare f e nums (fornire possibilmente
un esempio di uso), mentre in SCHEME non ci possiamo fare in pratica niente?
Perche' comunque, anche se poi non ci possiamo fare un fico secco, SCHEME permette
lo stesso di definire la funzione f senza darci problemi?
(b)
In che modo possiamo affermare con sicurezza che
(c→c)→((c→c)→(b→b)) → (b→b)
e' un tipo per \xy.(yx), senza dover andare a trovare una derivazione per
∅ |- \xy.(yx) : (c→c)→((c→c)→(b→b)) → (b→b)
nel sistema di tipi di Curry?
Esercizio 2
(a)
Input channel types e Output channel types in PICT: discuterne e fornire un
esempio di programma PICT che ne faccia uso.
Cosa va inserito al posto di "??" affinche' la seguente regola sia una
regola corretta per il subtyping di PICT? Giustificare brevemente.
S ?? T
----------
?S < ?T
(b)
Descrivere l'F-bounded polimorphism cosi' come utilizzato in Java. Uso, vantaggi e svantaggi.
Fornire un esempio schematico di loro utilizzo.
Esercizio 3
(a)
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'?
(b)
Supponiamo di avere i tipi del lambda calcolo a' la Church (con solo int e real come
tipi base ed i tipi freccia). Scrivere un programma PROLOG che ci dica
se un tipo e' sottotipo di un altro.
Possibilmente fare in modo che il programma,
in caso di risposta affermativa (true), produca solo questa, evitando cioe' che possa produrre anche
la risposta 'false'. Giustificare tale caratteristica.