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'?