Advertisement
PearlyXD

Untitled

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