Linguaggi di Programmazione (4 Febbraio 2014)
Esercizio 1
Si considerino le seguenti definizioni Haskell
data Yunz = Yor | Frunz Int Int Yunz Yunz
usable Yor = False
usable (Frunz n m y1 y2) = (n==276)||(m==276)||(usable y1)||(usable y2)
Scrivere un programma PROLOG che definisca il predicato usable.
(Fare in modo possibilmente che il predicato restituisca solo un valore di verita'
anche nel caso un elemento contenga il numero 276 piu' di una volta, giustificando
la soluzione proposta).
Esercizio 2
Inserire le premesse (dandone giustificazione) della seguente regola (T-invk)
utilizzata dal type system di FJ per tipare l'invocazione di metodo (per semplicita' stiamo
supponendo che un metodo possa avere un solo argomento).
???
------------------------------------
Γ |- e0.m(e) ∈ C
In cosa si discosta il type system di FJ rispetto a quello di Java
(tenuto conto ovviamente che FJ e' un frammento di Java)?
Esercizio 3
Fornire un controesempio che mostri che la strategia leftmost-outermost
non e' in genere ottimale (non permette cioe' di raggiungere la forma normale, se esiste,
con il minimo numero di passi).
Esercizio 4
Definire i concetti di covarianza e controvarianza di una relazione
rispetto ad un operatore e giustificare informalmente la controvarianza della relazione
di sottotipo per il costruttore
di tipo Ref. Giustificare quindi perche' non e' possibile modificare
il tipo delle instance variables in una sottoclasse.
Esercizio 5
Si consideri la seguente estensione del programma usable dell'esercizio 1
usable Yor pred = False
usable (Frunz n m y1 y2) pred = (pred n)||(pred m)||(usable y1)||(usable y2)
In considerazione del fatto che il predicato pred in input possa essere
molto pesante dal punto di vista computazionale, si scriva un programma Erlang
in modo che il calcolo dei valori booleani (pred n) venga eseguito da processi
indipendenti.
Supporre che elementi del tipo di dato Yunz vengano rappresentati da liste
con le seguenti forme: [yor] per rappresentare uno Yor, e [frunz,N,M,Y1,Y2] per rappresentare
Yunz che non sono Yor (ovviamente N ed M saranno numeri e Y1 ed Y2 due liste che rappresentano
due Yunz).
Esercizio 6
Nel seguente codice PICT il def increment rappresenta un server che incrementa numeri
e che invia il risultato su un canale pubblico result.
Due clienti utilizzano il server increment in mutua esclusione, utilizzando il canale
lock.
Tali clienti hanno un comportamento finito (utilizzano il numero incrementato con la parte USE(-), non meglio specificata)
e terminano.
Modificare il sistema in modo da avere i due client che,
partendo rispettivamente da 3 e da 4,
una volta utilizzato il risultato incrementato,
lo rimandano nuovamente al server per un nuovo
incremento ed un nuovo utilizzo, all'infinito.
new lock:^[]
new result:^Int
def increment n:Int =
result!(+ 1 n)
run ( lock![]
| lock?[] = ( increment!3
| result?m = ( USE(m)
| lock![]
) )
| lock?[] = ( increment!5
| result?m = ( USE(m)
| lock![]
) ) )