Linguaggi di Programmazione (23 Settembre 2014)
Esercizio 1
Descrivere la nozione di "currificazione" e discutere dei possibili vantaggi e svantaggi del suo utilizzo
nella programmazione funzionale.
Esercizio 2
Scrivere un modulo Erlang contenente una funzione (insieme ad altre)
che permetta di creare attori che corrispondano ad oggetti
appartenenti alle seguente classe OCaml:
class cell =
object (self:'self)
val mutable contents = 0
method read = contents
method write new_cont = contents <- new_cont
method eq (c:`self) = (self#read=c#read)
end;;
Commentare il codice.
Esercizio 3
Supponiamo di avere un processo PICT che concateni stringhe, a cui si accede
tramite il canale concat:/[String String /String].
Scrivere un processo con cui si comunica tramite un canale
pingpong:/[Int ^String Bool] che restituisce sul canale fornito
in input la concatenazione di "ping" e "pong" n volte, iniziando da "ping"
o "pong" a seconda del valore booleano inviato.
[Aiutino:utilizzare lo schema della funzione fact dove i processi simulano
chiamate ricorsive di funzioni]
Esercizio 4
Descrivere l'algoritmo di unificazione per i simple types.
Semplici varianti di tale algoritmo sono utilizzate sia in Haskell
che in Prolog. Discutere brevemente lo scopo per cui sono utilizzate.
Che differeenza c'e' tra unificazione e pattern-matching?
Esercizio 5
Discutere brevemente del concetto di chiusura (closure).
Esercizio 6
Si consideri il seguente insieme di fatti e le seguenti clausole
Prolog che definiscono le relazioni di genitore, nonno, fratello e cugino
genitore(roberto,gianni).
genitore(paola,gianni).
genitore(gianni,melo).
genitore(francesco,melo).
genitore(luigi,melo).
genitore(meloJun,roberto).
genitore(giacomo,francesco).
genitore(mario,francesco).
genitore(anna,paola).
genitore(foleman,luigi).
nonno(X,Y):-genitore(Z,X),genitore(Y,Z).
fratello(X,Y):- genitore(X,Z),genitore(Y,Z),X\==Y.
cugino(X,Y):- nonno(Z,X),nonno(Z,Y),not(fratello(X,Y)),X\==Y.
Alla query
?- cugino(roberto,Y).
l'interprete Prolog risponde, correttamente:
Y = giacomo ;
Y = mario ;
Y = foleman ;
false.
Se invece cambiamo la clausola che definisce la relazione cugino,
semplicemente permutando i suoi subgoal nel modo seguente
cugino(X,Y):- not(fratello(X,Y)),X\==Y,nonno(Z,X),nonno(Z,Y).
alla stessa query
?- cugino(roberto,Y).
l'interprete Prolog risponde invece solo:
false.
Perche'?