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
© Copyright 2024 Paperzz