Linguaggi di Programmazione (6 Luglio 2015)
Esercizio 1
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 2
Cosa si intende per "polimorfismo subtyping"? Quali regole di inferenza
vanno aggiunte al lambda-calcolo a' la Curry con record
per avere in esso il polimorfismo subtyping?
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.
Esercizio 4
Il seguente codice Prolog implementa un algoritmo di decisione per
un linguaggio regolare. Qual e' l'espressione regolare che rappresenta
tale linguaggio?
expr(S) :- q0(S).
q0([a | Cs]) :- q1(Cs).
q0([c | Cs]) :- q3(Cs).
q1([b | Cs]) :- q2(Cs).
q2([c | Cs]) :- q2(Cs).
q2([]).
q3([b | Cs]) :- q4(Cs).
q3([]).
q4([b | Cs]) :- q3(Cs).
Se si esegue la query
expr([a,b,c]).
l'interprete Prolog cerca di dare due soluzioni:
restituisce prima true (in maniera ovviamente corretta) e poi false.
Invece, sostituendo la seconda clausola con
q0([a | Cs]) :- !, q1(Cs).
l'interprete restituisce una sola soluzione (cioé quella corretta).
Perche'?
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.