Advertisement
Guest User

Untitled

a guest
May 29th, 2014
234
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 9.47 KB | None | 0 0
  1. type Tree<'a> =
  2. | Lf
  3. | Br of 'a * Tree<'a> * Tree<'a>;;
  4.  
  5. let A = Br( (1005,"budi"), Br((1002, "anto"), Br((1001, "tato"),Lf, Lf), Br((1003, "anca"),Lf, Lf)) , Br((1008, "andi"), Br((1006, "ani"),Lf, Lf), Br((1007, "didi"),Lf, Lf)) );;
  6.  
  7. let F = [(1001, 1002); (1001, 1006); (1005, 1007); (1006, 1008)];;
  8. let fsn = (A,F);;
  9.  
  10. (*=========================1.isMember(fsn,id)====================================================*)
  11.  
  12. let rec isMemberHelp = function
  13. | (Lf,F),idN -> false
  14. | ((Br((id,name),anakKiri,anakKanan),F),idN) -> if idN = id then true
  15.                                                 elif idN < id then isMemberHelp((anakKiri,F),idN)
  16.                                                 else isMemberHelp((anakKanan,F),idN);;
  17.                                                
  18. let isMember (fsn,id) = isMemberHelp(fsn,id);;
  19.  
  20. isMember (fsn,1005);;
  21.  
  22.  
  23. (*=========================2.whoIs(fsn,id)====================================================*)
  24.  
  25. let rec whoIsHelp = function
  26. | (Lf,F),idWanted -> raise(System.ArgumentException("Tidak Ada!!"))
  27. | ((Br((id,name),anakKiri,anakKanan),F),idWanted) -> if idWanted = id then name
  28.                                                      elif idWanted < id then whoIsHelp((anakKiri,F),idWanted)
  29.                                                      else whoIsHelp((anakKanan,F),idWanted);;
  30.  
  31. let whoIs (fsn, id) = whoIsHelp(fsn,id);;
  32. whoIs (fsn, 1005);;
  33. (*=========================3.updateName(fsn,id,newName)====================================================*)
  34.  
  35. let rec updateNameHelp = function
  36. | (Lf,F),id, newName -> raise(System.ArgumentException("Tidak Ada!!"))
  37. | ((Br((id,name),anakKiri,anakKanan),F),idChanged, newName) -> if idChanged < id then Br((id,name), updateNameHelp((anakKiri,F),idChanged, newName),anakKanan)
  38.                                                                elif id < idChanged then Br((id,name), anakKiri, updateNameHelp((anakKanan, F), idChanged, newName))
  39.                                                                else Br((id,newName),anakKiri,anakKanan);;
  40.  
  41. let updateName (fsn, id, newName) = updateNameHelp(fsn,id,newName);;
  42. updateName(fsn, 1005, "banu");;
  43.  
  44. (*=========================4.join(fsn,newId,newName)====================================================*)
  45.  
  46. let rec joinHelp = function
  47. | ((Lf, F),newId,newName) -> Br ((newId, newName),Lf,Lf)
  48. | ((Br((id,name),anakKiri,anakKanan),F),newId, newName) -> if newId < id then Br((id,name), joinHelp((anakKiri, F), newId, newName),anakKanan)
  49.                                                            elif (newId > id) then Br ((id,name), anakKiri, joinHelp ((anakKanan,F), newId, newName))
  50.                                                            else raise(System.ArgumentException("Sudah Ada!!"));;
  51. let join (fsn,newId,newName) = joinHelp(fsn,newId,newName);;
  52.  
  53. join (fsn, 1011, "yati");;
  54. (*=========================5.removeAccount(fsn, id)====================================================*)
  55.  
  56. let rec delMin = function
  57.  | Br ((id,name), Lf, anakKanan) -> ((id,name), anakKanan)
  58.  | Br ((id,name), anakKiri, anakKanan) -> let (minEl, new_anakKiri) = delMin anakKiri
  59.                                           (minEl, Br((id,name), new_anakKiri, anakKanan));;
  60.                                            
  61. let rec removeA = function
  62.  | (Lf, idDel) -> Lf
  63.  | (Br ((id,name), anakKiri, anakKanan), idDel) ->
  64.  if (idDel < id) then Br ((id,name), removeA (anakKiri, idDel), anakKanan)
  65.  elif (idDel > id) then Br ((id,name), anakKiri, removeA (anakKanan, idDel))
  66.  else match anakKanan with
  67.  | Lf -> anakKiri
  68.  | _ -> let (minEl, new_anakKanan) = delMin anakKanan (*e = v*)
  69.         Br (minEl, anakKiri, new_anakKanan);;
  70.                                                              
  71. let rec removeF = function
  72. | [],delId -> []
  73. | ((idFollower,idFollowee)::xs),delId -> if delId = idFollower || delId = idFollowee then removeF (xs,delId)
  74.                                          else ((idFollower, idFollowee)) :: removeF (xs,delId);;
  75.  
  76. let rec removeAccount ((A,F),id) = (removeA(A,id),removeF(F, id));;
  77.  
  78. removeAccount (fsn, 1005);;
  79.  
  80. (*=========================6.listOfAccounts(fsn)====================================================*)
  81. let rec listOfAccountsHelper = function
  82. |Lf -> []
  83. |Br((id,name),anakKiri,anakKanan) -> listOfAccountsHelper anakKiri @ [id,name] @ listOfAccountsHelper anakKanan;;
  84.  
  85. let rec listOfAccounts((A,F)) = listOfAccountsHelper(A);;
  86.  
  87. listOfAccounts(fsn);;
  88. A;;
  89. (*=========================7.mergeAccount(fsn1, fsn2)====================================================*)
  90.  
  91. let rec joinHelp = function
  92. |(Lf, newId, newName) -> Br((newId,newName), Lf, Lf)
  93. |(Br ((id,name), anakKiri, anakKanan), newId, newName) ->
  94.   if (newId<id) then Br ((id,name), joinHelp(anakKiri, newId, newName), anakKanan)
  95.   elif (newId>id) then Br ((id,name), anakKiri, joinHelp(anakKanan, newId, newName))
  96.   else Br((id,name),anakKiri,anakKanan);;
  97.  
  98. let rec listOfAccountsHelp = function
  99. |(Lf,vs) -> vs
  100. |(Br(v,anakKiri,anakKanan),vs) -> listOfAccountsHelp (anakKiri,v::listOfAccountsHelp(anakKanan,vs));;
  101.  
  102. let listOfAccount(A) = listOfAccountsHelp(A,[]);;
  103.  
  104. let joinAccount(fsn2) = listOfAccount(fsn2);;
  105.  
  106. let rec joinTree = function
  107. |([],tree)-> tree
  108. |((newId,newName)::sisaList,tree) -> (joinTree(sisaList,joinHelp(tree,newId,newName)));;
  109.  
  110. let rec isExists = function
  111. |((idFollower,idFollowee),[]) -> true
  112. |((idFollower,idFollowee),((idFollower2,idFollowee2)::xs)) ->
  113.   if(idFollower=idFollower2 && idFollowee=idFollowee2) then true
  114.   else isExists((idFollower,idFollowee),xs);;
  115.  
  116. let rec joinList = function
  117. |([],y) -> y
  118. |((idFollower,idFollowee)::xs,y) ->
  119.   if(isExists((idFollower,idFollowee),y)) then joinList(xs,y)
  120.   else (idFollower,idFollowee)::y;;
  121.  
  122. let rec mergeAccount((A,F),(A2,F2)) = ((joinTree(joinAccount(A2),A)),(joinList(F2,F)));;
  123.  
  124. let fsn1 = (A,F);
  125.  
  126. let A2 = Br((5,"budi"), Br((2, "anto"), Br((1, "tato"), Lf, Lf), Br((3, "anca"), Lf, Lf)),
  127.                           Br((8, "andi"), Br((6, "ani"), Lf, Lf), Br((7, "didi"), Lf, Lf)));;
  128. let F2 = [(1,2);(1,6);(5,7);(6,8)];;
  129. let fsn2 = (A2,F2);
  130.  
  131. mergeAccount(fsn1,fsn2);;
  132. (*=============================================================================================================*)
  133.  
  134. let rec map f = function
  135. |[] -> []
  136. |x::xs -> (f x) :: map f xs;;
  137.  
  138. let rec foldl f = function
  139. |(e,[]) -> e
  140. |(e,x::xs) -> foldl f (f(e,x),xs);;
  141.  
  142. let rec foldr f = function
  143. |([],e) -> e
  144. |(x::xs,e) -> f(x, foldr f (xs,e));;
  145.  
  146. let rec maptree f = function
  147. |Lf -> Lf
  148. |(Br (v,t1,t2)) ->
  149.      Br (f v, maptree f t1, maptree f t2);;
  150.  
  151. let rec fold f e = function
  152. |Lf -> e
  153. |(Br (v,t1,t2)) ->
  154.       f (v, fold f e t1, fold f e t2);;
  155.  
  156. (*=========================1.reverseRelation(fsn)====================================================*)
  157. let getF(A,F)=F;;
  158.  
  159. let reverseRelation x = foldr (fun ((x,y),e) -> (y,x)::e) (getF(x),[]);;
  160.  
  161. reverseRelation fsn;;
  162. (*=========================2.checkFollowerId(fsn)====================================================*)
  163. let getF(A,F)=F;;
  164.  
  165. let checkFollowerId x = foldr (fun ((x,y),e) -> if x<y then 1::e else 0::e) (getF(x),[]);;
  166.  
  167. checkFollowerId fsn;;
  168. (*=========================3.getTotalFollowers(fsn, id)====================================================*)
  169. let getF(A,F)=F;;
  170.  
  171. let getTotalFollowers (x,y) = foldr (fun ((a,b),e) -> if y = b then e+1 else e) (getF(x),0);;
  172.  
  173. getTotalFollowers (fsn,1002);;
  174. (*=========================4.getTotalFollowees(fsn, id)====================================================*)
  175. let getF(A,F)=F;;
  176.  
  177. let getTotalFollowees (x,y) = foldr (fun ((a,b),e) -> if y = a then e+1 else e) (getF(x),0);;
  178.  
  179. getTotalFollowees (fsn,1001);;
  180. (*=========================5.listOfFollowers(fsn, id) ====================================================*)
  181. let fsn= (A,F);;
  182. let getF(A,F)=F;;
  183.  
  184. let rec whoIs = function
  185. |((Lf,F),idWanted) -> raise(System.ArgumentException("Id tidak ada"))
  186. |((Br((id,name),t1,t2),F),idWanted) ->
  187.     if (idWanted<id) then whoIs ((t1,F), idWanted)
  188.     elif (idWanted>id) then whoIs ((t2,F),idWanted)
  189.     else name;;
  190.  
  191. let listOfFollowers (x,y) = foldr (fun ((a,b),e) -> if y = b then whoIs(x,a)::e else e) (getF(x),[]);;
  192.  
  193. listOfFollowers (fsn,1005);;
  194. (*=========================6.listOfFollowees(fsn, id)====================================================*)
  195. let getF(A,F)=F;;
  196.  
  197. let rec whoIs = function
  198. |((Lf,F),idWanted) -> raise(System.ArgumentException("Id tidak ada"))
  199. |((Br((id,name),anakKiri,anakKanan),F),idWanted) ->
  200.     if (idWanted<id) then whoIs ((anakKiri,F), idWanted)
  201.     elif (idWanted>id) then whoIs ((anakKanan,F),idWanted)
  202.     else name;;
  203.  
  204. let listOfFollowees (x,y) = foldr (fun ((a,b),e) -> if y = a then whoIs(x,b)::e else e) (getF(x),[]);;
  205. whoIs(fsn,1005);;
  206. listOfFollowees (fsn,1005);;
  207. (*=========================7.checkMutualRelation(fsn, id1, id2)====================================================*)
  208. let getF(A,F)=F;;
  209.  
  210. let checkMutualRelation1(x,y,z) = foldr (fun ((a,b),e) -> if a=y && b=z then true else e) (getF(x),false);
  211. let checkMutualRelation2(x,y,z) = foldr (fun ((a,b),e) -> if a=z && b=y then true else e) (getF(x),false);
  212.  
  213. let checkMutualRelation(fsn,id1,id2)=checkMutualRelation1(fsn,id1,id2) && checkMutualRelation2(fsn,id1,id2);;
  214.  
  215. checkMutualRelation(fsn,1001,1002);;
  216. (*=========================8.listOfIds(fsn)====================================================*)
  217. let rec maptree f = function
  218. |Lf -> Lf
  219. |(Br (v,t1,t2)) ->
  220.      Br (f v, maptree f t1, maptree f t2);;
  221.  
  222. let getA(A,F)=A;;
  223.  
  224. let listOfIds x = maptree (fun (id,nama) -> id) (getA(x));;
  225.  
  226. listOfIds fsn;;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement