Advertisement
Guest User

Esercitazione261114.ml

a guest
Nov 29th, 2014
271
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 4.00 KB | None | 0 0
  1. 3;;
  2. type 'a bstree = Empty | Node of 'a * 'a bstree * 'a bstree;;
  3.  
  4. (*5) visitC : 'a bstree -> 'a list*)
  5. (*La funzione visitC produce una visita di tuti i nodi che non sono foglie.*)
  6. let rec visitC tree = match tree with
  7. Empty -> []
  8.   |Node (a, Empty, Empty) -> []
  9.   |Node (a, t1, t2) -> [a]@(visitC t1)@(visitC t2);;
  10.  
  11. let a = Node ("A", Node ("B", Node ("C", Empty, Empty), Empty), Empty);;
  12.  
  13. visitC a;;
  14.  
  15.  
  16. (*1) isLesser  'a bstree  -> 'a bstree -> bool*)
  17. (*La funzione isLesser restituisce true se tutte le chiavi dei nodi di t1 sono piu’ piccole di quelle in t2 alla stessa posizione.*)
  18. let rec isLesser t1 t2 = match t1, t2 with
  19. (Empty, Empty) -> true
  20.   | (Node (a, l1, r1), Node (b, l2, r2)) -> (a <= b) && (isLesser l1 l2) && (isLesser r1 r2)
  21.   |_ -> true;;
  22.  
  23. (*3)getLevel : 'a -> 'a bstree ->int*)
  24. (*La funzione getLevel restituisce il livello del nodo con chiave data.*)
  25. let rec getLevelR k t acc = match t with
  26.    Empty -> 0
  27.   | Node (key, l, r) -> (if (key = k) then acc else let leftLevel = (getLevelR k l (acc + 1)) in
  28.                             if (leftLevel = 0) then (getLevelR k r (acc+1))
  29.                             else leftLevel);;
  30. let getLevel k t = getLevelR k t 0;;
  31. getLevel "B" a;;
  32.  
  33. (*6) mapTree : ('a -> 'b) -> 'a bstree -> 'b bstree*)
  34. (*La funzione  mapTree f t  applica la funzione f ad ogni key dell’albero *)
  35. let rec mapTree f t = match t with
  36. Empty -> Empty
  37.   | Node (a, l, r) -> Node ((f a), (mapTree f l), (mapTree f r));;
  38.  
  39. (*7) Fold su alberi
  40. Definire la seguente  funzione :
  41.     foldTree : ('a -> 'b -> 'b -> 'b) -> 'a bstree -> 'b -> 'b
  42. La funzione foldTree f t z scorre su tutti i nodi dell’albero in e applica la funzione f alla chiave corrente, al risultato del sottoalbero sinistro e del destro (si comporta come la fold_right ma agisce su alberi e non su liste)
  43. *)
  44.  
  45. let rec foldTree f t z = match t with
  46. Empty -> z
  47.   |Node (a, l, r) -> f a (foldTree f l z) (foldTree f r z);;
  48.  
  49. (*Implemento la visita in profondità usando la foldTree*)
  50. let prof t = foldTree (fun a b c -> b@[a]@c) t [];;
  51.  
  52. prof a;;
  53.  
  54. (*Implemento la mapTree che ho definito prima con la foldTree*)
  55. let mapTree f t = foldTree (fun a b c -> Node ((f a), b, c)) t Empty;;
  56.  
  57. mapTree (fun x -> x^"Ciao") a;;
  58.  
  59. type boolean = One  
  60.              | Zero
  61.              | LAnd of  boolean list
  62.              | LXOr of  boolean list
  63.          ;;
  64.  
  65. (*8) Definire una funzione eval che assegni ad un’ espressione di tipo boolean  un valore di tipo bool, interpretando:
  66. One e Zero con i booleani true e false,  
  67. LAnd list con true  se tutte le espressioni della lista  sono vere
  68. LXOr list con true se esattamente  una espressione della lista e’ vera *)
  69.  
  70. let rec eval exp = match exp with
  71.    One -> true
  72.   |Zero -> false
  73.   |LAnd l -> List.fold_right (fun a b -> eval a && b) l true
  74.   |LXOr l -> if (List.fold_right (fun a b -> if (eval a) then (b+1) else b ) l 0) = 1 then true else false;;
  75.  
  76. let e = LAnd [One;Zero;LXOr[One]];;
  77. eval e;;
  78.  
  79.  
  80. type exp = Pippo  
  81.              | Add of int * exp
  82.              | Alternate of exp * exp
  83.          ;;
  84.  
  85. (*Definire una funzione eval che assegni ad un’ espressione di tipo exp  un valore di tipo int list, interpretando:
  86. Pippo  con la lista [0,1]  
  87. Add n e1   con la concatenazione di n con il valore ottenuto dall’espressione e1
  88. Alternate e1 e2 con la concatenazione del valore di e1 con il valore di e2 prendendo alternativamente un elemento da e1 e uno da e2 finche’ possibile e poi troncando.*)
  89.  
  90. let rec eval exp = match exp with
  91.    Pippo -> [0;1]
  92.   |Add (v, e) -> v :: (eval e)
  93.   |Alternate (e1, e2) -> let val1 = eval (e1) in
  94.                          let val2 = eval e2 in
  95.                          let rec merge l1 l2 = match (l1, l2) with
  96.              (l, []) | ([], l) -> []
  97.             |((hd1::tl1), (hd2::tl2)) -> hd1::hd2::(merge tl1 tl2) in
  98.             merge val1 val2;;
  99.  
  100.  
  101. let e1 = Pippo;;                   (*[0;1]*)
  102. let e2 = Add (5, e1);;             (*[5;0;1]*)
  103. let e3 = Alternate (e2, e2);;      (*[5;5;0;0;1;1]*)
  104. let e4 = Alternate (e1, e2);;      (*[0;5;1;0]*)
  105.  
  106. eval e1;;
  107. eval e2;;
  108. eval e3;;
  109. eval e4;;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement