Advertisement
PearlyXD

Untitled

Nov 17th, 2020
3,439
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 7.16 KB | None | 0 0
  1. (*autor: Wiktor Chmielewski grupa 5*)
  2. (*review: Daniel Mastalerz grupa 5*)
  3. open Float;;
  4. (*W rozwiązaniu zadania będziemy korzystać z faktu, że każdy z naszych modyfikatorów zmienia dany przedział na inny przedział*)
  5. (*lub też jego dopełnienie, tj. zbiór R-przedział*)
  6. type wartosc = Przedzial of (float*float) | Dopelnienie of (float*float) | Pusty;;
  7.  
  8. (*Funkcje pomocniczne*)
  9. let min x y =
  10.   match (x,y) with
  11.   | (a,_) when a=neg_infinity -> neg_infinity
  12.   | (_,a) when a=neg_infinity -> neg_infinity
  13.   | (_,_) -> if x<y then x else y
  14. ;;
  15.  
  16. let max x y =
  17.   match (x,y) with
  18.   | (a,_) when a=infinity -> infinity
  19.   | (_,a) when a=infinity -> infinity
  20.   | (_,_) -> if x>y then x else y
  21. ;;
  22.  
  23. (*Zwraca zbiór elementów e, takich ze e nalezy do x i e nalezy do y*)
  24. (*Korzystając z naszej pierwszej obserwacji, nie musimy rozważać przypadku, w którym otrzymamy sumę więcej niż dwóch rozłącznych przedziałów*)
  25. let rec suma x y =
  26.   match (x,y) with
  27.   | (Przedzial (a,b), Przedzial (c,d)) ->
  28.     if (b>d) then suma (Przedzial(c,d)) (Przedzial(a,b))
  29.     else if (b>=c) then
  30.       if (a<=c) then (Przedzial (a,d))
  31.       else (Przedzial (c,d))
  32.     else (Dopelnienie(b,c))
  33.   | (Przedzial(a,b), Dopelnienie(c,d)) ->
  34.     if (a<=c)&&(b>=d) then Przedzial (neg_infinity, infinity)
  35.     else if (a<=c) then Dopelnienie (b,d)
  36.     else if (b>=d) then Dopelnienie (a,c)
  37.     else Dopelnienie (c,d)
  38.   | (Dopelnienie(a,b), Przedzial(c,d)) -> (suma (Przedzial(c,d)) (Dopelnienie(a,b)))
  39.   | (Dopelnienie(a,b), Dopelnienie(c,d)) ->
  40.     if (c>=b)||(d<=a) then Przedzial(neg_infinity,infinity)
  41.     else if (a>c)&&(b<d) then Dopelnienie(a,b)
  42.     else if (a>c) then Dopelnienie(a,d)
  43.     else if (b<d) then Dopelnienie(c,b)
  44.     else Dopelnienie(c,d)
  45.   | (_,_) -> Pusty
  46. ;;
  47.  
  48. (*Konstruktory*)
  49. let wartosc_dokladnosc x p =
  50.   if x>=0. then Przedzial ((x *. (1. -. (p /. 100.))),(x *. (1. +. (p /. 100.))))
  51.   else Przedzial ((x *. (1. +. (p /. 100.))),(x *. (1. -. (p /. 100.))))
  52. ;;
  53.  
  54. let wartosc_od_do x y =
  55.   if x<=y then Przedzial (x,y)
  56.   else Przedzial (y,x)
  57. ;;
  58.  
  59. let wartosc_dokladna x =
  60.   Przedzial (x,x)
  61. ;;
  62.  
  63. (*Selektory*)
  64. let in_wartosc w x =
  65.   match w with
  66.   | Przedzial (a,b) -> (a<=x && x<=b)
  67.   | Dopelnienie (a,b) -> (x<=a || b<=x)
  68.   | Pusty -> false
  69. ;;
  70.  
  71. let min_wartosc x =
  72.   match x with
  73.   | Przedzial (a,_) when a=neg_infinity -> neg_infinity
  74.   | Przedzial (_,a) when a=neg_infinity -> neg_infinity
  75.   | Przedzial (a,b) -> a
  76.   | Dopelnienie (_,_) -> neg_infinity
  77.   | Pusty -> nan
  78. ;;
  79.  
  80. let max_wartosc x =
  81.   match x with
  82.   | Przedzial (a,_) when a=infinity -> infinity
  83.   | Przedzial (_,a) when a=infinity -> infinity
  84.   | Przedzial (a,b) -> b
  85.   | Dopelnienie (_,_) -> infinity
  86.   | Pusty -> nan
  87. ;;
  88.  
  89. let sr_wartosc x =
  90.   match x with
  91.   | Przedzial (a,b) -> ((a +. b) /. 2.)
  92.   | Dopelnienie (_,_) -> nan
  93.   | Pusty -> nan
  94. ;;
  95.  
  96. (*Modyfikatory*)
  97. let rec plus x y =
  98.   match (x,y) with
  99.   | ((Przedzial(a,b)),(Przedzial(c,d))) -> Przedzial(a +. c, b +. d)
  100.   | ((Przedzial(a,b)),(Dopelnienie(c,d))) ->
  101.     if (b +. c)>=(a +. d) then Przedzial(neg_infinity, infinity)
  102.     else Dopelnienie(b +. c, a +. d)
  103.   | ((Dopelnienie(a,b)),(Przedzial(c,d))) -> plus (Przedzial(c,d)) (Dopelnienie(a,b))
  104.   | ((Dopelnienie(a,b)),(Dopelnienie(c,d))) -> Przedzial(neg_infinity,infinity)
  105.   | (Pusty,_) -> Pusty
  106.   | (_,Pusty) -> Pusty
  107. ;;
  108.  
  109. let rec razy x y =
  110.   let mnozenie x y =
  111.     match (x,y) with
  112.     | (a,0.) when a=infinity -> infinity
  113.     | (a,0.) when a=neg_infinity -> neg_infinity
  114.     | (0.,a) when a=infinity -> infinity
  115.     | (0.,a) when a=neg_infinity -> neg_infinity
  116.     | (_,_) -> x *. y
  117.   in
  118.   match (x,y) with
  119.   | (Pusty,_) -> Pusty
  120.   | (_,Pusty) -> Pusty
  121.   | (a,_) when a=Przedzial(0.,0.) -> wartosc_dokladna 0.
  122.   | (_,a) when a=Przedzial(0.,0.) -> wartosc_dokladna 0.
  123.   | (Przedzial (a,b), Przedzial (c,d)) ->
  124.     if (a=neg_infinity && b=infinity)||(c=neg_infinity && d=infinity) then Przedzial(neg_infinity, infinity)
  125.     else if (a=neg_infinity && d=0.)||(b=0. && c=neg_infinity) then Przedzial(0.,infinity)
  126.     else if (a<0. && b=0. && c>=0. && d=infinity)||(a>0. && b=infinity && c<=0. && d=0.) then Przedzial(neg_infinity,0.)
  127.     else Przedzial(min (min (mnozenie a c) (mnozenie a d)) (min (mnozenie b c) (mnozenie b d)),max (max (mnozenie a c) (mnozenie a d)) (max (mnozenie b c) (mnozenie b d)))
  128.   | (Przedzial (a,b), Dopelnienie (c,d)) -> suma (razy (Przedzial(a,b)) (Przedzial(neg_infinity,c))) (razy (Przedzial(a,b)) (Przedzial(d,infinity)))
  129.   | (Dopelnienie (a,b), Przedzial(c,d)) -> razy (Przedzial(c,d)) (Dopelnienie(a,b))
  130.   | (Dopelnienie (a,b), Dopelnienie(c,d)) ->
  131.     let przedzial1 = razy (Przedzial(neg_infinity,a)) (Przedzial(neg_infinity,c))
  132.     and przedzial2 = razy (Przedzial(neg_infinity,a)) (Przedzial(d,infinity))
  133.     and przedzial3 = razy (Przedzial(b,infinity)) (Przedzial(neg_infinity,c))
  134.     and przedzial4 = razy (Przedzial(b,infinity)) (Przedzial(d,infinity))
  135.     in suma (suma przedzial1 przedzial2) (suma przedzial3 przedzial4)
  136. ;;
  137.  
  138. let minus x y = plus x (razy (wartosc_dokladna (-.1.)) y);;
  139.  
  140. let rec podzielic x y =
  141.   match (x,y) with
  142.   | (Pusty,_) -> Pusty
  143.   | (_,Pusty) -> Pusty
  144.   | (_,a) when a=(wartosc_dokladna 0.) -> Pusty
  145.   | (Przedzial(a,b),Przedzial(c,d)) ->
  146.     if (a=0.)&&(b=0.) then Przedzial(0.,0.)
  147.     else if (a>=0.)&&(c>0.) then Przedzial(a /. d, b /. c)
  148.     else if (a<0.)&&(b=0.)&&(c<0.)&&(d=0.) then Przedzial(0.,infinity)
  149.     else if (a<0.)&&(b=0.)&&(c=0.) then Przedzial(neg_infinity,0.)
  150.     else if (a=0.)&&(c<0.)&&(d=0.) then Przedzial(neg_infinity,0.)
  151.     else if (a>=0.)&&(c<0.)&&(d=0.) then Przedzial(neg_infinity, a /. c)
  152.     else if (a>=0.)&&(c=0.) then Przedzial(a /. d, infinity)
  153.     else if (b<0.)&&(c<0.)&&(d=0.) then Przedzial(b /. c, infinity)
  154.     else if (b<0.)&&(c=0.) then Przedzial(neg_infinity, b /. d)
  155.     else if (b<0.)&&(d<0.) then Przedzial(b /. c, a /. d)
  156.     else if (a>=0.)&&(d<0.) then Przedzial(b /. d, a /. c)
  157.     else if (b<0.)&&(c>=0.) then Przedzial(a /. c, b /. d)
  158.     else if (a>=0.)&&(c<0.)&&(d>=0.) then Dopelnienie(a /. c, a /. d)
  159.     else if (a<0.)&&(b>=0.)&&(c>=0.) then Przedzial(a /. c, b /. c)
  160.     else if (b<0.)&&(c<0.)&&(d>=0.) then Dopelnienie(b /. d, b /. c)
  161.     else if (a<0.)&&(b>=0.)&&(d<0.) then Przedzial(b /. d, a /. d)
  162.     else Przedzial(neg_infinity, infinity)
  163.   | (Przedzial(a,b),Dopelnienie(c,d)) ->
  164.     let przedzial1 = podzielic (Przedzial(a,b)) (Przedzial(neg_infinity,c))
  165.     and przedzial2 = podzielic (Przedzial(a,b)) (Przedzial(d,infinity))
  166.     in suma przedzial1 przedzial2
  167.   | (Dopelnienie(a,b),Przedzial(c,d)) ->
  168.     let przedzial1 = podzielic (Przedzial(neg_infinity,a)) (Przedzial(c,d))
  169.     and przedzial2 = podzielic (Przedzial(b,infinity)) (Przedzial(c,d))
  170.     in suma przedzial1 przedzial2
  171.   | (Dopelnienie(a,b),Dopelnienie(c,d)) ->
  172.     let przedzial1 = podzielic (Przedzial(neg_infinity,a)) (Przedzial(neg_infinity,c))
  173.     and przedzial2 = podzielic (Przedzial(neg_infinity,a)) (Przedzial(d,infinity))
  174.     and przedzial3 = podzielic (Przedzial(b,infinity)) (Przedzial(neg_infinity,c))
  175.     and przedzial4 = podzielic (Przedzial(b,infinity)) (Przedzial(d,infinity))
  176.     in suma (suma przedzial1 przedzial2) (suma przedzial3 przedzial4)
  177. ;;
  178.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement