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.