Nada Tentamensdag 2003 aug 25 Tentamen Programmeringsparadigm Skrivtid 5 h Antalet uppgifter : 1 (allmänt)+ 4 (Haskell) + 4 (Prolog) = 5p +(12p + 15p +5p+ 20p) + (10p +14p + 8p +11p) = 5p + 52p + 43 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) Kan man programmera icke-objekt-orienterat i Java, dvs som i ett klassikt imperativt språk? 1) Nej, går ej att skriva program som är i stort ekvivalenta med t ex Pascal-program. X) Ja, om man undviker switch- och if-kommandon 2) Ja, i stort sett om klasserna enbart har variabler och funktioner deklarerade som static. b) 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. c) Föjande språk är imperativa, icke-objekt-orienterade språk 1) Pascal, Fortran, C, BASIC X) Prolog 2) Smalltalk, Eiffel, Simula d) I vilken pardigmen programmerar man genom att ange i vilken ordning datorn skall utföra olika kommandon, kommandon som ofta har sidoeffekter? 1) Logiska läsningen i den logiska paradigmen X) Funktionella paradigmen 2) Imperativa paradigmen och objekt-orienterade paradigmen e) Assembleringsspråk användes när datorer var nyuppfunna, dvs på 50-talet. Vilken paradigm? 1) Logiska paradigmen X) OO- paradigmen 2) Imperativ paradigmen 5p)
Del : Funktionell programmering. I alla deluppgifterna, använd Haskell och skriv typen för de identifierare du definierar. 2. a) Skriv en funktion distbetween:: ((Float, Float), (Float, Float)) -> Float som givet ett par med två kordinater ((x1, y1), (x2, y2)) i ett rätvinkligt koordinatsystem returnerarar avståndet mellan koordinaterna. Exempel..> distbetween ((0.0, 0.0), (3.0, 4.0)) blir 5.0 6p) b) Definiera triarea :: (Float, Float) -> (Float, Float) -> (Float, Float) -> Float som givet koordinaterna för tre hörn i ett rätvinkligt kordinatsystem returnerarar arean för triangeln bestämd av de tre hörnen. Tips: Använd Herons formel : A = sqrt (s*(s-a)*(s-b)*(s-c)) där a, b, c är längden på triangels sidor och s = 0.5*(a+b+c) 6p) 3. Definiera en funktion productbiggerthan :: Int -> [(Int, Int)] -> [Int] productbiggerthan k list multipliserar komponenterna i paren i list och retunerar en lista med de produkter som är större än k. Exempelvis: productbiggerthan 5 [(1, 2),(3, 4),(5, 6)] blir [12, 30] eftersom 3*4 > 5 och 5*6 > 5 a) Skriv funktionen utan att använda några högre ordningens funktioner eller listomfattning. (och inte som i uppgift d) b) Skriv funktionen med map och filter. c) Skriv funktionen med listomfattning. d) Skriv funktionen med hjälpfunktion med "accumulering i parameter". 15p) 4. I ett typuttrycket kan det stå Num a =>. Förklara vad som menas med detta. Vilkets sorts namn är Num? 5p)
5 a) Skriv i Haskell en modul för en 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 vanliga funktion square (ej konstuerarfunktion) som returnerar en kvadrat (givet sidan). Till slut skall det i ADT Shape finnas (exporteras) en funktion area :: Shape -> Float som retunerar arean för en geometrisk form (se även fråga b). Tips: Polygoners yta kan beräknas genom att dela upp en polgon i en mindre polygon och en triangel (för triangelns yta kan du använda funkitonen i 2 b): v1 v2 v5 v3 v4 v2 v3 = + v1 v1 v5 v3 v4 b) För att kontrollera funktionen area, skriv två uttryck vars värden utgör arean på en kvadrat med sidan 1, det ena uttrycket med kvadraten beskriven med funktionen square och det andra uttrycket med kvadraten beskriven med konstuerarfunktionen för polygoner, dvs kvadraten beskrivs som en polygon med fyra hörn i (0, 0), (1, 0), (1, 1), (0,1). Låt oss kalla värdet på de två uttrycken som u1 och u2. Diskutera vilket värde u1 == u2 kan få. c) På IKEA kan man tänka sig att man kan inhandla en rund cylindrisk kastrull med radien 3.0 och höjden 4.0. Skriv ett uttryck vars värde utgör kastrullens volym. 20p)
Del : Logikprogrammering. 6. a) Skriv ett program för member(element,list) med betydelsen Element är ett element i listan List. b) Skriv ett program för select(x,harxs,ettmindrexs) med betydelsen att listan EttMindreXs är resultatet av att en förekomst av X har tagits bort från HarXs. c) Skriv ett program för permutation(xs,ys) med betydelsen att Ys är en permutation av Xs. 7. Skriv i Prolog ett generate-and-test-program som löser följande problem: 10p) Bilarna BHB 737, MMX 152 och AXA 535 har olika motorstyrkor och olika sorters transmissioner; en är framhjulsdriven, en är bakhjulsdriven och en är fyrhjulsdriven. Den framhjulsdrivna bilen är starkast och är en sedan. AXA 535 är svagare än den fyrhjulsdrivna bilen. BHB 737 är en kabriolet som ger rufs i håret när man kör eller åker med. Vilken bil har vilken sorts transmission? Tips: Man kan t ex ordna bilarna efter motorstyrka. 14p) 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) Både argumenten och huvudet kan innehålla logiska variabler 2) Enbart argumenten kan innehålla 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 satisfiera ett delmål g i en konjunktion av delmål.., h(..), g(..), f(x) 1) Försöker Prolog på nytt att få delmål h att lyckas med unifiering m h a ny klausul. X) Svarar Prolog no. 2) Svarar Prolog yes.
d) Om ett Haskell-system, t ex hugs, vid en körning får resultatet False vid beräkningen av funktionanropet g(x)i detta uttryck med funktionanrop h(x) && g(x) && f(x) 1) Anropas h(x) på nytt. X) Blir hela uttrycket True om uttrycket f(x), som beräknas, blir True. 2) Blir hela uttrycket False. 8p) 9 När man kör i Prolog-fönstret i emacs, vad skulle följande körningar (unifieringar) ge för resultat (Lyckas unifieringarna? Vilka substiutioner görs i så fall?)?- a=b.?- A=b.?- cars(x) = cars(saab).?- cars(x) = f(y).?- cars(x) = cars([saab, volvo Cs]).?- cars([saab, volvo Cs]) = cars(x).?- cars([saab, volvo Cs]) = cars([saab, volvo, opel]).?- cars(x, Y, opel) = cars(volvo, saab, opel).?- cars(x, Y, opel) = cars(volvo, saab, Z).?- cars(x, Y, opel) = cars(volvo, saab, vw).?- X(saab) = cars(y). 11p)
Svar tentamen programeringsparadigm 2003- augusti. Del paradigmer allmänt. 1a) 2 1b) 1 1c) 1 1d) 2 1e) 2 Del funktionell programmering. distbetween :: ((Float, Float),(Float, Float)) -> Float -- 2a) distbetween ((x1, y1), (x2, y2)) = sqrt ((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)) triarea :: (Float, Float) -> (Float, Float) -> (Float, Float) -> Float -- 2b) triarea v1 v2 v3 = sqrt (s*(s-a)*(s-b)*(s-c)) where a = distbetween (v1, v2) b = distbetween (v2, v3) c = distbetween (v3, v1) s = 0.5*(a+b+c) productbiggerthan _ [] = [] -- 3 a productbiggerthan k ((i, j):ijs) i*j > k = (i*j) : productbiggerthan i ijs otherwise =productbiggerthan i ijs productbiggerthan k list = filter p (map f list) -- b where f (i, j) = i*j p m = m > k productbiggerthan k list = [ i*j (i,j) <- list, i*j > k ] -- c productbiggerthan k list = pbtacc k list [] -- d pbtacc :: Int -> [(Int, Int)] -> [Int] -> [Int] pbtacc _ [] acc = acc pbtacc k ((i, j):ijs) acc i*j > k = pbtacc k ijs (acc++[i*j]) otherwise = pbtacc k ijs acc -- 4 T ex Num a => a -> a -> a. Num a är ett sammanhang ("context") för typuttrycket a -> a -> a, dvs i typuttrycket står a för någon typ som är en instans ("instance") av typklassen Num. Det innebär att a står för någon typ som har operationerna/funktionera i Num dvs +, - *, negate, abs, signum och tointeger. Dessa operationer/funktioner har typer som finns i deklarationen för typklassen Num. module Shape (Shape(..), area, square) where -- 5 a) data Shape = Rectangle Float Float Circle Float RtTriangle Float Float Polygon [(Float, Float)] square :: Float -> Shape square s = Rectangle s s -- distbetween, triarea se uppgift 2 area :: Shape -> Float area (Rectangle s1 s2 ) = s1*s2 area (Circle r ) = r * r * pi area (RtTriangle s1 s2 ) = 0.5*s1*s2
area (Polygon (v1:v2:v3:[])) = triarea v1 v2 v3 area (Polygon (v1:v2:v3:vs)) = triarea v1 v2 v3 + area (Polygon (v1:v3:vs)) Shape> area (Polygon [ (0, 0), (1, 0), (1, 1), (0,1)]) -- 5 b) 1.0 Shape> area (square 1) 1.0 Shape> area (Polygon [ (0, 0), (1, 0), (1, 1), (0,1)]) == area (square 1) False -- "Borde" bli True, men sqrt i Herons formel med serieutveckling ger -- ej exakt värde. == Farligt för värden av typ Float Shape> 4.0*area (Circle 3.0) -- 5 c) 113.097 Del logik programmering. member(x, [X _]). member(x, [_ Ys]) :- member(x, Ys) select(x,[x Ys],Ys). select(x,[y Ys],[Y Zs]):- select(x,ys,zs). permutation(xs, [Z Zs]) :- select(z, Xs, Ys), permutation(ys, Zs). permutation([], []). % Cs is a sequence of cars in motor power order. % 7 % A car is g(<name>, <transmission>,<sedan/cab>). % 6 a % b % c cars(cs) :- Cs = [g(_, fram, sedan), _, _], member(g(bhb737, _, cab), Cs), member(g(axa535, _, _), Cs), member(g(mmx152, _, _), Cs), member(g(_,bak, _), Cs), member(g(_, fyr, _), Cs), after(g(_, fyr, _), g(axa535, _, _), Cs). after(x, Y, [X, Y, _]). after(x, Y, [X, _, Y]). after(x, Y, [_, X, Y]). % Starkast först /* Körning :?- cars(rs). Rs = [g(mmx152,fram,sedan),g(bhb737,fyr,cab),g(axa535,bak,_a)]? ; no */ 8a) X 8b) 1 8c) 1 8d) 2 % 8?- a=b. no %9?- A=b. A = b? ;?- cars(x) = cars(saab). X = saab? ;?- cars(x) = f(y). no?- cars(x) = cars([saab, volvo Cs]). X = [saab,volvo Cs]? ;?- cars([saab, volvo Cs]) = cars(x). X = [saab,volvo Cs]? ;?- cars([saab, volvo Cs]) = cars([saab, volvo, opel]). Cs = [opel]? ;?- cars(x, Y, opel) = cars(volvo, saab, opel). X = volvo, Y = saab? ;?- cars(x, Y, opel) = cars(volvo, saab, Z). X = volvo, Y = saab, Z = opel? ;?- cars(x, Y, opel) = cars(volvo, saab, vw). no?- X(saab) = cars(y). {SYNTAX ERROR:...
Betygsgänser om man gjort steg 9, schacket: om man ej gjort steg 9, schacket 3 >= 50 >= 50 4 >= 60 >= 70 5 >= 73 >= 92