Advertisement
Guest User

Gruppo 10

a guest
Dec 21st, 2014
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 8.33 KB | None | 0 0
  1. ------------------------------------------ GRUPPO 10 -------------------------------
  2.  
  3. type 'a ntree = Tr of 'a * 'a ntree list
  4.  
  5. type multi_expr =
  6.   MultiInt of int
  7. | MultiVar of string
  8. | MultiDiff of multi_expr * multi_expr
  9. | MultiDiv of multi_expr * multi_expr
  10. | MultiSum of multi_expr list
  11. | MultiMult of multi_expr list
  12.  
  13. (* subexpr: multi_expr -> multi_expr -> bool *)
  14. let rec subexpr expr1 expr2 =
  15.     match expr1 with
  16.     | MultiInt p -> MultiInt p = expr2
  17.     | MultiVar p -> MultiVar p = expr2
  18.     | MultiDiff (p,q) -> MultiDiff (p,q) = expr2 || subexpr p expr2 || subexpr q expr2
  19.     | MultiDiv (p,q) -> MultiDiv (p,q) = expr2 || subexpr p expr2 || subexpr q expr2
  20.     | MultiSum lst -> MultiSum lst = expr2 || List.for_all (fun a -> subexpr a expr2) lst
  21.     | MultiMult lst -> MultiMult lst = expr2 || List.for_all (fun a -> subexpr a expr2) lst
  22.    
  23. (*subst: multi_expr -> string -> multi_expr -> multi_expr*)
  24. let rec subst expr var sub =
  25.     match expr with
  26.     | MultiInt p -> MultiInt p
  27.     | MultiVar p -> if p = var then sub else MultiVar p
  28.     | MultiDiff (p,q) -> MultiDiff(subst p var sub, subst q var sub)
  29.     | MultiDiv (p,q) -> MultiDiv(subst p var sub, subst q var sub)
  30.     | MultiSum lst -> MultiSum (List.map (fun x -> subst x var sub) lst)
  31.     | MultiMult lst -> MultiMult (List.map (fun x -> subst x var sub) lst)
  32.  
  33. (* postorder: ’a ntree -> ’a list *)
  34. let rec postorder = function
  35.   | Tr(a,[]) -> [a]
  36.   | Tr(a,lst)->  (List.flatten (List.map postorder lst)) @[a]
  37.  
  38. (* inorder: ’a ntree -> ’a list  *)
  39. let rec inorder = function
  40.   | Tr(a,[]) -> [a]
  41.   | Tr(a,lst) -> a::(List.flatten (List.map inorder lst))
  42.  
  43. (* foglie_in_lista: ’a list -> ’a ntree -> bool *)
  44. let rec foglie_in_lista lst = function
  45.     | Tr(a,[]) -> List.mem a lst
  46.     | Tr(a,nlst) -> List.for_all (fun a -> a) (List.map (foglie_in_lista lst) nlst)
  47.    
  48. (* sumof: int list -> int
  49.    Data una lista di interi restituisce la somma di tutti i suoi elementi *)
  50. let rec sumof = function
  51.     | [] -> 0
  52.     | a::rest -> a + (sumof rest)
  53.  
  54. (* num_di_foglie: ’a ntree -> int *)
  55. let rec num_di_foglie = function
  56.     | Tr(a,[]) -> 1
  57.     | Tr(a,nlst) -> sumof (List.map num_di_foglie nlst)
  58.    
  59. (* listaGuida: ’a list -> ’a ntree -> ’a *)
  60. let rec listaGuida lst ntree =
  61.     match (lst, ntree) with
  62.     | ([],Tr(a,_)) -> a
  63.     | (a::rest,Tr(_,nlst)) ->  try (listaGuida rest (List.nth nlst a)) with _ -> failwith "Sottoalbero non trovato"
  64.  
  65. (* maxCosto : int*int list -> int*int
  66.    Prende in input una lista di coppie di interi e restituisce la coppia con il secondo
  67.    valore più alto*)
  68. let rec maxCosto = function
  69.     | [a] -> a
  70.     | (fgl,cst)::rest -> let (fgl2,cst2) = maxCosto rest
  71.                          in if(cst > cst2) then (fgl,cst)
  72.                                            else (fgl2,cst2)
  73.    
  74. (* foglia_costo: ’int ntree ->(int * int)
  75.    aux : int -> int ntree -> (int*int)
  76.    Prendendo in input un intero e un albero, restituisce una coppia di interi
  77.    i quali rappresentano il valore della foglia con il massimo valore dell'accumulatore intero
  78.    che si ottiene sommando i valori degli alberi del cammino*)
  79. let foglia_costo ntree =
  80.     let rec aux costo = function
  81.       | Tr(a,[]) -> (a,costo)
  82.       | Tr(a,lst) -> maxCosto (List.map (aux (costo+a)) lst)
  83.     in aux 0 ntree
  84.    
  85.    
  86. (* tutte_foglie_costi: int ntree -> (int * int) list
  87.    aux : int -> int ntree -> int*int list
  88.    Prendendo in input un intero e un albero, restituisce una lista di coppie di interi
  89.    i quali rappresentano il valore della foglia e il valore dell'accumulatore intero
  90.    che si ottiene sommando i valori degli alberi del cammino*)
  91. let tutte_foglie_costi ntree =
  92.     let rec aux costo = function
  93.       | Tr(a,[]) -> [(a,costo)]
  94.       | Tr(a,lst) -> List.flatten (List.map (aux (costo+a)) lst)
  95.     in aux 0 ntree
  96.    
  97. (* ramo_da_lista: ’a ntree -> ’a list -> ’a -> ’a list
  98.    path_list : a list -> a -> a ntree list
  99.    Prende in input una lista,un etichetta e una lista di alberi e restituisce il cammino
  100.    per il quale ogni elemento della lista sia stato visitato esattamete solo una volta,
  101.    altrimenti restituisce un errore*)
  102. let rec ramo_da_lista alb lst etic =
  103.     match alb with
  104.     | Tr(a,[]) -> if a = etic && lst = [a] then [a] else failwith "Not Found"
  105.     | Tr(a,nlst) -> if List.mem a lst then a::(path_list (List.filter ((<>)a) lst) etic nlst)
  106.                                       else failwith "Not Found"
  107.     and path_list lst etic = function
  108.        | [] -> failwith "Not Found"
  109.        | alb::rest -> try ramo_da_lista alb lst etic
  110.                       with _ -> path_list lst etic rest
  111.        
  112. (* isPrimo : int -> bool
  113.    Controlla se il numero è primo
  114.    aux : int -> int -> bool
  115.    Prende in input un numero ed il suo successivo, e decide se il secondo numero
  116.    è primo o meno*)
  117. let isPrimo num =
  118.     let rec aux cont num =
  119.         if cont = 1 || cont = 0 then true
  120.         else num mod cont <> 0 && aux (cont-1) num
  121.     in aux (num-1) num
  122.        
  123. (* ramo_di_primi: int ntree -> int
  124.    path_plist : int ntree list -> int
  125.    Prende in input una lista di alberi e riporta se esiste la foglia per il quale
  126.    tutti gli elementi del cammino siano numeri primi essa compresa*)
  127. let rec ramo_di_primi = function
  128.     | Tr(a,[]) -> if isPrimo a then a else failwith "Non Trovato"
  129.     | Tr(a,nlst) -> if isPrimo a then path_plist nlst
  130.                                  else failwith "Non Trovato"
  131.     and path_plist = function
  132.        | [] -> failwith "Not Found"
  133.        | alb::rest -> try ramo_di_primi alb
  134.                       with _ -> path_plist rest
  135.                      
  136.  
  137. (* path_non_pred: (’a -> bool) -> ’a ntree -> ’a list
  138.    path_pred : (a->bool)-> a' ntree list
  139.    Prende in input un predicato ed una lista di alberi, restituisce un cammino
  140.    dove tutti i nodi non soddisfano il predicato*)
  141. let rec path_non_pred p = function
  142.         | Tr(a,[]) -> if not (p a) then [a] else failwith "Not Found"
  143.         | Tr(a,nlst) -> if not (p a) then a::(path_pred p nlst)
  144.                                                            else failwith "Not Found"
  145. and path_pred p = function
  146.       | [] -> failwith "Not Found"
  147.           | a::rest -> try path_non_pred p a with _ -> path_pred p rest
  148.  
  149. (* listAnd : bool list -> bool
  150.    Prende in input una lista di booleani e calcola il loro
  151.    valore mettendoli tutti in and*)
  152. let rec listAnd = function
  153.         | [] -> true
  154.         | a::rest -> a && listAnd rest
  155.  
  156. (* same_structure: ’a ntree -> ’b ntree -> bool *)
  157. let rec same_structure alb1 alb2 =
  158.         match (alb1, alb2) with
  159.         | (Tr(_,[]),Tr(_,[])) -> true
  160.         | (Tr(_,lst1),Tr(_,lst2)) -> listAnd(try List.map2 same_structure lst1 lst2
  161.                                              with _ -> failwith "Diversa Struttura")
  162.         | _ -> false
  163.  
  164. type col = Rosso | Giallo | Verde | Blu
  165. type 'a col_assoc = (col * 'a list) list      
  166.  
  167. (* colore: ’a -> ’a col_assoc -> col *)
  168. let rec colore num = function
  169.          (Rosso,lst)::rest -> if( List.mem num lst) then Rosso else colore num rest
  170.    | (Giallo,lst)::rest-> if( List.mem num lst) then Giallo else colore num rest
  171.    | (Verde,lst)::rest -> if( List.mem num lst) then Verde else colore num rest
  172.    | (Blu,lst)::rest   -> if( List.mem num lst) then Blu else colore num rest
  173.        
  174. (* ramo_colorato: ’a -> ’a col_assoc -> ’a ntree -> ’a list
  175.    path_clist : col -> a -> a col_assoc -> a ntree list -> a list
  176.    Presi in input un colore, un etichetta, una lista associativa di colori e una lista di alberi
  177.    restituisce il cammino il quale ha nodi adiacenti con colori diversi e come foglia il lo stesso
  178.    valore dell'etichetta, se non esiste tale cammino solleverà un eccezione*)
  179. let rec ramo_colorato x assoc = function
  180.         | Tr(a,[]) -> if a = x then [a] else failwith "Non trovato"
  181.         | Tr(a,lst) -> a::(path_clist (colore a assoc) x assoc lst)
  182. and path_clist color x assoc = function
  183.         | [] -> failwith "Non Trovato"
  184.         | (Tr(a,lst))::rest -> if color <> colore a assoc
  185.                                                         then try ramo_colorato x assoc (Tr(a,lst))
  186.                                                                  with _ -> path_clist color x assoc rest
  187.                                                         else
  188.                                                                  path_clist color x assoc rest
  189.  
  190. let alb = (Tr(1, [Tr(2,[Tr(5,[]);
  191.                         Tr(6,[])]);
  192.                   Tr(3,[Tr(7,[]);
  193.                         Tr(8,[])]);
  194.                   Tr(4,[Tr(9,[]);
  195.                         Tr(10,[])])]))
  196.    
  197. let lst = [(Rosso,[1;2;4;7;10]); (Giallo,[3;8;11]);
  198. (Verde,[0;5;6;13]); (Blu,[9;12;14;15])]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement