Linguaggi di Programmazione (19 Giugno 2014)

Esercizio 1
Si consideri il seguente codice Haskell incompleto
data ......

treeapply f (Leaf x) = x

treeapply  f (Node n t1 t2) = f n (treeapply f t1) (treeapply f t2)
e si completi con la definizione del tipo di dato in modo che questa risulti la piu' generale possibile.
Cosa calcola la funzione treeapply?
Cosa restituisce l'interprete se chiediamo la cosa seguente?
:type treeapply   
Giustificare la risposta.

Esercizio 2
Scrivere il corrispettivo Erlang della funzione treeapply dell'Esercizio 1, in modo che la computazione sia parallelizzabile il piu' possibile.
Supporre di aver definito in Erlang un modulo
-module(bt)
-export(leaf/1, nodeLabel/3, getRoot/1, subtreeL/1, subtreeR/1, isLeaf/1)

Esercizio 3
Descrivere brevemente le caratteristiche principali della programmazione funzionale.
Quali di queste caratteristiche sono state utilizzate nello sviluppo di Erlang per fare i modo che tale linguaggio permetta di programmare in modo concerrente seguendo il modello ad attori?

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
Supponendo di voler implementare in Prolog il type checker di FJ, scrivere la clusole Prolog relative alla parte di programma corrispondente alla seguente regola FJ:

Per semplicita' si supponga di avere gia' delle clausole per mtype e per controllare se una classe e' definita nella Class Table attraverso l'uso di extends
Si assuma inoltre che tutti i metodi siano unari.


Esercizio 6
Fornire le regole che definiscono la relazione di sottotipo in PICT per tipi input e tipi output. Darne una giustificazione informale.