Linguaggi di Programmazione (19 Giugno 2015)
Esercizio 1
Supponiamo di aver definito in Haskell un tipo Var che rappresenti un insieme infinito di variabili,
ed un tipo Value che rappresenti un insieme di valori.
Usare la monade Maybe per definire il tipo dei "bindings" che sono associazioni
tra un numero finito di variabili e valori.
Definire una funzione update che, dato un binding B, una variabile var ed un valore val,
restituisca un binding che si comporta come B, ma che su var restituisce val.
(Si puo' assumere che il tipo Var sia nella classe Eq).
Esercizio 2
Dimostrare intuitivamente (ma non troppo...)
che
(b→c) → ((b→c)→ b) → c
e' il tipo principale di λxy.x(yx)
Esercizio 3
Si fornisca la soluzione di uno dei due seguenti quesiti
Esercizio 4
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 ricevere indietro l'incremento del numero che lui
aveva inviato, non del numero inviato dall'altro client.
La seguente e' una implementazione parziale in PICT.
Si completi tale soluzione.
def server [channel:^Int ack:^[]] =
channel?i = (channel!(i+1) | ack?[] = ..... )
new lock:^[]
def client [chan:^Int ack:^[] n:Int] =
lock?[] = (chan!n | chan?num = .....)
run( new ch1:^Int
new ack:^[]
lock![]
( server!....
| ...........
| ...........
)
Esercizio 5
Si consideri il sistema degli N filosofi a cena, con N forchette sul tavolo,
parzialmente implementato nel seguente codice Erlang.
-module(diningPhil).
-export([create/1,looptable/1,loopphil/1]).
% Funzione ausiliaria che restituisce la coppia degli indici delle forchette
% associate al filosofo M-esimo (N è il numero totale di filosofi)
forks(M, N) ->
if
(M =:= 1) -> {N, 1};
true -> {M - 1, M}
end.
create(N) ->
Table = spawn(diningPhil,looptable,[[true| | X<- lists:seq(1,N)]),
Phils = [spawn(diningPhil,loopphil,[forks(X,N),X,Table]) || X <- lists:seq(1,N)]
true.
loopphil({L,R},NumPhil,Table) -> think(),
......
eat(),
......
looptable(ListForksAvailable) -> ...
Si completi il codice solamente della funzione loopphil.
Si assuma che le funzioni think()
e eat() siano gia' implementate e
che il comportamento
di ogni filosofo sia: pensare, mandare richiesta di acquisizione
prima forchetta al tavolo, ricevere concessione forchetta,
mandare richiesta di acquisizione
seconda forchetta al tavolo, ricevere concessione forchetta, mangiare, rilasciare le forchette,
e di nuovo cosi', all'infinito.
Si assuma che nel sistema non ci sia alcuna politica per evitare uno stallo.
Esercizio 6
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?