Advertisement
Guest User

Untitled

a guest
Oct 17th, 2017
371
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.05 KB | None | 0 0
  1. (**************************************************************************
  2. * *
  3. * File: Program.fs *
  4. * Copyright: (c) 2016, Florin Leon *
  5. * E-mail: florin.leon@tuiasi.ro *
  6. * Website: http://florinleon.byethost24.com/lab_ia.htm *
  7. * Description: Records. Function Composition *
  8. * (Artificial Intelligence lab 4) *
  9. * *
  10. **************************************************************************)
  11. open System
  12.  
  13. module Program1 =
  14.  
  15. let lastButTwo1 (list : 'a list) =
  16. // cu |>
  17. list |> List.rev |> List.tail |> List.tail |> List.head
  18.  
  19. let lastButTwo2 =
  20. // cu >>
  21. let revlist list = List.rev list
  22. revlist >> List.tail >> List.tail >> List.head
  23.  
  24. let mainP1() =
  25. let list = [ 1..10 ]
  26. printfn "Antepenultimul element: %A" (lastButTwo1 list)
  27. printfn "Antepenultimul element: %A" (lastButTwo2 list)
  28.  
  29.  
  30.  
  31. module Program2 =
  32.  
  33. // let selection i (x:float) =
  34. // if i = 1 then
  35. // x * 0.9
  36. // elif i = 2 then
  37. // x * 0.8
  38.  
  39. let discountedSum (list: float list) =
  40. // daca lista are mai putin de 3 elemente, se face suma simpla
  41. // altfel: se sorteaza descrescator lista
  42. // se face o transformare a listei, in care al doilea element este inmultit cu 0.9, al treilea cu 0.8, iar celelalte raman neschimbate
  43. // se sumeaza elementele
  44.  
  45. if list.Length < 3 then
  46. List.sum list
  47. else
  48. list |> List.sortBy(fun x -> -x) |> List.mapi(fun i x -> if i = 1 then x * 0.9 elif i = 2 then x * 0.8 else x) |> List.sum
  49.  
  50.  
  51. let mainP2() =
  52. let list = [ 20.0; 10.0; 30.0 ]
  53. printfn "Preturile articolelor fara reduceri: %A" list
  54. printfn "Suma fara reduceri: %.2f" (List.sum list)
  55. printfn "Suma finala: %.2f\n" (discountedSum list)
  56.  
  57. let list = [ 10.0; 20.0 ]
  58. printfn "Preturile articolelor fara reduceri: %A" list
  59. printfn "Suma fara reduceri: %.2f" (List.sum list)
  60. printfn "Suma finala: %.2f\n" (discountedSum list)
  61.  
  62.  
  63.  
  64. module Program3 =
  65.  
  66. open System
  67. open System.IO
  68.  
  69. let list =
  70. let lineToTuple (line : string) =
  71. let toks = line.Split(", ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
  72. (toks.[0], toks.[1], toks.[2])
  73. File.ReadAllLines "kinship.csv"
  74. |> List.ofSeq
  75. |> List.map lineToTuple
  76.  
  77. let findParents1() =
  78. let mothers = List.filter (fun (a, _, _) -> a = "mother") list
  79. let fathers = List.filter (fun (a, _, _) -> a = "father") list
  80. [
  81. for (_, m, c1) in mothers do
  82. for (_, f, c2) in fathers do
  83. if c1 = c2 then
  84. yield (m, f, c1)
  85. ]
  86.  
  87. let findParents2() =
  88. // se filtreaza lista, ramanand numai elementele cu relatiile "mother" sau "father"
  89. // se transforma aceasta lista intr-o lista de copii
  90. // se elimina duplicatele: Seq.distinct |> List.ofSeq
  91. // se transforma lista copiilor intr-o lista de tuple de forma ((getParent c "mother") , (getParent c "father"), c)
  92. // functia getParent trebuie implementata, folosind functia List.find
  93. // orice alta abordare functionala este binevenita
  94.  
  95. let getparent child parent =
  96. let (_, b, _) = List.find(fun (a, _, c) -> a = parent && c = child) list
  97. b
  98.  
  99. let mothers = List.filter (fun (a, _, _) -> a = "mother") list
  100. let fathers = List.filter (fun (a, _, _) -> a = "father") list
  101.  
  102. let copii = (List.map( fun (_,_,c) -> c ) mothers) @ (List.map( fun (_,_,c) -> c ) fathers) |> Seq.distinct |> List.ofSeq
  103. List.map(fun c -> (getparent c "mother", getparent c "father", c)) copii
  104.  
  105.  
  106. let printParents parents =
  107. List.iteri (fun i (m, f, c) -> printfn "%d. mama %s / tata %s / copilul %s" (i + 1) m f c) parents
  108.  
  109. let mainP3() =
  110. printfn "Metoda imperativa\n"
  111. findParents1() |> printParents
  112.  
  113. printfn "\nMetoda functionala\n"
  114. findParents2() |> printParents
  115.  
  116. // ====================================================================
  117.  
  118. //module Program4 =
  119. //
  120. // type Person = { Name : string; Children : string list }
  121. //
  122. // let parents =
  123. // let vlad = { Name = "Vlad"; Children = ["Oana"; "Mircea"] }
  124. // let maria = { Name = "Maria"; Children = ["Dan"] }
  125. // let nelu = { Name = "Nelu"; Children = ["Paul"; "Radu"; "Sorin"] }
  126. // let liviu = { Name = "Liviu"; Children = ["Vlad"; "Maria"; "Nelu"] }
  127. // [ liviu; vlad; maria; nelu ]
  128. //
  129. // let persons =
  130. // parents
  131. // |> List.fold (fun acc parent -> List.concat [parent.Name :: acc; parent.Children]) []
  132. // |> Seq.distinct |> List.ofSeq
  133. //
  134. // let isParent possibleParent child =
  135. // // se foloseste functia List.exists si lista parents
  136. //
  137. // let isCousin c1 c2 =
  138. // // se incearca gasirea parintilor lui c1 si c2, de exemplu filtrand lista persons => p1, p2
  139. // // daca c1 sau c2 nu au parinti in lista, sau au acelasi parinte, atunci nu sunt veri
  140. // // daca p1 si p2 au acelasi parinte, atunci c1 si c2 sunt veri
  141. //
  142. // let findCousins q =
  143. // // se filtreaza lista persons dupa predicatul isCousin
  144. // // orice alta abordare functionala este binevenita
  145. //
  146. // let mainP4() =
  147. // let query = "Sorin"
  148. // printf "Verii lui %s sunt: " query
  149. // let result = findCousins query
  150. // printfn "%A" result
  151.  
  152. // ====================================================================
  153.  
  154. [<EntryPoint>]
  155. let main argv =
  156. // Program1.mainP1()
  157. // Program2.mainP2()
  158. // Program3.mainP3()
  159. Program3.mainP3()
  160. Console.Read()
  161. 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement