Advertisement
Guest User

Untitled

a guest
Nov 23rd, 2014
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 3.15 KB | None | 0 0
  1. type obj = Miss | Cann | Barca;;
  2. type situazione = obj list * obj list;;
  3. type azione= From_left of obj list|From_right of obj list;;
  4.  
  5. (* numeroObj: obj list -> int*int
  6.    aux: int*int -> obj list -> int*int
  7.    aux mette nel primo elemento il numero di Cannibali che trova nella lista
  8.        nel secondo elemento il numero di Missionari che trova *)
  9.  
  10. let numeroObj riva=
  11.     let rec aux (cann,miss)= function
  12.         |[]-> (cann,miss)
  13.         |Cann::rest -> aux ((cann+1),miss) rest
  14.         |Miss::rest -> aux (cann,(miss+1)) rest
  15.         |Barca::rest -> aux (cann,miss) rest
  16.     in aux (0,0) riva;;
  17.              
  18. (* obj list * obj list -> bool
  19.    confronta il numero di cannibali e missionari delle due rive
  20.    ritorna true se in entrambi il numero dei cannibali è uguale o minore dei
  21.    missionari *)
  22.  
  23. let safe situazione = match situazione with
  24.         (x,y) -> let (c1,m1) = numeroObj x
  25.              in let (c2,m2) = numeroObj y
  26.              in if (m1>0)&&(m2>0) then ((c1<= m1)&&(c2<= m2))
  27.                     else if m2>0 then (c2<=m2)
  28.                  else if m1>0 then (c1<=m1)
  29.                       else true
  30.  
  31. exception SpostamentoNonPossibile;;
  32.  
  33. let sel1 (x,_) = x;;
  34. let sel2 (_,y) = y;;
  35.  
  36. (* remove: 'a -> 'a list -> 'a list *)
  37. let rec remove a = function
  38.         [] -> raise SpostamentoNonPossibile
  39.         |x::rest -> if x = a then rest
  40.                     else x::(remove a rest)
  41.  
  42. (* rimuoviLista: obj list -> obj list -> obj list
  43.    rimove dalla lista data gli elementi della seconda lista
  44.    e la barca che serve allo spostamento *)
  45. let rec rimuoviLista l= function
  46.     x::rest -> rimuoviLista (remove x l) rest
  47.     |[]-> (remove Barca l);;
  48.  
  49. (* aggiungi: obj list -> int*int -> obj list
  50.    aggiunge alla lista data gli elementi associati alla coppia Cannibali, Missionari
  51.    più la barca utile allo spostamento *)
  52.  
  53. let rec aggiungi l x = match x with            
  54.             (0,0) -> Barca::l
  55.             |(0,n) -> aggiungi (Miss::l) (0,(n-1))
  56.             |(m,0) -> aggiungi (Cann::l) ((m-1), 0)
  57.             |(m,n) -> aggiungi (Miss::Cann::l) ((m-1),(n-1));;
  58.  
  59.                    
  60. (* spostamento: obj list * obj list -> obj list -> int -> obj list * obj list
  61.    l'intero mi identifica da quale riva parto, crea la nuova situazione
  62.    rimuovendo dalla riva di partenza gli elemeneti dati, aggiungendoli all'altra riva *)
  63.  
  64. let spostamento situazione l x= if x=1 then (rimuoviLista (sel1 situazione) l, aggiungi (sel2 situazione) (numeroObj l))
  65.                 else ( aggiungi (sel1 situazione) (numeroObj l) , rimuoviLista (sel2 situazione) l );;
  66.                          
  67. (* applica: obj list * obj list -> azione -> obj list * obj list
  68.    applica gli spostamenti identificati dalla lista di azione
  69.    lo spostamento non avviene se la situazione che si va a creare non è sicura
  70.    o se lo spostamento non è possibile per mancanza di oggetti *)
  71.  
  72. let applica situazione azione= match azione with
  73.     From_left x -> let coso = spostamento situazione x 1 in
  74.                   if not(List.mem Barca (sel1 situazione)) || not(safe(coso)) then raise SpostamentoNonPossibile
  75.                        else coso
  76.        
  77.  
  78.     | From_right y -> let coso= spostamento situazione y 2 in
  79.                   if not(List.mem Barca (sel2 situazione)) || not(safe(coso)) then raise SpostamentoNonPossibile
  80.                        else coso;;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement