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.