slides

Programmazione Funzionale
Esercizi sugli alberi - seconda parte
Davide Mottin - Themis Palpanas
May 21, 2014
1/20
Funzioni sugli alberi
Alberi di espressioni
Funzioni che restituiscono alberi
Scambia sottoalberi
Potatura di un albero
Percorso pi`
u lungo
Tutti i percorsi
Alberi rosso-neri
Sequenza pi`
u lunga
Sommario
2/20
Stampare espressioni
Data la definizione:
type operator=Sum | Mul | Pow;;
type expression tree=Value of int | Tr of operator *
expression tree * expression tree;;
che rappresenta espressioni aritmetiche su numeri interi, definire la
funzione string tree:expression tree -> string che,dato in
input l’albero di un’espressione, restituisce una stringa contenente
una stampa dell’espressione. Ad esempio se l’albero `e definito
come: Tr(Mul, Tr(Sum, Value 1, Value 3), Tr(Pow,
Value 2,Value 2)), l’espressione che deve essere stampata `e:
((1+3)*(2^2)).
Funzioni sugli alberi
3/20
Stampare espressioni
Data la definizione:
type operator=Sum | Mul | Pow;;
type expression tree=Value of int | Tr of operator *
expression tree * expression tree;;
che rappresenta espressioni aritmetiche su numeri interi, definire la
funzione string tree:expression tree -> string che,dato in
input l’albero di un’espressione, restituisce una stringa contenente
una stampa dell’espressione. Ad esempio se l’albero `e definito
come: Tr(Mul, Tr(Sum, Value 1, Value 3), Tr(Pow,
Value 2,Value 2)), l’espressione che deve essere stampata `e:
((1+3)*(2^2)).
Hint 1. Provare a definire intanto una funzione di stampa degli
operatori string of operator
Funzioni sugli alberi
3/20
Stampare espressioni - string of operator
let string of operator = function
Sum −> ”+”
| Mul −> ” ∗”
| Pow −> ” ˆ ” ; ;
Funzioni sugli alberi
4/20
Stampare espressioni - Soluzione
l e t rec s t r i n g t r e e = f u n c t i o n
V a l u e v −> s t r i n g o f i n t v
| Tr ( o , l , r ) −>
” ( ” ˆ( s t r i n g t r e e l )ˆ( s t r i n g o f o p e r a t o r o )
ˆ( s t r i n g t r e e r )ˆ ” ) ” ; ;
Funzioni sugli alberi
5/20
Valutazione di espressioni
Definire la funzione eval tree:expression tree -> int che,
dato in input l’albero di un’espressione, restituisce l’intero
corrispondente alla valutazione dell’espressione.
Funzioni sugli alberi
6/20
Valutazione di espressioni
Definire la funzione eval tree:expression tree -> int che,
dato in input l’albero di un’espressione, restituisce l’intero
corrispondente alla valutazione dell’espressione.
Hint 1. Si pu`o per esempio prevedere una funzione
op of operator:operator -> int -> int -> int che data in
input un operazione la converte nella corrispondente funzione.
Funzioni sugli alberi
6/20
Valutazione di espressioni
Definire la funzione eval tree:expression tree -> int che,
dato in input l’albero di un’espressione, restituisce l’intero
corrispondente alla valutazione dell’espressione.
Hint 1. Si pu`o per esempio prevedere una funzione
op of operator:operator -> int -> int -> int che data in
input un operazione la converte nella corrispondente funzione.
Hint 2. La valutazione `e ricorsiva e il risultato sar`a l’operazione
sulla valutazione dell’espressione destra e sinistra.
Funzioni sugli alberi
6/20
Valutazione di espressioni - Soluzione
let op of operator = function
Sum −> (+)
| Mul −> ( ∗ )
| Pow −> f u n x y −> i n t o f f l o a t ( ( f l o a t x ) ∗ ∗ ( f l o a t y ) ) ; ;
l e t rec e v a l t r e e = f u n c t i o n
V a l u e x −> x
| Tr ( op , l , r ) −>
o p o f o p e r a t o r op ( e v a l t r e e l ) ( e v a l t r e e r ) ; ;
Funzioni sugli alberi
7/20
Scambia sottoalberi
Costruire una funzione swap:’a tree -> ’a tree che scambia i
sottoalberi di destra e di sinistra in maniera ricorsiva.
Esempio
swap
Tr(6,
Tr (5, Empty, Empty),
Tr (7,
Tr (3, Empty, Empty),
Tr (1, Empty,
Tr(8, Empty,Empty))));;
-: int tree =
Tr (6, Tr (7, Tr (1, Tr (8, Empty, Empty), Empty),
Tr (3, Empty, Empty)),Tr (5, Empty, Empty))
Funzioni che restituiscono alberi
8/20
Scambia sottoalberi - soluzione
l e t r e c swap = f u n c t i o n
Empty −> Empty
| Tr ( x , sx , dx ) −> Tr ( x , swap dx , swap s x ) ; ;
Funzioni che restituiscono alberi
9/20
Potatura di un albero
Costruire una funzione prune:’a->’a->’a tree->’a tree che
preso in input un valore lb e un valore ub e un albero tr , restituisca
tr “potato” ossia mantenendo solamente i sottoalberi la cui radice
`e compresa tra ub ed lb, estremi inclusi.
Esempio
prune 4 7
Tr(6,
Tr (5, Empty, Empty),
Tr (7,
Tr (3, Empty, Empty),
Tr (1, Empty,
Tr(8, Empty,Empty))));;
-: int tree = Tr (6, Tr (5, Empty, Empty),
Tr (7, Empty, Empty))
Funzioni che restituiscono alberi
10/20
Potatura di un albero - Soluzione
l e t r e c p r u n e l b ub = f u n c t i o n
Empty −> Empty
| Tr ( x , sx , dx ) −>
i f x >= l b & x <= ub t h e n
Tr ( x , p r u n e l b ub sx , p r u n e l b ub dx )
else
Empty ; ;
Funzioni che restituiscono alberi
11/20
Percorso pi`u lungo
Creare una funzione longest path: ’a tree -> ’a list che
preso in input un albero binario cos`ı definito
type ’a tree = Empty | Tr of ’a * ’a tree * ’a tree;;
restituisca la lista del percorso pi`
u lungo di un albero a partire
dalla radice. Sia dato per esempio il seguente albero
let tr =
Tr(3,Tr(5,Empty,Tr(1,Empty,Empty)),Tr(3,Empty,Empty));;
allora
longest path tr;;
-:int list = [3;5;1]
Funzioni che restituiscono alberi
12/20
Percorso pi`u lungo - Soluzione
let longest path tr =
l e t r e c aux = f u n c t i o n
Empty −> ( 0 , [ ] )
| Tr ( x , l , r ) −>
l e t l l = aux l i n
l e t l r = aux r i n
i f ( f s t l l ) > ( f s t l r ) then
( ( f s t l l ) + 1 , x : : ( snd l l ) )
e l s e ( ( f s t l r ) + 1 , x : : ( snd l r ) )
i n snd ( aux t r ) ; ;
Funzioni che restituiscono alberi
13/20
Percorso pi`u lungo - Altra Soluzione
l e t max length l1 l2 =
i f ( List . length l1 > List . length l2 )
then l 1
else l2 ; ;
l e t rec l o n g e s t p a t h = f u n c t i o n
Empty −> [ ]
| Tr ( x , l , r ) −> x : : m a x l e n g t h ( l o n g e s t p a t h l ) ( l o
Quale delle due soluzioni `e meglio?
Funzioni che restituiscono alberi
14/20
Tutti i percorsi
Costruire una funzione all longest:’a tree -> (’a * ’a
list) tree che preso in input un albero restituisce lo stesso
albero in cui l’etichetta `e una coppia formata dall’etichetta
originale e da una lista contenente il percorso del sottoalbero pi`
u
lungo.
all longest tr;;
- : (int * int list) tree = Tr ((3, [3; 5; 1]), Tr ((5,
[5; 1]), Empty, Tr ((1, [1]), Empty, Empty)),Tr ((3, [3]),
Empty, Empty))
Funzioni che restituiscono alberi
15/20
Tutti i percorsi
Costruire una funzione all longest:’a tree -> (’a * ’a
list) tree che preso in input un albero restituisce lo stesso
albero in cui l’etichetta `e una coppia formata dall’etichetta
originale e da una lista contenente il percorso del sottoalbero pi`
u
lungo.
all longest tr;;
- : (int * int list) tree = Tr ((3, [3; 5; 1]), Tr ((5,
[5; 1]), Empty, Tr ((1, [1]), Empty, Empty)),Tr ((3, [3]),
Empty, Empty))
Suggerimento
Utilizzare la funzione longest path su tutto l’albero per ottenre
la lista dei percorsi
Funzioni che restituiscono alberi
15/20
Tutti percorsi - Soluzione
l e t rec a l l l o n g e s t = f u n c t i o n
Empty −> Empty
| Tr ( x , l , r ) −>
Tr ( ( x , l o n g e s t p a t h ( Tr ( x , l , r ) ) ) ,
( all longest l ) ,
( all longest r ));;
Funzioni che restituiscono alberi
16/20
Alberi rosso neri
Costruire una funzione rbcheck: booltree -> bool che preso
in input un albero binario con valori booleani controlli che ogni
nodo abbia un valore diverso da quello dei figli (se il nodo `e true i
figli devono essere false)
Funzioni che restituiscono alberi
17/20
Alberi rosso-neri - Soluzione
let check root x = function
Empty −> t r u e
| Tr ( r , , ) −> x = n o t r ; ;
l e t rec rbcheck = f u n c t i o n
Empty −> t r u e
| Tr ( x , l , r ) −>
( c h e c k r o o t x l ) && ( c h e c k r o o t x r )
&& r b c h e c k l && r b c h e c k r ; ;
Funzioni che restituiscono alberi
18/20
Pi`u lunga sequenza
Costruire una funzione lseqt: ’a -> ’a tree -> int che
preso in input un albero binario e un elemento x restituisca la
lunghezza del pi`
u grande insieme consecutivo nodi aventi etichetta
x nell’albero. Sia dato per esempio il seguente albero e x = 2:
2
E
1
2
E
2
E
2
E
E
E
allora la pi`
u lunga sequenza ha lunghezza 2.
Funzioni che restituiscono alberi
19/20
Pi`u lunga sequenza
Costruire una funzione lseqt: ’a -> ’a tree -> int che
preso in input un albero binario e un elemento x restituisca la
lunghezza del pi`
u grande insieme consecutivo nodi aventi etichetta
x nell’albero. Sia dato per esempio il seguente albero e x = 2:
2
E
1
2
E
2
E
2
E
E
E
allora la pi`
u lunga sequenza ha lunghezza 2.
Suggerimento
Attraverso l’operatore max `e possibile trovare la massima
lunghezza per la sequenza in un particolare sottoramo.
Funzioni che restituiscono alberi
19/20
Pi`u lunga sequenza - Soluzione
l e t rec l s e q t n = f u n c t i o n
Empty −> 0
| Tr ( x , l , r ) a s t −>
i f x = n then
l e t r e c aux = f u n c t i o n
Empty −> 0
| Tr ( x , l , r ) −>
i f x = n t h e n 1 + ( aux l ) + ( aux r )
else 0
i n max ( max ( aux t ) ( l s e q t n l ) ) ( l s e q t n r )
e l s e max ( l s e q t n l ) ( l s e q t n r ) ; ;
Funzioni che restituiscono alberi
20/20