Linguaggi di Programmazione (4 Ottobre 2013)




Esercizio 1
Definire formalmente la nozione di sostituzione nel λ-calcolo.
Effettuare la seguente sostituzione e ridurre il termine ottenuto, se possibile, in forma normale.
((λw.(xw))(λy.(yx)))[λx.(w(xy))/x]

Esercizio 2
Cosa restituisce Haskell se forniamo all'interprete la seguente espressione?
:type (>>=)
Quando viene utilizzato in Haskell l'operatore >>= ?
Esercizio 3
Si considerino i due seguenti processi PICT.
run ( x!y
    | x?z = z!u
    | y?w = print!"Got it!"
    )


run ( x!y
    | x?z = a!z
    | a?w = print!"Got it!"
    )
Tali processi, se eseguiti isolatamente, hanno lo stesso effetto. Giustificare tale affermazione.
Definire poi un processo PICT che si comporti in modo differente a seconda che il primo o il secondo dei processi precedenti viene utilizzato come sottoprocesso.
Giustificare la risposta.
Esercizio 4
Definire il Session Type che fornisce la descrizione parziale (dal punto di vista del Bancomat) del protocollo di interazione tra un cliente ed un Bancomat su un canale.













Esercizio 5
Il seguente modulo Erlang permette di calcolare una funzione map che restituisce lo stesso valore della funzione Haskell
map f [] = []

map f (x:xs) = (f x):(map f xs)
ma in modo tale che ogni valore della lista di output viene calcolato da un processo (Actor) differente.
-module(mapfun).
-export([map/2,compute/3]).


collectRes([]) -> [];

collectRes([ID|IDs]) -> receive
                           {ID,Res} -> [Res|collectRes(IDs)]
                        end.


map(_,[]) -> [];

map(F,List) ->

         ComputingActors = [spawn(mapfun,compute,[F,X,self()]) || X <- List ], 
         
         collectRes(ComputingActors).                             



compute(F,X,Collector) -> Res = F(X),
                          Collector!{self(),Res}.
Modificare il modulo Erlang in modo che i risultati vengano ricevuti dalla funzione collectRes in qualsiasi ordine e poi riordinati correttamente.
Esercizio 6
Cosa si intende per Subtyping Polymorphism?
Le due seguenti funzioni OCaml hanno lo stesso body, ma comportamenti differenti. Perche?
let bumpd1 (p:< get_x : int; get_y : int; setcoord : int -> int -> unit >)     
             = p#setcoord (p#get_x +1) (p#get_y +1);;

let bumpd2 p = p#setcoord (p#get_x +1) (p#get_y +1);;
Definire un elemento myPoint tale che bump2 myPoint risulti un'applicazione corretta, mentre bump1 myPoint no.
C'e' un modo per poter applicare correttamente la funzione bump1 all'argomento myPoint? Giustificare.