Linguaggi di Programmazione (18 Settembre 2015)

Esercizio 1
Nei testi e' riportata una frase di K.Bruce in cui si afferma che tra i principali vantaggi dei linguaggi statically typed c'e' quello che i tipi forniscono "extra information that can be used in compiler optimizations". Motivare la validita' di questa affermazione utilizzando PICT come esempio.
Esercizio 2
Definire in Haskell il tipo di dato "termine Prolog" ed inserirlo nella classe Show in modo da vedere sullo schermo i suoi elementi come se fossero reali termini Prolog.
Esercizio 3
Supponiamo di avere un sistema composto da un processo server e due processi client. Il processo server riceve in continuazione dei numeri che i vari client inviano, li incrementa di uno e rispedisce indietro il risultato. Il primo client invia il numero 3, mentre il secondo invia 5. Entrambi i client, una volta ricevuto il numero incrementato, lo stampano. Ovviamente il sistema rispetta il vincolo che ogni client deve riceve indietro l'incremento del numero che lui aveva inviato, non del numero inviato dall'altro client.
Si consideri la seguente implementazione parziale, in cui le comunicazione avvengono attraverso un canale comune ai client e al server, ed in cui il rispetto del vincolo e' realizzato tramite mutua esclusione tra i client.
def server [channel:^Int] =
       channel?i = (channel!(i+1) | server!channel)

def client .................

  run( new ch1:^Int
       ......
       (server!ch1
        | .....
        )
Si completi il codice.
Esercizio 4
Perche' non e' possibile avere overridden methods con un numero differente di argomenti anche ammettendo la possibilita' di modificare il tipo degli input types e dei return types?
















Esercizio 5
Se forniamo la seguente definizione all'interprete Ocaml
# let o = object (self:'self)
      val mutable x = 0
      val mutable y = 0
      method get_x = x
      method get_y = y
      method setcoord new_x new_y = x <- new_x ; y<- new_y
      method equal (p2:'self) = self#get_x=p2#get_x && self#get_y=p2#get_y
    end;;
otteniamo qualcosa della forma
val o :
  ??? = 
Cosa viene indicato realmente dall'interprete al posto di "???" ?. Giustificare la risposta.
Definire poi un oggetto o2 che abbia la definizione identica ad o, ma con un metodo in piu' e tale che il tipo di o2 sia un sottotipo di di abbia come tipo un sottotipo del tipo di o. Giustificare la risposta.
Esercizio 6
Implementare in Erlang la funzione che, presa una funzione F ed un numero N, restituisca la somma degli F(i) con i che va da 1 ad N.
Poiche' il calcolo di F(i) potrebbe risultare pesante dal punto di vista computazionale, si faccia in modo che ogni singolo valore F(i) venga calcolato da un processo apposito.