Linguaggi di Programmazione (6 Luglio 2011)

Esercizio 1
(a) Supponiamo di voler estendere il lambda-calcolo tipato a' la Curry LC+ anche con termini che rappresentino liste (in modo esplicito, non tramite una codifica).
Fornire i tipi, gli assiomi e le regole di inferenza da aggiungere al type system.

(b) La sonda Spirit ha trovato che su Marte esistono i Loffioni.
Un Loffione puo' essere generato da un Gangarone oppure da un Sarrapone, oppure da una sequenza finita di Purpuroni. Un Purpurone viene generato dall'incontro di un Gangarone e un Sarrapone. Su Marte ci sono infiniti sarraponi, ma solo due Gangaroni, il GangaroneA e il GangaroneB.
Definire in Haskell il tipo di dato astratto Loffione che possa permettere di scrivere programmi Haskell che simulino esperimenti virtuali sui Loffioni.
Scrivere il programma Haskell che, preso un Loffione, restituisca quante volte il GangaroneA e' intervenuto nella generazione del Loffione dato.

Esercizio 2
(a) Definire la grammatica dei processi del pi-calcolo e dare formalmente la definizione di insieme dei nomi legati di un processo, bn(P), e dei nomi liberi, fn(P).
(b) Supponiamo di avere un sistema composto da un processo server e due processi client. Il processo server riceve in continuazione dei numeri che i vari client inviano, li incrementa di uno e rispedisce indietro il risultato. Il primo client invia il numero 3, mentre il secondo invia 5. Entrambi i client, una volta ricevuto il numero incrementato, lo stampano. Ovviamente il sistema rispetta il vincolo che ogni client deve riceve indietro l'incremento del numero che lui aveva inviato, non del numero inviato dall'altro client.
Implementare in Pict due versioni differenti del sistema, una in cui il rispetto del vincolo avviene attraverso l'uso di canali privati, l'altra in cui la ricezione del risultato avviene attraverso un canale comune ai client ed in cui il rispetto del vincolo avviene attraverso l'implementazione di una mutua esclusione tra i client rispetto all'invio del numero e ricezione del risultato.

Esercizio 3
(a) Si consideri il seguente programma Prolog per calcolare l'altezza di un albero binario etichettato con etichette che sono atomi:
max(N1,N2,N1):- N1>N2.
max(_,N2,N2).


altezza(X,1):- atom(X).

altezza(node(_,Subtree1,Subtree2),N):- altezza(Subtree1,N1),
                                       altezza(Subtree2,N2),
                                       max(N1,N2,M),
                                       N is M+1.
Se ora calcoliamo l'altezza dell'albero node(a,node(a,a,a),node(a,node(a,a,a),a)) attraverso la query
?- altezza(node(a,node(a,a,a),node(a,node(a,a,a),a)),X).
otteniamo non uno, ma ben due valori per l'altezza:
X = 4 ;
X = 3.
Perche'? Modificare il programma in modo che il calcolo dell'altezza restituisca l'unico valore corretto. Se possibile, fornire due differenti possibilita' di modifica.
(b) In Ocaml la definizione di una classe ha la forma
class name =
    object (self:'self)
    ....
    ....
    end;;

Qual e' il significato di "self" e di "'self"?
Quale vantaggio fornisce l'uso di "'self" relativamente ai metodi binari?