Del : Funktionell programmering. I alla deluppgifterna, använd Haskell och skriv typen för de identifierare du definierar.

Relevanta dokument
Nada Tentamensdag 2004 okt 18 Tentamen Programmeringsparadigm Skrivtid 5 h

Tentamensdag 2002-aug-20 Tentamen i Funktionell Programmering Skrivtid 5 h

Del : Funktionell programmering. I alla deluppgifterna, använd Haskell och skriv typen för de identifierare du definierar.

Del : Paradigmer allmänt.

Del : Paradigmer allmänt.

Nada KTH 2004 jan 12 Tentamen Programmeringsparadigm 2D1350 Skrivtid 5 h 8-13

Föreläsning 4 i programmeringsparadigm.

Nada KTH 2003 okt 23 Tentamen Programmeringsparadigm 2D1350 Skrivtid 5 h 8-13

Föreläsning 8. Paradigmöversikt, paradigmhistoria, paradigmgeografi. Se även föreläsning 1.

Föreläsning 5 i programmeringsparadigm.

Föreläsning 4 (och 5?) i programmeringsparadigm.

Föreläsning 7 i programmeringsparadigm. Ytterligare Högre ordningens funktioner: filter, foldr foldl. Hutton 7.2, 7.3 och 7.4.

DD1361 Programmeringsparadigm. Carina Edlund

Kungliga Tekniska Högskolan Ämneskod 2D1370 Tentamensdag 2001-maj-31 Tentamen i Funktionell Programmering Skrivtid 4 h

Föreläsning 9 i programmeringsparadigm. Paradigmöversikt, paradigmhistoria, paradigmgeografi. Se även föreläsning 1.

Föreläsning 8. newtype Chess = Chess [(Square, Chessman)] -- data ist f newtype OK -- data istället för newtype krävs om >1 konstruerare.

Imperativ programmering

Enjoy Vattenfallsmodellen i funktionella språk

Föreläsning 4 (och 5?) i programmeringsparadigm.

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Tentamen. Datalogi I, grundkurs med Java 10p, 2D4112, Lördagen den 30 november 2002 kl , salar E33, E34

Introduktion till Haskell

Funktionell programmering DD1361

Enjoy Vattenfallsmodellen i funktionella språk

Sista delen av kursen

Tentamen Grundläggande programmering

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

Föreläsning 3: Booleans, if, switch

Sista delen av kursen

Programspråkslingvistik. Sista delen av kursen. Ett programspråk

Föreläsning 9 i programmeringsparadigm. Unifiering (Brna Chapter 4.1).

Dagens föreläsning Programmering i Lisp Fö 7. Sammanfattning funktionell programmering Exempel på funktionella programspråk

Imperativ programmering. Föreläsning 2

Föreläsning 10 Datalogi 1 DA2001. Utskrift på skärmen. Syntax. print( Hej ) Hur är det? Hej. print( Hej,end= ) print( Hur är det? ) HejHur är det?

LÖSNINGSFÖRSLAG TENTAMEN PROGRAMMERING I ETT FUNKTIONELLT SPRÅK ML, 5P

Kursanalys för Programmeringsparadigm 2D1361, läsperiod 1 och 2 läsåret 2005/2006

Haskell forts. 5DV085 - Programspråk. Jan Erik Moström, Department of Computing Science, Umeå University - jem@cs.umu.se

Imperativ programmering. Föreläsning 3

Nada, KTH Tentamensdag maj -24 Tentamen i Funktionell Programmering Skrivtid 5 h

F4. programmeringsteknik och Matlab

TENTAMEN I PROGRAMSPRÅK -- DVG C kl. 08:15-13:15

Föreläsning 2 Programmeringsteknik och C DD1316. Programmering. Programspråk

Föreläsning 6 i programmeringsparadigm. Tips kring programmering i Haskell och kring labbarna.

Tentamen i Introduktion till programmering

Lambdas. (och fler design patterns) Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2017

TDP002 Imperativ programmering

TDIU01 - Programmering i C++, grundkurs

Introduktion till formella metoder Programmeringsmetodik 1. Inledning

Föreläsning 2 Programmeringsteknik DD1310. Programmering. Programspråk

Tentamen i. TDDA 69 Data och programstrukturer

Kap9. Operatorn.. Hudak 9.4 sid 11. Fermats förmodan, eller Fermats stora sats säger att. xm + ym == zm har heltalslösningar om och endast om m == 2.

TDP002 - Imperativ programmering

Programmering I Tobias Wrigstad fredag, 2009 augusti 28

TDP002 - Imperativ programmering

Föreläsning 10 i programmeringsparadigm. Boxmodellen för append.

Planering Programmering grundkurs HI1024 HT TIDAA

Grundläggande datalogi - Övning 1

Tentamen i Grundläggande programmering STS, åk 1 lördag

Introduktion till programmering D0009E. Föreläsning 1: Programmets väg

TDDD78, TDDE30, 729A Introduktion till Java -- för Pythonprogrammerare

Föreläsning 5 i programmeringsparadigm. Tips kring programmering i Haskell och kring labbarna.

Introduktion till programmering. Standardfunktioner. Vad används datorer till? Standardfunktioner. Föreläsning 2. Prelude. $ ghci...

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Introduktion till programmering SMD180. Föreläsning 2: Variabler, uttryck och satser

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

Övning2. Variabler. Data typer

Datalogi, grundkurs 1. Lösningsförslag till tentamen

Föreläsning 2 sept 05 (Onsdag v 36). DD Chapter 2.

Planering av ett större program, del 2 - for och listor. Linda Mannila

Föreläsning 2 Programmeringsteknik och Matlab DD1312. Programspråk. Utskrift på skärmen

Tentamen i Grundläggande Programvaruutveckling, TDA548

Program & programmering

TDP002 - Imperativ programmering

Föreläsning 2 Programmeringsteknik DD1310. Programmering. Programspråk

TDIU01 - Programmering i C++, grundkurs

Föreläsning [ ] i programmeringsparadigm. Om multiparadigm-språket OZ och en tjock bok.

Exempel på typer av datorspråk EXCEL

TENTAMEN TDDB53. Programmering i Ada för MI (provkod TEN2) den 7 april 2010 kl Institutionen för datavetenskap, IDA Olle Willén mars 2010

Klassdeklaration. Metoddeklaration. Parameteröverföring

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

Introduktion till programmering. Programspråk och paradigmer

Använda Python Laboration 1 GruDat, DD1344

Datalogi I, grundkurs med Java 10p, 2D4112, Tentamen 29 november 2003, svar och lösningar

TDDD78, TDDE30, 729A Introduktion till Java -- för Pythonprogrammerare

2D1311 Programmeringsteknik för Bio1 och Bio2, vt 2003 Fiktivt prov På flervalsfrågorna är endast ett svar rätt om inget annat anges i frågan! Det rik

Planering Programmering grundkurs HI1024 HT data

String [] argv. Dagens Agenda. Mer om arrayer. Mer om arrayer forts. String [] argv. argv är variabelnamnet. Arrayer och Strängar fortsättning

Centrala begrepp i prolog och logikprogrammering. Annamaris lista

MATLAB. Python. Det finns flera andra program som liknar MATLAB. Sage, Octave, Maple och...

Outline. For. I istället för att följa det normala ordningen, man ändra den. I i Java får man inte göra hopp hur som helst

Beräkningsverktyg HT07

Välkomna till NADA. Paradigm i datalogin. Vad är ett paradigm

Imperativ programmering. Imperativ programmering konstruktioner i Lisp. Datastrukturer (kap ) arraystruktur poststruktur

Funktionell programmering

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python TDDE24 Funktionell och imperativ programmering del 2

C++ - En introduktion

TENTAMEN OOP

Deklarativt programmeringsparadigm

Övningsuppgifter kapitel 8

OOP Objekt-orienterad programmering

Transkript:

Nada Tentamensdag 2004 aug 23 Tentamen Programmeringsparadigm Skrivtid 5 h Antalet uppgifter : 1 (allmänt)+ 4 (Haskell) + 4 (Prolog) = 10p +(5p + 20p +5p+ 20p) + (10p +12p + 8p +10p) = 10p + 50p + 40 p = 100p Lärare, jourhavande lärare : Leif Kusoffsky ------------------------------------------------------------------------------------------------------------------ Tillåtna hjälpmedel: Fokker : Functional programming Brna : Prolog Programming ----------------------------------------------------------------------------------------------------------------- Del : Paradigmer allmänt. 1. Beskriv olika programeringsparadigm och vad som utmärker dem. Ge exempel på olika programmeringsspråk i de olika paradigmen. 10 p) Del : Funktionell programmering. I alla deluppgifterna, använd Haskell och skriv typen för de identifierare du definierar. 2. Skriv en funktionen engletter som avgör om det är sant eller osant om ett tecken finns i det engelska alfabetet, dvs i intervallet från a till z eller A till Z. Ange även funktionens typ. 5p) 3. Definiera en funktion sumbiggerthan :: Int -> [(Int, Int)] -> [Int] sumbiggerthan k list adderar komponenterna i paren i list och retunerar en lista med de summor som är större än k. Exempelvis: sumbiggerthan 5 [(1, 2),(3, 4),(5, 6)] blir [7, 11] 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". 20p) 4. Vad menas med λ-uttryck i Haskell? När har man glädje av sådana? Ge exempel! 5p)

5 a) Skriv i Haskell en DT (datatyp) Vector2 (vektorer i planet) med följande operationer: Vector2, -- datatyp för vektorer i planet Vector2, -- Double-> Double->Vector2 Konstuktorfunktion för vektor read, -- String -> Vector2 inläsning på formen Vector2 1.0 2.0 read1, -- (Double, Double) -> Vector2 -- för inläsning på formen read1 (1.0, 2.0) show, -- Vector2 -> String utskrift på formen Vector2 1.0 2.0 show1, -- Vector2 -> (Double, Double) för utskrift på formen (1.0, 2.0) (==), -- Vector2 -> Vector2 -> Bool lika med (/=), -- Vector2 -> Vector2 -> Bool ej lika med add, -- Vector2 -> Vector2 -> Vector2 vektoradditon sub, -- Vector2 -> Vector2 -> Vector2 vektorsubtraktion neg, -- Vector2 -> Vector2 negering lengthv2, -- Vector2 -> Double vektorlängd ( absolutbelopp) o, -- Vector2 -> Vector2 -> Double skalärprodukt Exempel på körningar : Vector2> Vector2 1 (-3)/= Vector2 4 4 True Vector2> Vector2 1 (-3)+ Vector2 4 2 Vector2 5.0 (-1.0) Vector2> Vector2 1 (-3) add Vector2 4 2 Vector2 5.0 (-1.0) Vector2> show1 (read1 (1, -3) + read1 (4, 2)) (5.0,-1.0) Vector2> read1 (1, -2) o read1 (-3, 4) -11.0 b) Komplettera din definition i a) så att man kan använda följande operatorer och funktion i typklassen Num (detta är ganska svårt, talade om detta iföreläsning 7) -- Tillägsuppgift (+), -- överlagrad operator för add (-), -- överlagrad operator för sub (*), -- ska ge error negate -- överlagrad funktion för neg -- övriga funktioner i Num ger error Typklassen Num är definierad så här i "Prelude" : class (Eq a, Show a) => Num a where (+), (-), (*) :: a -> a -> a negate :: a -> a abs, signum :: a -> a frominteger :: Integer -> a fromint :: Int -> a -- Min comp def: All, -- except negate or (-) -- Def imp se prelude c) I uppgift b), varför kan vi inte låta (*) stå för skalärprodukten och abs för lengthv2? 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 i Prolog för append(xs,ys,xsys) med betydelsen att listan XsYs är listan Xs sammanslagen med Ys. c) Använda append/3 för att skriva en definition i Prolog för member(element,list) (10p) 7. Skriv i Prolog ett generate-and-test-program som löser följande problem: I tv-programmet Anti-Bachelor kan Maria välja mellan Per, Tage och Lars. De har olika yrken, olika längd och olika hårfärger; en är blond, en är rödhårig och en är mörk. Den blonda ynglingen är längst och är ekonom. Lars är kortare än den som är rödhårig. Per är civilingenjör. Maria väljer bort den som är längst och väljer bort den som är kortast. Vem väljer Maria och vilket yrke har han? 12p) 8. a) När det gäller Prolog-program kan man tala om en logisk läsning och en procedurell läsning. 1) Alla Prolog-program har en procedurell läsning. X) Alla Prolog-program har en logisk läsning. 2) Enbart Prolog-program som innehåller! har en logisk läsning. b) Prologs semantik ( procedurell läsning) kan beskrivas med Byrds boxmodel. 1) Kommer vi till en box via Redo-porten kommer vi alltid att lämna boxen via Fail-porten. X) Kommer vi till en box via Redo-porten kommer vi alltid att lämna boxen via Call-porten. 2) Kommer vi till en box via Redo-porten kommer vi att lämna boxen via Fail-porten eller via Exit-porten c) I den logiska läningen av Prolog-program 1) betyder ; logiskt och X) betyder, logiskt och 2) betyder, logiskt eller d) I den logiska läningen av Prolog-program 1) Har klausul-ordningen i ett predikat betydelse. X) Har mål-ordningen i ett högerled i en klausul betydelse. 2) Har vare sig klausul-ordningen eller mål-ordningen någon betydelse. 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 substitutioner görs i så fall?)?- x=y.?- X=Y.?- x=y.?- X=y.?- X=Y, Y=z.?- a(b,c) = d(e,f).?- a(b,c) = a(e,f).?- a(b, b) = a(c, C).?- a(b, b) = a(c, c).?- a(b,b) = A(B,b). 10p)

Svar tentamen programeringsparadigm 2003- augusti. Del paradigmer allmänt. Imperativ : Sekvens av kommandon (satser/order/instuktioner) som datorn utför i tidsordning. Ordningen kan brytas med aternativkommandon (if / case /switch osv ) och med slingkommandon ( Loopar / for / while / repeat- until osv) och i vissa språk med goto. Assemleringspråk, Fortran, Basic, Pascal... osv. Det finns hur många som helst. Moderna imperativa språk möjliggör definiton av egna sammansatta typer; poster (records) och arrayer. OO : Imperativ + klassbegrepp, dvs posterna kan innehålla funktioner. Instanser av olika klasser kallas objekt, och anrop av funktionerna sker via objekten. Detta innebär att objekt som är av av olika "sort" (tillhör olika klasser) "gör saker på sitt sätt". Dessutom kan klasserna inordnas i ett arvsträd (eller arvsordning). Språk: Eifel, Simula, Java, C++ m.fl. Funktionella språk. Programmering genom att definiera funktioner, "huvudprogram", "fuktioner", "subrutiner", metoder" ersätts av funktioner. Kärnan är matematikens lamda-kalkyl. Funktioner är värden, funktioner kan ha funktioner som argument och/eller resultat ("Högre ordningens funktioner"). Inga sidoeffekter, dvs en viss kod betyder alltid samma sak oberoende av exekveringsomgivning och oberoende av när den exekveras. Funktionsargument "mönsterpassas" ofta på parametrarna i funktionsdefiionerna, vilket är bekvämt. Språk: Haskell, ~ Lisp, ml. Lamda-uttryck finns också i Python och Python kan därför användas funktionellt. Logik språk. Kärnan är en delmängd av logiken. Programmering genom att skriva logiska påståenden, dels fakta, dels påståenden (klausuler, satser) av typ detta gäller ("klausulhuvud",) om detta gäller ("klausulkropp"). Klausulkroppar består ofta av flera termer med "logiska och" som operator."logiska eller" skrivs i regel som flera klausuler och som tillsammans bildar ett predikat. Både klausulhuvud och klausulkropp kan innehålla logiska variabler, och ett logikspråk försöker genom ("dubbelsidig") mönsterpassning (unifiering) klura ut om påståenden är sanna eller om logiska variabler förekommer vad som krävs av de logika variablerna för att påstenden ska vara sanna. Språk: Prolog och moderna utvidgningar av Prolog. Del funktionell programmering. engletter :: Char -> Bool -- 2 engletter c = (( a <= c) && (c <= z )) (( A <= c) && (c <= Z )) sumbiggerthan _ [] = [] -- 3 a sumbiggerthan k ((i, j):ijs) i+j > k = (i+j) : sumbiggerthan i ijs otherwise =sumbiggerthan i ijs sumbiggerthan k list = filter p (map f list) -- b where f (i, j) = i+j p m = m > k sumbiggerthan k list = [ i+j (i,j) <- list, i+j > k ] -- c sumbiggerthan k list = sbtacc k list [] -- d sbtacc :: Int -> [(Int, Int)] -> [Int] -> [Int] sbtacc _ [] acc = acc

sbtacc k ((i, j):ijs) acc i*j > k = sbtacc k ijs (acc++[i+j]) otherwise = sbtacc k ijs acc -- 4 module Vector2 ( -- 5 a) Vector2, -- datatyp för vektorer i planet Vector2, -- Double-> Double->Vector2 Konstuktorfunktion för vektor read, -- String -> Vector2 inläsning på formen Vector2 1.0 2.0 read1, -- (Double, Double) -> Vector2 -- för inläsning på formen read1 (1.0, 2.0) show, -- Vector2 -> String utskrift på formen Vector2 1.0 2.0 show1, -- Vector2 -> (Double, Double) för utskrift på formen (1.0, 2.0) (==), -- Vector2 -> Vector2 -> Bool lika med (/=), -- Vector2 -> Vector2 -> Bool ej lika med add, -- Vector2 -> Vector2 -> Vector2 vektoradditon sub, -- Vector2 -> Vector2 -> Vector2 vektorsubtraktion neg, -- Vector2 -> Vector2 negering lengthv2, -- Vector2 -> Double vektorlängd ( absolutbelopp) o, -- Vector2 -> Vector2 -> Double skalärprodukt -- Tillägsuppgift (+), -- överlagrad operator för add (-), -- överlagrad operator för sub (*), -- ska ge error negate -- överlagrad funktion för negate ) where data Vector2 = Vector2 Double Double deriving (Eq, Show, Read) add :: Vector2 -> Vector2 ->Vector2 add (Vector2 x1 y1) (Vector2 x2 y2) = Vector2 (x1+x2) (y1+y2) sub:: Vector2 -> Vector2 ->Vector2 sub v1 v2 = add v1 (neg v2) neg :: Vector2 -> Vector2 neg (Vector2 x y) = Vector2 (-x) (-y) lengthv2 :: Vector2 -> Double lengthv2 (Vector2 x y) = sqrt (x*x + y*y) read1 :: (Double, Double) -> Vector2 read1 (x, y) = Vector2 x y show1 :: Vector2 -> (Double, Double) show1 (Vector2 x y) = (x, y) o :: Vector2 -> Vector2 -> Double o (Vector2 x1 y1) (Vector2 x2 y2) = (x1*x2 + y1*y2) instance Num Vector2 where (+) = add (*) = error "No * on vectors" negate = neg abs = error "abs" frominteger i = error "frominteger" Typerna stämmer ej. Del logik programmering. -- 5 b -- 5 c

member(x, [X _]). member(x, [_ Ys]) :- member(x, Ys) % 6 a append([], Ys, Ys). % b append([x Xs], Ys, [X Zs]) :- append(xs, Ys, Zs). member(x, Ys) :- append(_, [X _], Ys). % c % Ps is a sequence of men in length order. % A man is g(<name>, <hair coulor>,<profession>). p(ps, N, Y) :- Ps = [g(_, blond, ekonom), g(n,_,y), _], % tallest first member(g(per, _, civing), Ps), member(g(lars, _, _), Ps), member(g(tage, _, _), Ps), member(g(_,dark, _), Ps), member(g(_, red, _), Ps), after(g(_, red, _), g(lars, _, _), Ps). after(x, Y, [X, Y, _]). after(x, Y, [X, _, Y]). after(x, Y, [_, X, Y]). /* Körning :?- p(ps, N, Y). N = per, Y = civing, Ps = [g(tage,blond,ekonom),g(per,red,civing),g(lars,dark,_a)]? ; no?- */ 8a) 1 8b) 2 8c) x 8d) 2 % 8?- x=y. no % 9?- X=Y. Y = X? ; no?- x=y. Y = x? ; no?- X=y. X = y? ; no?- X=Y, Y=z. X = z, Y = z? ; no?- a(b,c) = d(e,f). no?- a(b,c) = a(e,f). C = f, E = B? ; no?- a(b, b) = a(c, C). B = b, C = b? ; no?- a(b, b) = a(c, c). no?- a(b,b) = A(B,b). {SYNTAX ERROR: **operator expected...**