Linguaggi di Programmazione (20 Giugno 2012)

Esercizio 1
Definire in Haskell il tipo di dato astratto Albero Binario con rami infiniti e con nodi con etichette di tipo parametrico a.
Costruire poi l'albero infinito con etichette numeriche della forma:
                        
                          1
                         / \
                        /   \
                       /     \
                     2         3
                   /  \       /  \
                 4      5     6   7
                / \    / \   / .......
               8   9  10 11 12 ........
               .......................

Esercizio 2
Discutere brevemente dell'uso dell'algoritmo di unificazione nell'interprete Haskell ed in quello Prolog.
Esercizio 3
A.A.11/12 PICT ed Erlang: discutere delle caratteristiche comuni e delle principali differenze.
A.A.precedenti Il seguente programma dovrebbe stampare "ping" e "pong" alternativamente. Ritardi nell'esecuzione di print!"ping" o print!"pong" potrebbero pero' impedire che cio' avvenga correttamente.
Modificare il codice utilizzando il canale pr al posto di print in modo da garantire l'alternanza di "ping" e "pong".
  def ping n:Int =
    if (== n 0) then
                    ()
      else
        ( print!"ping"
        | pong!(dec n)
        )
  and pong n:Int =
    if (== n 0) then
                    ()
      else
        ( print!"pong"
        | ping!(dec n)
        )
Ricordiamo che sul canale predefinito pr viene inviata una tupla formata da una stringa da stampare ed un canale responsive su cui viene inviato un segnale [] di sincronizzazione a stampa avvenuta.
Esercizio 4
Cosa si intende per LTS nel contesto del π-calcolo? Qual e' il vantaggio di utilizzare un LTS per studiare il π-calcolo al posto della relazione di riduzione? Qual e' la relazione tra LTS e relazione di riduzione per il π-calcolo?
Esercizio 5
A.A. 11/12 Dire se ed eventualmente in quali casi in OCaml una sottoclasse definisce anche un sottotipo. A.A.precedenti Definire una classe in OCaml i cui oggetti abbiano il tipo seguente
('a)< pippo : int; pluto : int; paperino : int -> int -> unit; paperina : 'a -> bool >
Esercizio 6
Descrivere (possibilmente anche con un breve esempio) quella che viene comunemente indicata come Declarative Concurrency.