Nada Tentamensdag 2003 jan 13 Tentamen Programmeringsparadigm Skrivtid 5 h Antalet uppgifter : 1 (allmänt)+ 3 (Haskell) + 4 (Prolog) = 5p +(15p + 15p +20p) + (10p +12p + 15p +8p) = 5p + 50p + 45 p = 100p Lärare, jourhavande lärare : Leif Kusoffsky ------------------------------------------------------------------------------------------------------------------ Tillåtna hjälpmedel: Fokker : Functional programming Brna : Prolog Programming ----------------------------------------------------------------------------------------------------------------- Del : Paradigmer allmänt. 1. a) Om man programmerar objekt-orienterat i Java 1) Undviker man att använda applets. X) Undviker man switch- och if-kommandon 2) Undviker man att använda arv. b) Om man programmerar objekt-orienterat i Java 1) Har klasserna enbart klassvariabler X) Har klasserna enbart variabler deklarerade som static. 2) Har klasserna variabler och metoder deklarerade som instansvariabler och instansmetoder. c) Om man programmerar objekt-orienterat i Java 1) Har ofta subklasser egna olika implementaioner av metoder definierade i den gemensamma superklassen. X) Kan man använda multipelt arv 2) Har klasserna enbart metoder deklarerade som static. d) Det första objekt-orienterat programmeringspråket var 1) Java X) Smalltalk 2) Simula e) I vilken pardigm programmerar man när man använder klasser vars instanser både innehåller för instanserna individuella variabler och metoder? 1) Logiska läsningen i den logiska paradigmen X) Funktionella paradigmen 2) OO 5p)
Del : Funktionell programmering. I alla deluppgifterna, använd Haskell och skriv typen för de identifierare du definierar. 2. a) Skriv en funktion close::[a] -> [a] som givet en lista med n st element returnerar en lista med första elementet tillagt sist. Den returnerade listan har alltså n+1 element. Listargument med färre än tre element skall ge error. Exempel..> close [1,2,3,4] [1,2,3,4,1]..> close [1,2] Program error: argument to close must have a list of at least length 3.. > close[(1.0, 1.0), (2.0, 1.0), (2.0, 2.0), (1.0, 2.0)] [(1.0,1.0),(2.0,1.0),(2.0,2.0),(1.0,2.0),(1.0,1.0)] b) Skriv en funktion polylines :: [a] -> [(a, a)] som givet en lista med n st element returnerar en lista med n - 1 st par, där parenens komponeter är två på varandra följande element i argumentlistan. Listargument med färre än två element skall ge error. Exempel.. > polylines [1, 2, 3] [(1,2),(2,3)]..>> polylines [(1.0, 1.0), (2.0, 1.0), (2.0, 2.0)] [((1.0,1.0),(2.0,1.0)),((2.0,1.0),(2.0,2.0))] c) Skriv en funktion distbetween1:: ((Float, Float), (Float, Float)) -> Float som givet ett par med två kordinater (x1, y1) och (x2, y2) i ett rätvinkligt kordinatsystem returnerarar avståndet mellan koordinaterna. Exempel..> distbetween1 ((0.0, 0.0), (3.0, 4.0)) 5.0 15p) 3. Tentabetyget på en kurs beror på dels antalet poäng p på tentan, 0<= p <= 100, dels på om man har gjort ett labmoment steg9 vilket markeras med G eller _. Tentabetyg ges till de personer som har minst 50 p på tentan. Föjande betygsgränser gäller för dessa: Tentabetyg Tentapoäng p om Tentapoäng p om man gjort steg 9 man inte gjort steg 9 3 50 <= p < 70 50<= p < 75 4 70 <= p < 80 75 <= p < 98 5 80 <= p <= 100 98 <= p <= 100
Skriv ett program tentabetyg :: [(String, Int,Char)] -> [(String, Int)] som givet en lista av typ [(String, Int,Char)] med personers namn, tentamenspoäng och om man gjort steg9 retunerar tentabetyg för de personer som skall ha tentabetyg 3, 4, eller 5. Exempel : res = [("Per", 74, G ), ("Siv", 74, _ ), ("Eva", 95, G )].. >tentabetyg res [("Per",4),("Siv",3),("Eva",5)] a) Skriv programmet utan att använda några högre ordningens funktioner eller listomfattning. b) Skriv programmet med map och filter. c) Skriv programmet med listomfattning. 15p) 4. a) Skriv i Haskell en modul för en abstrakt datatype Shape för några olika geometriska former. Man skall kunna definera värden som är rektanglar givet två sidor cirklar givet radien rätvinkliga trianglar givet de två katetrarna polygoner givet en lista med kordinater för hörnen Dessutom skall det finnas (exporteras) en vanlig funktion square (ej konstuerarfunktion) som retunerar kvadrater (givet sidan). Till slut skall det i ADT Shape finnas (exporteras) en funktion circumference :: Shape -> Float som retunerar den geometriska formens omkrets. (se även fråga b). Tips : Min lösning använder funktionerna i 2a), 2b) och 2c). b) I en design-affär i Sturegallerian kan man tänka sig att man kan inhandla tre karottunderlägg med formerna Polygon [(1.0, 1.0), (2.0, 1.0), (2.0, 2.0), (1.0, 2.0)], square 1.0 Circle 3.0. Antag att man vill dekorera karottunderläggens kanter med dekor-tejpar. Skriv tre uttryck vars värden utgör längden på de dekor-tejparna. 20p)
Del : Logikprogrammering. 5. a) Skriv ett Prolog-predikat för append(xs, Ys, XsYs) med betydelsen att XsYs är en lista som är konkateneringen av Xs och Ys : Exempelvis append([1, 2, 14], [22, 33],[1,2,14,22,33] ) är sant. b) Hur kan man använda append/3 för att dela upp listan[1,2,14] i två listor Del1 och Del2 med ordningen mellan elementen intakt? Vilka olika svar kan man få vid körningen? c) Hur kan man definera member(x, Xs) med betydelsen att X är medlem i Xs med hjälp av append/3? d) Hur definerar man member(x, Xs) utan att använda append/3? 6. Skriv i Prolog ett generate-and-test-program som löser följande problem: 10p) På ett skolschema är det fyra lektioner på förmiddagen och fyra på eftermiddagen. Engelska är första lektion efter lunch. Geografi är just före mattelektionen. Engelska har elverna precis innan franska. Historia har de mellan fysik och franska. Bilogilektionen ligger mellan geografi och kemi. I vilken ordning kommer lektionerna? Tips: Man kan t ex ordna lektionerna i tids-ordning. Med "A mellan B och C" menas att lektionerna har följden BAC eller CAB. 12p) 7. Modifierad uppgift 3 för lösning i Prolog. Tentabetyget på en kurs beror på dels antalet poäng p på tentan, 0<= p <= 100, dels på om man har gjort ett labmoment steg9 vilket markeras med g eller n. Tentabetyg ges till de personer som har minst 50 p tentan. Betygsgränserna ges i uppgift 3. Betygsgränserna är beroende av om man gjort steg9. Skriv ett Prologpredikat tentabetyg(rs, Ts) med betydelsen att om Rs är en lista med personers namn, tentamenspoäng och om man gjort steg9 så är Ts en lista med namn och tentabetyg för de personer som har minst 50 poäng på tentan. Exempel, om vi har res([r(per, 74, g), r(siv, 74, n), r(eva, 95, g)]). :?- res(rs), tentabetyg(rs, Ts). Rs = [r(per,74,g),r(siv,74,n),r(eva,95,g)], Ts = [tentabetyg(per,4),tentabetyg(siv,3),tentabetyg(eva,5)]? ; no Tips: man kan använda =< < osv som infixoperatorer i predikat. 15p)
8. a) I Prolog unifieras argumenten i ett delmål, g(..) med huvudet (konklusionen) i en av de klausuler som definierar predikatet g. 1) Enbart huvudet kan innehålla logiska variabler X) Argumenten kan vara logiska variabler och huvudet kan innehålla logiska variabler 2) Enbart argumenten kan vara logiska variabler b) I Haskel mönster-passas argumentet i ett funktionsanrop med vänsterledet i en av de ekvationer som definierar funktionen. 1) Enbart vänsterledet kan innehålla mönster med t ex _, x och konstruerare X) Både argumentet och vänsterledet kan innehålla mönster t ex _ 2) Enbart argumentet kan innehålla mönster t ex _ c) Om Prolog misslyckas med att unifiera argumenten i ett delmål g(..) med huvudet (konklusionen) i den första av flera klausuler som definierar predikatet g. 1) Försöker Prolog unifiera argumenten med huvudet i den andra klausulen för predikatet g. X) Svarar Prolog yes. 2) Svarar Prolog no. d) Om ett Haskell-system, t ex hugs, misslyckas med att passa ("matcha") argumenten i ett anrop g.. med vänsterledet i den första av flera ekvationer som definierar funktionen g. 1) Försöker hugs "matcha" argumenten med vänsterledet i den andra ekvationen för funktionen g. X) Svarar hugs med Program error. 2) Returneras False. 8p)
Förfrågan: Kan du tänka dig att vara labbassistent nästa år under läsperiod 1 i kursen programmeringsparadigm i D2? Kryssa gärna i ett eller båda alternativen. (Naturligtvis ej bindande) O I Haskelldelen av kursen O I Prologdelen av kursen Hur kan jag kontakta dig (tex e-pos, tel ): Om du kryssat, bifoga denna sida med svaren på din tentamen!
Svar fikitiv tenta, del paradigmer allmänt. 1a) X 1b) 2 1c) 1 1d) 2 1e) 2 Svar fikitiv tenta, del funktionell programmering. close::[a] -> [a] -- 2 a close (a:b:c:as) = (a:b:c:as)++[a] close _ = error "argument to close must have alist of at least length 3" polylines :: [a] -> [(a, a)] -- b polylines (v1:v2:[]) = (v1, v2):[] polylines (v1:v2:vs) = (v1, v2):polylines(v2:vs) polylines _ = error "argument to polylines must have alist of at least length 2" distbetween1:: ((Float, Float), (Float, Float)) -> Float -- c distbetween1 ((x1, y1), (x2, y2)) = sqrt ((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)) tentabetyg [] = [] tentabetyg ((namn, p, _ ):nps) p < 50 = tentabetyg nps p < 75 = (namn, 3) : tentabetyg nps p < 98 = (namn, 4) : tentabetyg nps otherwise = (namn, 5) : tentabetyg nps tentabetyg ((namn, p, G ):nps) p < 50 = tentabetyg nps p < 70 = (namn, 3) : tentabetyg nps p < 80 = (namn, 4) : tentabetyg nps otherwise = (namn, 5) : tentabetyg nps tentabetyg _ = error "felaktiga indata" -- 3 a tentabetyg lista = map betyg1 -- b (filter ( \(namn, tentap, steg9) -> tentap > 50) lista) betyg1:: (String, Int, Char) -> (String, Int) betyg1 (namn, p, _ ) p < 75 = (namn, 3) p < 98 = (namn, 4) otherwise = (namn, 5) betyg1 (namn, p, G ) p < 70 = (namn, 3) p < 80 = (namn, 4) otherwise = (namn, 5) betyg1 _ = error "felaktiga indata" tentabetyg lista = -- c [ (namn, betyg tentap steg9) (namn, tentap, steg9) <- lista, tentap >= 50] betyg:: Int -> Char -> Int betyg p _ p < 75 = 3 p < 98 = 4 otherwise = 5 betyg p G p < 70 = 3 p < 80 = 4 otherwise = 5 betyg = error "felaktiga indata"
module Shape (Shape(..), square, circumference) where -- 4 data Shape = Rectangle Float Float Circle Float RtTriangle Float Float Polygon [(Float, Float)] square:: Float -> Shape square s = Rectangle s s circumference :: Shape -> Float circumference (Rectangle s1 s2 ) = 2.0*s1 + 2.0*s2 circumference (Circle r1 r2 ) = 2.0*pi*r circumference (RtTriangle s1 s2 ) = s1 + s2 + sqrt(s1*s1 + s2*s2) circumference (Polygon list) = sum (map distbetween1 (polylines (close list))) circumference (Polygon [(1.0, 1.0), 2.0, 1.0), (2.0, 2.0), (1.0, 2.0)]) circumference (square 1.0) circumference (Circle 3.0 1.0) Svar fikitiv tenta, del logik programmering. append([], Ys, Ys). append([x Xs],Ys,[X Zs]):-append(Xs,Ys,Zs). -- b % 5 a?- append(del1, Del2, [1,2,14]). % b Del1 = [], Del2 = [1,2,14]? ; Del1 = [1], Del2 = [2,14]? ; Del1 = [1,2], Del2 = [14]? ; Del1 = [1,2,14], Del2 = []? ; member(x, Ys) :- append(_, [X _], Ys). member(x, [X _]). member(x, [_ Xs]) :- member(x, Xs). % c % d % Ls is a time sequence of lessons % 6 schema(ls) :- Ls = [_, _,_,_, lunch, engelska, _, _, _], follows(geografi, matte, Ls), follows(engelska, franska, Ls), beetwin(franska, historia, fysik, Ls), beetwin(geografi, biologi, kemi, Ls). follows(x,y,[x,y _]). follows(x,y,[_ Zs]):- follows(x,y,zs). beetwin(x,y,z,[x, Y, Z _]). beetwin(x,y,z,[z, Y, X _]). beetwin(x,y,z, [_ Us]) :- beetwin(x,y,z, Us). /* Körning?- schema(rs). Rs = [kemi,biologi,geografi,matte,lunch,engelska,franska,historia,fysik]? ; no */ tentabetyg([], []). %7 tentabetyg([r(namn, P, n) Ntls ], [tentabetyg(namn, 3) Ntls1]) :- 50 =< P, P < 75, tentabetyg( Ntls, Ntls1).
tentabetyg([r(namn, P, n) Ntls ], [tentabetyg(namn, 4) Ntls1]) :- 75 =< P, P < 98, tentabetyg( Ntls, Ntls1). tentabetyg([r(namn, P, n) Ntls ], [tentabetyg(namn, 5) Ntls1]) :- 98 =< P,tentabetyg( Ntls, Ntls1). tentabetyg([r(namn, P, g) Ntls ], [tentabetyg(namn, 3) Ntls1]) :- 50 =< P, P < 70, tentabetyg( Ntls, Ntls1). tentabetyg([r(namn, P, g) Ntls ], [tentabetyg(namn, 4) Ntls1]) :- 70 =< P, P < 80, tentabetyg( Ntls, Ntls1). tentabetyg([r(namn, P, g) Ntls ], [tentabetyg(namn, 5) Ntls1]) :- 80 =< P, tentabetyg( Ntls, Ntls1). tentabetyg([r(_, P, _) Ntls ], Ntls1) :- P < 50, tentabetyg( Ntls, Ntls1). 4a) X 4b) 1 4c) 1 4d) 1 % 8