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![]
    )            )            )