Linguaggi di Programmazione (31 Gennaio 2012)

Esercizio 1
(a) Supponiamo di aver bisogno, dati due tipi A e B, di lavorare con liste contenenti elementi di A e B alternati.
Definire in Haskell tale tipo di dato. Utilizzarlo poi per definire una funzione "divide" che, presa una lista ls di Int e Bool alternati, restituisca la coppia formata dalle due liste ottenute considerando solo gli elementi Int e quelli Bool in ls.
Il tipo coppia e' denotato in Haskell con (T1,T2). Il costruttore di coppie e', similmente, (e1,e2). "fst" e' la funzione che restituisce il primo elemento di una coppia, "snd" il secondo.

(b) Descrivere in generale il concetto di overloading nei linguaggi di programmazione. Descrivere poi come questo viene implementato nelle Type Classes di Haskell. Descrivere inoltre sintassi ed uso delle Type Classes in Haskell.

Esercizio 2
(a) Il seguente segmento di codice e' parte di una definizione di classe in Ocaml:
class colorPoint =
    object (self:'self)
      inherit point as super
               :
               :
Descrivere l'uso del costrutto (self:'self) e come si riflette nel tipo delle classi.
Descrivere le problematiche presenti in Java che l'uso di tale costrutto impedisce che siano presenti in Ocaml.

(b) Descrivere cosa si intende per subtyping nominale e subtyping strutturale. Descriverne vantaggi e svantaggi. Che specie di subtyping ha Java? e Ocaml? Fornire un esempio per entrambi il linguaggi.

Esercizio 3
(a) Si consideri la seguente rappresentazione in PROLOG di formule ben formate della logica proposizionale:
- con letterali p, q, etc. rappresentiamo le variabili proposizionali;
- con neg() rappresentiamo un'implicazione;
- con implies(,) rappresentiamo un'implicazione;
- con and(,) rappresentiamo una congiunzione;
- con or(,) rappresentiamo una disgiunzione.
(esempio: la proposizione p->(p/\q) e' rappresentata dal termine implies(p,and(p,q)) ).
Scrivere un programma PROLOG che, presa la rappresentazione di una proposizione ed un insieme di fatti che rappresenti il valore di verita' delle sue variabili proposizionali (della forma truth_value(p,0) o truth_value(p,1) ), permetta di stabilirne il valore di verita'.

(b) Descrivere (possibilmente anche con un breve esempio) quella che viene comunemente indicata come Declarative Concurrency.