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

Relevanta dokument
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.

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

Del : Paradigmer allmänt.

Föreläsning 4 i programmeringsparadigm.

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

Del : Paradigmer allmänt.

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

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

DD1361 Programmeringsparadigm. Carina Edlund

Nada Tentamensdag 2004 okt 18 Tentamen Programmeringsparadigm Skrivtid 5 h

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

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

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

Föreläsning 5 i programmeringsparadigm.

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

Enjoy Vattenfallsmodellen i funktionella språk

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

Enjoy Vattenfallsmodellen i funktionella språk

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

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.

Börja med att kopiera källkoden till din scheme-katalog (som du skapade i Laboration 1).

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

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

DD1361 Programmeringsparadigm HT15

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.

Föreläsning 8. Hudak kapitel 13. 2D1370 Funktionell programmering v15 torsdag

Klassdeklaration. Metoddeklaration. Parameteröverföring

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Checklista. Föreläsning 1-2 Innehåll. Programmering.

Funktionell programmering DD1361

2. 1 L ä n g d, o m k r e t s o c h a r e a

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

Introduktion till programmering SMD180. Föreläsning 4: Villkor och rekursion

Svar och arbeta vidare med Student 2008

Introduktion till Haskell

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

9 Geometriska begrepp

Föreläsning 5-6 Innehåll

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

Extramaterial till Matematik Y

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

Några inbyggda funktioner (med resultat!) Introduktion till programmering D0009E. Föreläsning 4: Villkor och rekursion. Modulus-operatorn.

JavaScript del 3 If, Operatorer och Confirm

Matematik CD för TB = 5 +

Polygoner. Trianglar på tre sätt

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Om att lära sig programmera. Föreläsning 1-2 Innehåll.

Parameteröverföring. Exempel. Exempel. Metodkropp

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

Funktioner. Räta linjen

Användarhandledning Version 1.2

Sidor i boken KB 6, 66

8-6 Andragradsekvationer. Namn:..

kl Tentaupplägg

TDDC74 PROGRAMMERING: ABSTRAKTION OCH MODELLERING VT 2017

Föreläsning 11: Beräkningsgeometri

Imperativ programmering

DD1361 Programmeringsparadigm HT17

Introduktion till programmering D0009E. Föreläsning 5: Fruktbara funktioner

kl Tentaupplägg

Lokala mål i matematik

5B1134 Matematik och modeller

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

En parallellogram har delats i två delar P och Q som figuren visar. Vilket av följande påståenden är säkert sant?

Lathund, geometri, åk 9

Laboration 1: Figurer i hierarki

I kapitel 15 gör Hudak för reaktiva animeringar detsamma som han i kapitel 13 gör för animeringar. Resultatet är en module Fal.

Kapitel 4. cos(64 )= s s = 9 cos(64 )= 3.9m. cos(78 )= s s = 9 cos(78 )= 1.9m. a) tan(34 )= x x = 35 tan(34 )= 24cm

TDDC74 Programmering: Abstraktion och modellering Tentamen, onsdag 19 oktober 2016, kl 14 18

Syfte : Lära sig objektorienterad programmering Syfte : Lära sig programmering i ett OO-språk vilket?

PLANGEOMETRI I provläxa med facit ht18

Provet består av Del I, Del II, Del III samt en muntlig del och ger totalt 76 poäng varav 28 E-, 24 C- och 24 A-poäng.

Introduktion till formella metoder Programmeringsmetodik 1. Inledning

Classes och Interfaces, Objects och References, Initialization

Extramaterial till Matematik Y

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

TDIU01 - Programmering i C++, grundkurs

SKOLORNAS MATEMATIKTÄVLING Svenska Matematikersamfundet. Lösningsförslag till naltävlingen den 20 november 2004

Utsagor (Propositioner) sammansatta utsagor sanningstabeller logisk ekvivalens predikat (öppna utsagor) kvantifierare Section

Föreläsning 13 Linjär Algebra och Geometri I

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

Geometri och statistik Blandade övningar. 1. Vid en undersökning av åldern hos 30 personer i ett sällskap erhölls följande data

Lösningar till udda övningsuppgifter

Trigonometri. Sidor i boken 26-34

Planering Programmering grundkurs HI1024 HT data

Trepoängsproblem. Kängurutävlingen 2014 Junior. 1 Bilden visar tre kurvor med längderna a, b respektive c. Vilket av följande påståenden är korrekt?

Planering Programmering grundkurs HI1024 HT TIDAA

Matte Direkt Borgen 6 A Läraranvisning punktskrift. Verksnummer: 40270

Universitetet i Linköping Institutionen för datavetenskap Anders Haraldsson 2

DD1361 Programmeringsparadigm HT16

Repetitionsprov på algebra, p-q-formeln samt andragradsfunktioner

Dagens föreläsning Programmering i Lisp Fö 5

Deklarativt programmeringsparadigm

Matematik CD för TB. x + 2y 6 = 0. Figur 1:

4-8 Cirklar. Inledning

Övningshäfte 1: Logik och matematikens språk

Känguru 2018 Student gymnasieserien i samarbete med Jan-Anders Salenius (Brändö gymnasium)

TDDC74 Programmering: Abstraktion och modellering Tentamen, lördag 27 augusti 2016, kl 8 12

GeoGebra i matematikundervisningen - Inspirationsdagar för gymnasielärare. Karlstads universitet april. Utforskande aktivitet med GeoGebra

Tema: Pythagoras sats. Linnéa Utterström & Malin Öberg

Sidor i boken Figur 1:

Transkript:

Föreläsning 8. Paradigmöversikt, paradigmhistoria, paradigmgeografi. Se även föreläsning 1. Användning av Prolog. Haskell kan i princip användas till mycket, men grafiska paket, kopplingar till färdiga grafika komponenter p s s som i Java-biblioteket för Java osv är inte kommersiella produkter och finns nog mest inom den akademiska värden. Prolog har framför allt används inom AI ( Articifial Intellegence), och speciellt i Europa. I USA har lisp (som är ett tidigt funktionellt språk) används inom AI. Komplettering Laboration Att komma igång med Prolog. På /info/progp02/prolog/happypersons.pl finns datbasen på Brna sid 21. Använd den för att göra några körningar.

Funktioner, predikat och relationer. Funktioner kan ses som avbildningar, "mappningar", från värden i en definitonsmängd (domän) till värden i en värdemängd (range) : f :: A -> B a d b s t Endast en pil från varje värde Funktioner som har som värdemängd värdena True och False i typen Bool kallas predikat: (a, b) (a, c) (x, y) p :: (A, B) -> Bool True False Skrivs i Prolog i en "databas" som hängerihop(a, b). hängerihop(a, c). Dvs vi skriver bara det som är sant. Endast en pil från varje värde Prolog skriver vi i regel endast ut det som anses sant. Allt som inte är sant är nog osant. Eftersom p (a, b) = True och p (a, c) = True (se bilden i ovan) kan man se predikat som att värdet a av typen A "hänger ihop med" både värden c oh d av typen B. Vi kan rita detta som a hängerihop :: A -> B Flera pilar från varje värde. hängerihop är därför ej en funktion, utan en relation. b c Skrivs i Prolog i en "databas" som hängerihop(a, b). hängerihop(a, c). Betyder att det är sant att a hänger ihop med b och att det är sant att a hänger ihop med c. Brna: De två raderna ovan är ett predikat med två satser (clause) och predeikatnamnet hängerihop Märk att vi struntar i osanna saker, dvs eftersom p(x, y) = False så skrivs inte detta i "databasen". Värden kallas i Prolog konstanter. Konstanter är atomer eller tal (numbers). I denna kurs kommer vi mest att syssla med atomer, som är namn som börjar med små bokstäver.

Körning av sictus i emacs. Terminolgi mm. en sats, ett faktum fyra satser (clause), alla fakta sats (clause), fakta mål (goal) predikatnamn argument (en konstant, en atom) wise(jane). woman(jean). woman(jane). woman(joan). woman(pat). I det övre emacsfönstret skriver vi en databas med predikat, vad vi anser vara sant. två satser, fakta tre satser, fakta wealthy(jane). wealthy(jim). healthy(jim). healthy(jane). healthy(jean). Detta är databasen på sid 21 i Brna. Finns på /info/progp02/prolog/happypersons.pl. Lek med denna databas i första labben. tre satser, regler (rules, non-unit clauses) happy(p) :- healthy(p), woman(p). happy(p) :- wealthy(p), woman(p). happy(p) :- wise(p), woman(p). eller (disjunction) uttrycks i Prolog med flera satser för samma prdikat mål huvud (head) <= if mål implikation mål och conjunction kropp (body) regel (rule, non-unit clause)?- woman(jane). fråga (query) yes svar ( True enl databasen) {source_info} fråga (query)?- happy(r). med logisk variabel R = jane? yes {source_info}?- förslag till värde på R svar (med värdet enligt förslaget sant, dvs happy(jane) = True promt för ny fråga (query) argument (en logisk variabel) I det nedre emacsfönstret kan vi fråga databasen och få svar. emacsfönstret för minibufferten

Prolog och logisk programmering (och andra paradigm). Vad? Hur? Logik prog. Hels databasen kan läsas som logika utsagor. Prolog svarar alltid, korrekt och fort Hels databasen kan läsas som logika utsagor (deklarativ läsning) men har även en procedurell läsning Prolog svarar alltid, korrekt. Procdurella läsningen beskriver hur och hur fort. Databasen innehåller "fusk", saker som endast har procedurell läsning. "fusket" gör bl a att Prolog svarar snabbare ibland och kan göra det som vanliga programspråk kan. Pardiso Prolog Pure Prolog Non-pure Prolog Ofta realiteten Funk. prog. Haskell kan läsas som definitioner av typer och värden ("vanliga värden" funktioner) Hugs beräknar uttryck Hugs beräknar uttryck p ss som i matte. Typer kollas, viktigt att rekursion slutar i basfall och att det finns ekvationer för alla fall Imperativ OO Pardiso Haskell Haskell körning Java-program (metoderna) har mest en procedurell läsning Java-tolken kör metoderna Java

Haskell-delen av augustitentan. 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. Förslag till svar : 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

Typer och programmeringstil i Haskell. När vi definerade ett schack gjorde vi så här: newtype Chess = Chess [(Square, Chessman)] -- data ist f newtype OK deriving Show -- newtype effektivare -- data krävs om >1 konstruerare. dvs ett schack är en lista med par av rutor och pjäser på denna ruta. Men listan föregås av konstrueraren Chess för att vi skall få typen Chess och inte typen [(Square, Chessman)]. Vi "stoppar in" listan i en "påse" med konstueraren Chess. När vi vill jobba med listan måste vi därför "plocka ut" listan, detta kan man i regel göra med mönstermatchning. Vill vi så göra ett nytt schack måste vi "stoppa in" den nya listan i påse genom att använda konstueraren Chess. T ex newboard:: [(Square, Chessman)] -> Chess -> Chess newboard ((sq, cm):csqcms) (Chess b) = newboard csqcms (Chess (update sq cm b)) newboard [] b = b Funktionen update jobbar nu med en lista : update :: Square -> Chessman -> [(Square, Chessman)] -> [(Square, Chessman)] Denna funktion kan man nu jobba med som man är van vi, t ex använda map. Kan man inte helt ehkelt "bara komma ihåg" att ett schack är en lista [(Square, Chessman)], dvs låta bli att definiera en datatyp? Jo det går och är på sätt och vi enklare. newboard1 skulle då kunna se ut så här: newboard1:: [(Square, Chessman)] -> [(Square, Chessman)] -> [(Square, Chessman)] newboard1 ((sq, cm):csqcms) b = newboard1 csqcms (update sq cm b) newboard1 [] b = b Man får nu lite mindre hjälp av typ-systemet när man programmerar, och programmet blir (kanske?) lite mer svårläst. Ett mellanting får man genom att göra type Chess1 = [(Square, Chessman)] --typsynonym newboard1 fungerar nu på samma sätt som förut men man kan om man vill ange dess typ som newboard1:: [(Square, Chessman)] -> Chess1 -> Chess1