Advertisement
Guest User

Untitled

a guest
Mar 25th, 2017
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 9.09 KB | None | 0 0
  1. let map przetwarzacz lista=
  2.     match with lista
  3.      | []->[]
  4.      | hd::tl->przetwarzacz
  5. let rec fold_right (operator : 'b'->"a"->'b')(zarodek: "b")(lista : "a list") =
  6.     match with lista
  7.      | []->zarodek
  8.      | hd::tl ->  fold_right (operator)(operator(zarodek,hd))(tl)
  9.  
  10. let rec fold_left (operator : 'b'->"a"->'b')(zarodek: "b")(lista : "a list") =
  11.     match with lista
  12.      | []->zarodek
  13.      | hd::tl -> operator (fold_left operator zarodek tl)hd
  14.  
  15. let odwroc_liste lista =
  16.     fold_right (fun acc el -> el::acc) [] lista
  17.    
  18. module type STOS = sig
  19.     type 'a kolejka;;
  20.     val dodaj : 'a kolejka -> 'a ->
  21. (* PRZYKLADY *)
  22.  
  23. let mnoz a b = a * b;;
  24. let dwanascie = mnoz 4 3;;
  25. (*robimy z infixowego operatora * funkcje *)
  26. let mnoz2 a b = ( * ) a b;;
  27. (* funckje sa dobrymi obiektami - mozna je zwracac, przypisywac itp. *)
  28. let mnoz3 = ( * ) ;;
  29. let mnoz4 a = ( * ) a;;
  30. (* wszystkie mnoz robią dokładnie to samo *)
  31.  
  32.  
  33. (* dane dwe liczby jako para, nie jako dwa argumenty *)
  34. let mnoz4 (a,  b) = a * b;;
  35.  
  36. (* mozna opisac typ argumentow *)
  37. let zloz (f : int -> bool) (g : char -> int) (x : char) = f (g x);;
  38. (* ale mozna tez nie opiswyac i wyjdzie funkcja ogolniejsza *)
  39. let zloz2 f g x = f (g x);;
  40. (* i jeszcze wersja bardziej czytlena lecz calkowicie identyczna z powyzsza *)
  41. let zloz3 f g = (fun x -> f (g x));;
  42. (* mozna pominac nawias i samemu napisac ogolny typ *)
  43. let zloz3 : 'a 'b 'c. ('b -> 'c) -> ('a -> 'b) -> ('a -> 'c) = fun  f g -> fun x -> f (g x);;
  44.  
  45. (*przyklad uzycia *)
  46. let mnozPrzezTrzy n = 3*n;;
  47. let dodawajJeden n = n+1;;
  48. let trzPlusJeden n = zloz2 dodawajJeden mnozPrzezTrzy n;;
  49. (* powyzsze nie zdziala ze zloz (zamiast zloz2) bo zloz na zly typ *)
  50.  
  51. (* tak dzialaja bool-e i if-y *)
  52. let wiekszaNizZero n = (n > 0);;
  53. let negacja (b : bool) =
  54.   if b then
  55.     false
  56.   else
  57.     true;;
  58.  
  59. (* funkcja rekurencyjna - liczby filbonacciego w czasie wykladniczym *)
  60. (* zwrc uwage na slowko rec *)
  61. let rec fib n =
  62.   if n = 0 then 0 else
  63.   if n = 1 then 1 else
  64.    fib (n-1) + fib (n-2);;
  65. (* zwroc uwage ze fib n-1 t oznaczalby (fib n)-1. *)
  66. (* Funkcja na poczatku wyrazenia lyka argument jak leci - np. *)
  67. (* mnozPrzezTrzy mnozPrzezTrzy 7 - sie nie otypuje bo pierwsze mnozPrzezTrzy wezmie drugie mnozPrzezTrzy za argument i nie zgodzi sie typ *)
  68. (* trzeba pisac: *)
  69. let dziwiec = mnozPrzezTrzy (mnozPrzezTrzy 1);;
  70.  
  71. (* mozna etykietwac rozne rzecy w srodku funckucji przez konstrukcje let a = ... in ... *)
  72. (* mozna w ten sposob tworzyc funkcje pomocnicze *)
  73. let mnozymyPrzezSidem n =
  74.   let razyN t = t * n in
  75.   let siedem = 7 in
  76.   razyN siedem;;
  77.  
  78.  
  79.  
  80. (* ZADANIA *)
  81. (* Napisz funckje ktora: *)
  82.  
  83.  
  84. (* liczby liczby filbonacciego w czasie liniowym *)
  85. let fib (n : int) =
  86.   raise (Failure "foo");;
  87.  
  88. (* liczy maksymalna potege dwojki ktora dzili daną liczbę *)
  89. let maksPotegaDwojki n =
  90.   raise (Failure "foo");;
  91. (* assert (maksPotegaDwojki 12 == 2) *)
  92.  
  93. (* poteguje binarnie modulo p *)
  94. let poteguj a b p =
  95.  raise (Failure "foo");;
  96. (* assert (poteguj 2 3 3 == 2);; *)
  97.  
  98.  
  99.  
  100. (* odwraca zapis dziesietny danej liczby *)
  101. let odrocZapis (n : int) =
  102.   raise (Failure "foo");;
  103. (* assert (odwrocZapis 1234 = 4321);; *)
  104.  
  105.  
  106.  
  107. (* dopiosuje jedynke na poczatku zapisu dziesitnego danej liczby *)
  108. let dopiszJedne (n : int) =
  109.   raise (Failure "foo");;
  110. (* assert (dopiszJeden 45 == 145);; *)
  111.  
  112.  
  113.  
  114. (* LISTY *)
  115. let l1 : int list = [1;24;3;7;8];;
  116. let l2 : int list = 3::2::[];;
  117. assert (l2 = [3;2]);;
  118. let ogonekListy : 'a list = [];;
  119.  
  120. (*lista list *)
  121. let l3 : int list list = [7;3;45]::[3;4]::[1;2]::[];;
  122.  
  123. (* aby uzyc list nalezy korzystac z konstrukcji match *)
  124.  
  125. let czyPusta l =
  126.   match l with
  127.   | [] -> "pusta"
  128.   | glowa::ogon -> "nie pusta lsita o glowie"^(string_of_int glowa)
  129.   | _ -> "to nigdy nie zajdzie bo przypadki sa sprawdzane z gory na dol - i kompilator slusznie pluje warningiem" (* podkreslnik zawsze lapie - oznacza on dowolny przypadek *)
  130. ;;
  131.  
  132. (* ZADANIA 2 *)
  133.  
  134.  
  135. (* dostrales liste liczb. Policz ich sume *)
  136. let sumuj lista =
  137. raise (Failure "foo");;
  138. (* assert (sumuj [1;2;3;4] = 10) *)
  139.  
  140. (* odwroc liste *)
  141. let odwroc lista =
  142.   raise (Failure "foo");;
  143. (* assert (odroc [1;2;3;4] = [4;3;2;1]) *)
  144.  
  145. (* dostales dwie listy, przetasuj je za soba. Jesli jedna z nich podczas tasowanie sie skonczyla to wchodza kolejne elemntu drugiej *)
  146. let tasuj l k =
  147.   raise (Failure "foo");;
  148. (* assert (tasuj [12;13;14;15;16] [23;24] = [12;23;13;24;14;15;16] *)
  149.  
  150. (* sklej diwe listy. Czas dzialanie ma byc proporcjonalny do dlugosci pierwszej listy *)
  151. let sklej l1 l2 =
  152. raise (Failure "foo");;
  153. (* assert (sklej [1;2;3;4] [7;8;9] = [1;2;3;4;7;8;9]) *)
  154.  
  155. (* dana jest lista list. Sklej kolejne elementy ze sobą *)
  156. (* Czy Twoj czas dzialania zalezy od dlugosci ostatniego elementu ?*)
  157. let rozpakuj l =
  158. raise (Failure "foo");;
  159. (* assert (rozpakuj [[2;3];[4;5];[];[4;5;5;5;5;5]] = [2;3;4;5;4;5;5;5;5;5] ) *)
  160.  
  161.  
  162. (* napisz funkcje ktra wyfiltruje z listy elementy spelniajace dany warunek *)
  163. let filtruj (type a) (warunek : a -> bool) (lista : a list) =
  164. raise (Failure "foo");;
  165. (* assert ( filtruj (fun x -> (x mod 2) = 0) [1;2;3;4;5;6] = [2;4;6] ) *)
  166.  
  167.  
  168. (* FUNKCJE WYŻSZYCH RZEDOW - ZADANIA *)
  169.  
  170. (* dostajesz przetwarzacz - funkcje f typu a' -> 'b - oraz liste elementow typu 'a. *)
  171. (* twoim zadaniem jest zastosowac ptrzetwarzacz do wszystkich elementow na liscie i wyniki posklejac w liste *)
  172. let map przetwarzacz lista =
  173. raise (Failure "foo");;
  174. (* assert ( przetwarzacz (fun x -> 2*x) [1;2;3] = [2;4;6] ) *)
  175.  
  176. (* zaimplementuj fold_left, fold_right. Który da się zrobić ogonowo? *)
  177.  
  178.  
  179.  
  180. (* ZABAWY Z TYPOWANIEM *)
  181.  
  182. (* zwykle typowanie polimorficzne *)
  183. let idi : 'a. 'a -> 'a = fun x -> x;;
  184. (* psuedo-jawny polimorfizm - czasami jest uzyteczny by opisac skomplikowany typ*)
  185. let idi (type a) : a -> a = fun x -> x;;
  186.  
  187. let f0 = fun (id : 'a -> 'a) x -> id x;;
  188. let d = f0 idi;;
  189.  
  190. let f1 : 'a. ('a -> 'a) -> int -> int = fun id x -> x;;
  191. let f2 id (x : int) = x;;
  192.  
  193. open List;;
  194.  
  195. (* Zadanie 0: przy pomocy fold-a:
  196.  - policzyć długość listy
  197.  - odrócić listę *)
  198.  
  199. (* 'a option jest z biblioteki standardowej i działa tak:
  200. type 'a option = None | Some of 'a *)
  201.  
  202.  
  203. (*tak dziłają moduły w Ocaml-u *)
  204. module type STOS = sig
  205.   type 'a stos;;
  206.   val dodaj : 'a stos -> 'a -> 'a stos
  207.   val zdejmij : 'a stos -> 'a option * 'a stos
  208.   val pusty : 'a stos
  209. end;;
  210.  
  211. module Stos : STOS = struct
  212.   type 'a stos = 'a list;;
  213.  
  214.   let dodaj stos element =
  215.     element::stos;;
  216.    
  217.   let zdejmij stos =
  218.     match stos with
  219.     | [] -> (None, [])
  220.     | hd::tl -> (Some hd, tl);;
  221.    
  222.   let pusty = [];;
  223. end
  224.  
  225. let stosik = Stos.pusty;;
  226. let stosik = Stos.dodaj stosik 5;;
  227. let stosik = Stos.dodaj stosik 3;;
  228. let (Some a, stosik) = Stos.zdejmij stosik;;
  229.  
  230.  
  231. (* ZADANIE 1 - implementujemy kolejke*)
  232.  
  233.  
  234. module type STOS = sig
  235.   type 'a kolejka;;
  236.   val dodaj : 'a kolejka -> 'a -> 'a kolejka
  237.   val zdejmij : 'a kolejka -> 'a option * 'a kolejka
  238.   val pusty : 'a kolejka
  239. end;;
  240.  
  241. module Kolejka : Kolejka = struct
  242.   type 'a kolejka = 'a list * 'a list
  243.  
  244.   let dodaj stos element =
  245.     raise (Failure "foo")
  246.  
  247.   let zdejmij (lewa,prawa)=
  248.     let(nlewa,nprawa) as kolejka=
  249.     match nprawa with
  250.     | [] -> ([],rev lewa)
  251.     | - ->(lewa,prawa)
  252.     in
  253.     match nprawa with
  254.     | [] -> (None,([],[]))
  255.     | hd::tl ->(Some hd,(nlewa,tl))
  256.  
  257.   let pusty = ([], []);;
  258. end
  259.  
  260.  
  261. (* ZADANIE 3 implementujemy kolejke dwustronną *)
  262.  
  263. (* Zadania o drzewach *)
  264.  
  265. type 'a tree =
  266.  | Nil
  267.  | Node of 'a tree* 'a * 'a tree;;
  268.  
  269. let m = Node(Nil,4,Nil);;
  270. let m2 = Node (m,4,Nil);;
  271. let p = Node(Nil, 2, Nil);;
  272. let cale= Node(m2,8,p);;
  273.  
  274. let mapuj_drzewo operator drzewo=
  275.     match drzewo with
  276.      | Nil -> Nil
  277.      | Node(lewe,wezel,prawe)=Node(mapuj_drzewo operator lewe,wezel*2,mapuj_drzewo operator prawe)
  278. let rec fold_tree (operator:'b'->'b'->'a'->'b')(zarodek:'b')(tree: "a list")
  279.     match lista with
  280.      | Nil -> zarodek
  281.      | Node(lewe,wezel,prawe)->
  282.         let fo=fold_tree operator zarodek in
  283.         operator (fo lewe)(fo prawe) wezel;;
  284.  
  285. let dfs_wolny drzewo=
  286.     fold_tree (fun lewe prawe wezel-> lewe@[wezel]@prawe)
  287. let rec DFSfromTree(operator:'b list'->'b list'->'a'->'b list')(zarodek: "b list")(tree?? )
  288.     match tree with
  289.      | Nil -> zarodek
  290.      | Node(lewe,wezel,prawe)->
  291.         let l1 =wezel::(dfs2 prawe lista) in
  292.         dfs2 lewa l1
  293. let dfs drzewo=
  294.     let rec loop
  295.    
  296. let najwieksze_fold drzewo=
  297.     fold_tree(fun lewo prawo wezel ->max (max lewe prawe) wezel)
  298.  
  299. type 'a sklejLista = ' a list -> 'a list;; 
  300. let sklej dziwlista1 dziwlista2 =
  301.     (fun ogon-> dziwlista1(dziwlista2 ogon));;
  302.    
  303. let iloscNieDominowanych drzewo =
  304.     let rec loop drzewo
  305. (* Wprowadzenie do drzew: typ, fold, przyklady *)
  306.  
  307. (* 4: wylistuj obiekty w drzewie w kolejności DFS *)
  308. (* 5: ilosc takich liczb, ze na sciezce do korzenia sa same mniejsze *)
  309. (* 6: wylistuj obiekty w drzewie w kolejnosc BFS *)
  310. (* 7: zaimplementuj BST. wspólnie ustalamy sygnaturę *)
  311. (* 8: utkaj z drzewa siatkę z kwadratów *)
  312.  
  313.  
  314. (* Zadania off-topic, ale za to fajne:
  315.   - podać dwa obiekty różnych typów, że są równe:
  316. let (a : ??) = ??;;
  317. let (b : ??) = ??;;
  318. let c = (a=b);; *)
  319.  
  320.  
  321. (* Rzeczy na jutro:
  322. - drzewo przedziałowe
  323. - fixpoint combinator
  324. - koguty i logika (Coq and logic) *)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement