Linguaggi di Programmazione (20 Giugno 2010)

Esercizio 1
(a) Il cast in Java quali problemi crea? Quali garanzie ci forniscono a riguardo i teoremi di FJ i cui enunciati sono stati studiati nel corso?

(b) Il sistema di tipi di Java e' invariante, covariante o controvariante rispetto ai tipi degli argomenti e del risultato dei metodi overridden nelle sottoclassi? Quali problemi comporta tale invarianza/covarianza/controvarianza? Quali vantaggi? Si potrebbe definire il type system di Java diversamente per migliorarlo?

Esercizio 2
(a) Definire in Haskell la lista di tutti i numeri naturali a partire da 1.
Utilizzarla per definire la funzione che, preso un predicato sui numeri, restituisca la lista di tutti i numeri che soddisfano tale predicato.
(b) Definire nel modo piu' formale possibile la relazione di beta-riduzione (passo unitario di computazione).

Esercizio 3
(a) Definire l'algoritmo di unificazione per i tipi del Lambda-calcolo tipato semplice. Modificare tale algoritmo per poterlo applicare ai termini del PROLOG.

(b) Definire la nozione di riduzione per i termini del π-calcolo. Perche' tale relazione conviene descriverla anche come LTS (labelled transition system)? Quali vantaggi ne derivano?