TDDC74 PROGRAMMERING: ABSTRAKTION OCH MODELLERING VT 2017 Jalal Maleki Institutionen för datavetenskap Linköpings universitet jalal.maleki@liu.se FÖRELÄSNING 1 Introduktion till kursen Schemespråkets grunder Enkla exempel OBS! ändringar i schemat för vissa PERSONAL Jalal Maleki, Anna Grabska Eklund Anders Märak-Leffler, Joel H Nilsson (Y1A) Simon Jönsson, Jens Grundmark (Y1B) Carl Ekman, Sebastian Fridell (Y1C) Jonas Wallgren, Carl Valjus (MAT1 + andra) Andreas Norrstig, William Thelin (MED1) Sven Engström 1 2 3 SYFTE Kursens syfte är att studenterna ska utveckla förmåga att representera och lösa problem med hjälp av konstruktioner i datorspråk. Efter avslutad kurs ska studenterna kunna: redogöra för grundläggande datavetenskapliga begrepp relaterade till programmering och programspråk, särskilt funktionella språk metodiskt lösa programmeringsrelaterade problem i en interaktiv programutvecklingsmiljö representera problem och lösningar till dessa i form av rekursiva och iterativa algoritmer och kunna uppskatta tid- och rymdkomplexiteten för enklare fall konstruera abstraktioner som möjliggör design av program som är lättförståliga, återanvändbara och kan underhållas lättare genomföra ett mindre programmeringsprojekt ORGANISATION Föreläsningar Lektioner Laborationer Projekt Datorduggor Datortentamen EXAMINATION DAT1 Datortentamen / duggor (U,3,4,5) 2 hp LAB1 Laborationer (U, G) 3 hp PRA1 Projekt (U,3,4,5) 3 hp Slutbetyget på kursen baseras i första hand på betyget på DAT1. Men betyg 3 eller 4 i DAT1 kan höjas - se kurshemsidan 4 5 6
KURSHEMSIDAN Vi försöker hålla kurshemsidan aktuell. Använd hemsidan. Det brukar finnas en hel del information där, inte minst (ev) tentafrågor. Svar till en hel del administrativa frågor finns på kurshemsidan. http://www.ida.liu.se/~tddc74 KURSBOKEN SICP De tre första kapitlen ingår i denna kurs. Finns på nätet mitpress.mit.edu/sicp/ KURSBOKENS INNEHÅLL SICP1 Abstraktioner baserad på procedurer SICP2 Abstraktioner baserat på data SICP3 Abstraktioner baserat på objekt 7 8 9 DR.RACKET Systemet vi skall använda för programmering heter DrRacket www.racket-lang.org eller www.drracket.org DrRacket är en så kallad programmeringsmiljö som tillgängliggör olika verktyg för programmeraren PROGRAMMERING Formulera beräkningsprocesser som bearbetar data som får datorn att välja mellan alternativa beräkningar som får datorn att snurra som löser ett angivet problem i ett programspråk Representera/modellera/avbilda PROGRAMMERING OCH MATLAGNING Program liknar matrecept, t ex recept för pannkakor Programmering liknar kockens arbete i receptproduktion Recept utförs av folk Program utförs av dator eller robot När pannkaksrecept utförs noga, får man pannkakor. Det kan också bli pannkakor av det hela :) - vanligtvis kockens fel Program utförs alltid noga. Det kan också leda till fel beteende i dator eller robot - vanligtvis pga fel i programmet 10 11 12
SCHEME: SPRÅKETS ELEMENT UTTRYCK I SCHEME KONSTANTER I SCHEME primitiva uttryck (primitive expressions) sammansättningsregler (means of combination) Primitiva uttryck (konstanter och namn) 1, 3.14, pi, + truth-value: #t, #f integer: 28, +1729, -2 (sanningsvärde) (heltal) abstraktioner (means of abstraction) form eller syntax innebörd eller semantik Sammansatta uttryck (bl a proceduranrop) (* pi 2) Nästlingsmöjlighet: (+ (* 2 3) (- 4 5)) prefixnotation (operator operand operand) jfr med infixnotation (operand operator operand) rational: 3/4, -22/7 floating: 3.1415, -10e10, 2e-3 complex: 3.1+4i, 2-3i (bråk) (flyttal) (komplext tal) 13 14 15 NAMN I SCHEME TOLKNING: READ-EVAL-PRINT SAMMANSATTA UTTRYCK Ett namn är en ändlig följd av tecken som inte skapar en konstant i Scheme Namn får ej innehålla bryttecken som parenteser eller blanktecken Vissa namn är reserverade syntaktiska objekt Namn används för att benämna ett värde eller en procedur + square seriously? @fstops i-am-a-name-in-scheme http://www.google.com/ -1+ 2+2 Read --- läs ett uttryck Evaluate --- tolka uttrycket Print --- skriv ut resultatet >(+ 2 (* 3 4)) 14 >(define x 3) >(+ 2 x) 5 >(define (dubbla n) (* n 2)) >(dubbla 9) 18 Applikation av inbyggda procedurer (inbyggd-fn argument-1 argument-2 argument-n) Applikation av användardefinierade procedurer (användar-fn argument-1 argument-2... argument-n) Undantagsformer (if villkor då-uttrycket annars-uttrycket) (and uttryck-1 uttryck-2 uttryck-n) (or uttryck-1 uttryck-2... uttryck-n) Abstractionsmöjligheter (define namn värde) (lambda parametrar kropp) 16 17 18
FUNKTION INOM MATEMATIK FUNKTION I SCHEME LAMBDAABSTRAKTION D = {..., -2, -1, 0, 1, 2,...} R = {..., -2, -1, 0, 1, 2,...} Funktion f(x) = x 2 f={..., < -2, 4 >, < -1, 1 >, < 0, 0 >, < 1, 1 >,...} D= {, -2, -1, 0, 1, } R= {, 4, 1, 0, 1, } D R Maskin eller en procedur som utför mappningen av mängden D till mängden R Precis beskrivning (algoritm) för hur en beräkning skall gå till (lambda (n) (* n n)) (lambda (r) (* 2 (* pi r))) (lambda (f) (* (/ 5 9) (- f 32))) (lambda (n) (* n n)) definierar en anonym funktion som kan beräkna kvadraten av sin parameter Det som skapas av detta uttryck brukar vi också kalla för procedurobjekt för att markera att det är en sak parametrar: (n) kropp: (* n n) 19 20 21 PROCEDURAPPLIKATION ((lambda (n) (* n n)) 7) Proceduren med parametern n appliceras till argumentet 7 Vi brukar också säga att proceduren anropas Parameter: n Kropp: (* n n) Argument: 7 Returvärde: 49 PARENTESER Parenteser är till för att definiera strukturen för sammansatta uttryck eller beskrivningar Parenteser möjliggör korrekt tolkning av programmen i Scheme ((lambda (n) (* n n)) 7) UNDANTAGFORMER I SCHEME Konstruktioner som är undantagna från vanlig hantering av funktioner i Scheme, Vad som utgör vanlig hantering beskrivs senare. Några följer: Villkorliga beräkningar if cond Logiska operationer som sätter samman flera villkor and or 22 23 24
IF (if villkor då-uttryck annars-uttryck) (if (< amount 10000) 0.5 1.5)) Om beloppet är mindre än 10000 då skall beräkningen ge resultatet 0.5 annars 1.5 COND (cond (villkor-1 då-uttryck-1) (villkor-2 då-uttryck-2)... (villkor-n då-uttryck-n)) (lambda (amount) (cond ((< amount 0) 0) ((< amount 10000) 0.5) ((< amount 50000) 1.5) ((>= amount 50000) 2.5))) 25 26 27 ELSE (lambda (amount) (cond ((< amount 0) 0) ((< amount 10000) 0.5) ((< amount 50000) 1.5) ((>= amount 50000) 2.5))) (lambda (amount) (cond ((< amount 0) 0) ((< amount 10000) 0.5) ((< amount 50000) 1.5) (else 2.5))) EXEMPEL PÅ LOGISKA OPERATORER (and e 1,, e n ) (or e 1,, e n ) (not e 1 ) (and (> x 2) (< x -2)) (or (> x 2) (< x -2)) (not (< x 3)) ABSTRAKTIONSOPERATORER define lambda Gruppering av procedurer 28 29 30
DEFINE Används för att tilldela namn till konstanter eller procedurobjekt För tillfället kan vi anta att define har tillgång till tabeller där namnen lagras. KOMBINATION AV LOGISKA OPERTORATORER (or (and (> x 2) (< x 6)) (and (> x -6) (< x -2))) (not (or (> x 1) (< x -1))) LAMBDAUTTRYCK (lambda parametrar kropp) Skapar ett objekt som givet ett antal argument (lika många som de angivna parametrarna) kan beräkna ett värde som motsvarar evaluering av kroppen 31 32 33 ABSTRAKTION I SCHEME: ATT NAMNGE SAKER (define ten 10) (define square (lambda (n) (* n n))) (define circle-area (lambda (r) (* pi (square r)))) NAMNGIVNING AV FUNKTIONER Följande två sätt att definiera funktionen area är ekvivalenta: (define area (lambda (r) (* pi (square r)))) (define (area r) (* pi (square r))) EVALUERING AV FUNKTIONSANROP För att evaluera ett anrop som (fn arg1 arg2 argn) Evaluera fn till det entitet den representerar Evaluera argumenten arg1 arg2 argn Ersätt förekomster av parametrar i procedurobjektets kropp med motsvarande argument och evaluera sedan kroppen Detta sätt kallas för det applikativa substitutionsmodellen för beräkning 34 35 36
UNDANTAGSFORMEN IF Medan alla funktionsanrop evalueras enligt en och samma regel som beskrevs nyss, evalueras undantagsformer (special forms) på annat sätt t ex (if villkor då-uttryck annars-uttrycket) Evaluera villkor, om sant evaluera sedan då-uttrycket annars evaluera annars-uttrycket Resultatet blir antingen värdet på då-uttrycket eller annars-uttrycket SPECIALFORMEN COND (cond (villkor-1 då-uttryck-1) (villkor-2 då-uttryck-2)... (villkor-n då-uttryck-n)) Evaluera villkor-1, om sant, evaluera sedan då-uttryck-1, annars gå till nästa i ordningen Någon av villkoren måste vara sant annars blir det fel Genom att låta villkor-n vara nyckelordet ELSE garanterar vi att då-uttryck-n evalueras i fall de tidigare villkoren varit falska. Så här: (cond (villkor-1 då-uttryck-1) (villkor-2 då-uttryck-2)... (ELSE då-uttryck-n)) SPECIALFORMEN AND (and arg-1 arg-2...) Evaluera argumenten från vänster till höger tills ett falskt värde #f fås, i så fall är and-uttryckets värde #f, annars #t. 37 38 39 SPECIALFORMEN OR (or arg-1 arg-2...) Evaluera argumenten från vänster till höger till ett #t värde fås, i så fall är värdet på or-uttrycket #t, annars #f FÖLJANDE ÄR EKVIVALENTA (cond ((> x 0) x) ((= x 0) 0) ((< x 0) (- x))) (cond ((> x 0) x) ((= x 0) 0) (else (- x))) (if (> x 0) x (if (= x 0) 0 (- x))) PROGRAMEXEMPEL: AVSTÅNDET MELLAN TVÅ PUNKTER (define distance (lambda (x1 y1 x2 y2) ( s q r t ( + ( s q u a r e ( - x 2 x 1 ) ) ( s q u a r e ( - y 2 y 1 ) ) ) ) ) ) (define square (lambda (n) (* n n))) 40 41 42
SUBSTITUTIONSMODELLEN (distance 0 0 3 4) (sqrt (+ (square (- 3 0)) (square (- 4 0)))) (sqrt (+ (square 3) (square 4))))) (sqrt (+ (* 3 3) (* 4 4))) (sqrt (+ 9 16)) (sqrt 25) 5 PROGRAMMERING Formulera beräkningsprocesser som bearbetar data som får datorn att välja mellan alternativa beräkningar som får datorn att snurra som löser ett angivet problem i ett programspråk Representera/modellera/avbilda REKURSION Rekursion är ett sätt att få datorn att snurra Rekursion är ett sätt att bryta ner problem till enklare (mindre) problem Beräkningar definieras i termer av sig själva Ett termineringsfall är alltid nödvändigt Ganska vanligt inom matten, t ex, n! = n(n-1)! när n > 0 0! = 1 43 44 45 BERÄKNINGS AV FAKULTET: 0! = 1, N! = N * (N-1)! (define fact (lambda (n) (if (= n 0) 1 (* n (fact (- n 1)))))) SUBSTITUTIONSMODELLEN Använd substitution för att beräkna (fact 4): (fact 4) (* 4 (fact 3)) (* 4 (* 3 (fact 2))) (* 4 (* 3 (* 2 (fact 1)))) (* 4 (* 3 (* 2 (* 1 (fact 0))))) (* 4 (* 3 (* 2 (* 1 1)))) (* 4 (* 3 (* 2 1))) (* 4 (* 3 2)) (* 4 6) 24 ITERATIV FAKULETETSFUNKTION (define fact-iter (lambda (n result) (if (= n 0) result (fact-iter (- n 1) (* n result)))) I den extra parametern result samlas delresultatet av beräkningen 46 47 48
ITERATIV FAKULTETSFUNKTION - NÅGOT BÄTTRE (define fact (lambda (n) (fact-iter n 1) (define fact-iter (lambda (n result) (if (= n 0) result (fact-iter (- n 1) (* n result)))) Som tidigare har vi en funktion med en parameter. SUBSTITUTIONSMODEL (fact 4) (fact-iter 4 1) (fact-iter (- 4 1) (* 4 1)) (fact-iter 3 4) (fact-iter (- 3 1) (* 3 4)) (fact-iter 2 12) (fact-iter (- 2 1) (* 2 12)) (fact-iter 1 24) (fact-iter (- 1 1) (* 1 24)) (fact-iter 0 24) 24 FIBONACCITALEN (define fib (lambda (n) (cond ((= n 0) 0) ((= n 1) 1) (else (+ (fib (- n 1)) (fib (- n 2))))))) 49 50 51 ITERATIV FIBONACCI (define fibi (lambda (n) (cond ((= n 0) 0) ((= n 1) 1) (else (fiter n 0 1 1))))) (define fib-iter (lambda (n f0 f1 count) (if (= count n) f1 (fib-iter n f1 (+ f0 f1) (+ count 1))))) 52