Deklaratív programozás mintazárthelyi, 2005. május 35. ====================================================== SML megoldások, 1.1. változat, dp05s-zh-smlminta-megol.txt ========================================================== ------------------- A csoport ------------------- 5. Az alábbi, egymástól független, szintaktikailag helyes SML-kifejezésekben kifejezésenként két-két statikus szemantikai hiba van. Melyek ezek? (a) let val (x, y, z) = (4, ~4.0, #"A") in [y-x, chr z] end - real-ből (y=~4.0) nem vonható ki int (x=4) - chr nem alkalmazható char-ra (z=#"A") (b) ("0.0", [3+3], fn x => x) = (#"1", [3+6], fn y => y) - string és char egyenlősége nem vizsgálható - függvények egyenlősége nem vizsgálható (c) foldr op:: 0 [1,2,3.0] - listában csak azonos típusú elemek lehetnek - foldr op:: nem int, hanem int list típusú egységelemet vár Pontozás (összesen max. 7 pont): 5.a - 5.c Helyes válasz 2-2-3 pont. Minden hiba megtalálása 1 pontot, 5.c második válasza 2 pontot ér. 6. Mi a t értéke az alábbi, egymástól független deklarációk kiértékelése után? (a) val (_::_::_::t) = explode "lap" @ tl(explode "top") t = [#"o", #"p"] (b) val t = map (fn (n,m) => n<>m) [(1,2), (ord #"A",ord #"a"), (2,2), (round 5.2,floor 5.9) ] t = [true, true, false, false] (c) val (_::t::_) = List.filter (fn (n,m) => n=m) [(ord #"z",ord #"z"), (2,2), (1,1+1), (round 5.2,floor 5.9) ] t = (2, 2) Pontozás (összesen max. 7 pont): 6.a - 6.c Helyes válasz 2-3-2 pont. A feladatokban csak a kifejezések értékét kérdezzük, a típusukat nem! 7. Az ('r, 's) RS adattípust így deklaráljuk: datatype ('r, 's) RS = Q | R of 'r | S of 's | T of ('r * 's) (a) Írja fel (a1) Q, Q : ('r, 's) RS (a2) T és T : ('r * 's) -> ('r, 's) RS (a3) S "er" típusát! S "er" : ('r, string) RS Tekintsük az f függvény definícióját: fun f (S s) = s | f (T (r, s)) = s ^ str r | f _ = "" (b) Mi az x értéke az alábbi, egymástól független deklarációk kiértékelése után? (b1) val x = f Q x = "" (b2) val x = f (S "sok") x = "sok" (b3) val x = f (R #"r") x = "" (b4) val x = f (T (#"k", "sok")) x = "sokk" 8. Mértani számhármasnak nevezzük a három pozitív (>0) egészből álló, egész hányadosú mértani sorozatot alkotó hármast. Írjon olyan SML-függvényt mertani néven, amelynek paramétere egy egészeket tartalmazó lista, az eredménye pedig szomszédos listaelemekből álló mértani számhármasok listája! Segédfüggvényt definiálhat, ha ír hozzá fejkommentet. (* mertani : int list -> (int * int * int) list mertani ls = az ls lista szomszédos elemeiből álló mértani számhármasok listája *) Példák: mertani [] = []; mertani [4,8] = []; mertani [2,4,8] = [(2,4,8)]; mertani [2,4,8,8,8] = [(2,4,8),(8,8,8)]; mertani [2,4,8,16] = [(2,4,8),(4,8,16)]; mertani [2,4,8,17] = [(2,4,8)]; mertani [1,3,12,48,16] = [(3,12,48)]; mertani [~2,~4,~8] = []; Egy megvalósítása: fun mertani xs = let fun (* m0 : int list -> (int * int * int) list -> (int * int * int) list m0 zs ss = a zs lista szomszédos elemeiből álló mértani számhármasok listája az ugyancsak mértani számhármasokat tartalmazó ss lista elé fűzve *) m0 (x::y::z::zs) ss = m0 (y::z::zs) (if 0 x*2) = (["0"], 3+3, fn y => y*2) - char list és string list egyenlősége nem vizsgálható - függvények egyenlősége nem vizsgálható (c) foldr op^ 0 ["a","b",#"c"] - listában csak azonos típusú elemek lehetnek - foldr op^ nem int, hanem string típusú egységelemet vár Pontozás (összesen max. 7 pont): 5.a - 5.c Helyes válasz 2-2-3 pont. Minden hiba megtalálása 1 pontot, 5.c második válasza 2 pontot ér. 6. Mi a w értéke az alábbi, egymástól független deklarációk kiértékelése után? (a) val (_::_::_::w) = explode "pus" @ rev(explode "sutak") w = [#"k", #"a", #"t", #"u", #"s"] (b) val w = map (fn (x,y) => x=y) [(1*2,2*1), (1,2), (ord #"9",~(ord #"9")), (round 3.7,floor 4.2) ] w = [true, false, false, true] (c) val (_::w) = List.filter (fn (x,y) => x<>y) [(ord #"9",~(ord #"9")), (1,2), (1*2,2*1), (round 3.7,floor 4.2) ] w = [(1, 2)] Pontozás (összesen max. 7 pont): 6.a - 6.c Helyes válasz 2-3-2 pont. A feladatokban csak a kifejezések értékét kérdezzük, a típusukat nem! 7. Az ('s, 'r) SR adattípust így deklaráljuk: datatype ('s, 'r) SR = Q | R of 'r | S of 's | T of ('r * 's) (a) Írja fel (a1) Q, Q : ('s, 'r) SR (a2) T és T : ('r * 's) -> ('s, 'r) SR (a3) R 95.3 típusát! R 95.3 : ('s, real) SR Tekintsük az f függvény definícióját: fun f (S s) = s | f (T (r, s)) = str r ^ s | f _ = "" (b) Mi az x értéke az alábbi, egymástól független deklarációk kiértékelése után? (b1) val x = f Q x = "" (b2) val x = f (R #"r") x = "" (b3) val x = f (S "sir") x = "sir" (b4) val x = f (T (#"z", "sir")) x = "zsir" 8. Rendezett pithagoraszi számhármasnak nevezzük az olyan pozitív (>0) egészekből álló (x,y,z) hármast, amely kielégíti az x*x+y*y=z*z egyenletet, és amelyre x (int * int * int) list pithagoraszi ls = az ls lista szomszédos elemeiből álló pithagoraszi számhármasok listája *) Példák: pithagoraszi [] = [] pithagoraszi [3,4] = [] pithagoraszi [1,3,4,5,6,7] = [(3,4,5)] pithagoraszi [1,4,3,5,3,7,24,25] = [(7,24,25)] pithagoraszi [7,24,25,5,16,63,65] = [(7,24,25),(16,63,65)] pithagoraszi [3,4,5,12,13] = [(3,4,5),(5,12,13)] pithagoraszi [~5,~4,~3] = [] Egy megvalósítása: fun pithagoraszi xs = let fun (* p0 : int list -> (int * int * int) list -> (int * int * int) list p0 zs ss = a zs lista szomszédos elemeiből álló pithagoraszi számhármasok listája az ugyancsak pithagoraszi számhármasokat tartalmazó ss lista elé fűzve *) p0 (x::y::z::zs) ss = p0 (y::z::zs) (if 0