Linguaggi di Programmazione (4 Febbraio 2015)
Esercizio 1
Monadi in Haskell: definizione ed uso.
Esercizio 2
Tail recursion. Discuterne.
Esercizio 3
Supponiamo di poter definire in PICT un tipo ricorsivo della seguente forma:
type objChanType = ^[/[Int ^[]] /^Int /[objChanType ^Bool]]
Si consideri il seguente processo def incompleto:
def refInt [res: objChanType] =
(new contents:^Int
run contents!0
def write [v:Int c:/[]] = contents?_ = ( contents!v | c![] )
def read [res:!Int] = contents?v = ( contents!v | res!v )
def eq [ ...
res![write read eq]
)
Questo processo e' un modo per poter generare processi
corrispondenti ad oggetti appartenenti alla seguente classe OCaml:
class cell =
object (self:'self)
val mutable contents = 0
method read = contents
method write new_cont = contents <- new_cont
method eq (c:`self) = (self#read=c#read)
end;;
completare il processo locale def corrispondente al metodo binario
di uguaglianza.
Perche' il tipo objChanType non puo' essere definito nel seguente modo?
type objChanType = ^[^[Int ^[]] ^^Int ^[objChanType ^Bool]]
Esercizio 4
Dimostrare formalmente che in Pict si puo' sostituire un
canale di tipo
![T1 ![T2]]
con uno di tipo
![T1' ![T2']]
se T1<:T1' e T2'<:T2.
Esercizio 5
Negation as Failure in Prolog. Discuterne.
Esercizio 6
Si consideri il seguente schema di modulo Erlang.
-module(counter).
-export([start/0,loop/1]).
start() ->
spawn(counter, loop, [0]).
loop(Val) -> ...
Fornire il corpo della funzione loop in modo che tramite la chiamata di start()
si crei un processo contatore che, se riceve il messaggio increment, incrementa il proprio
contatore interno. Il processo, inoltre,
se riceve un messaggio composto da un PID e dall'atomo
value invia il contenuto del contatore al processo identificato dal PID ricevuto;
se riceve un messaggio composto dall'atomo
stop interrompe il processo contatore.
Inoltre qualsiasi altro tipo di messaggio viene ignorato.