Idag: Dataabstraktion Hur använder vi det vi hittills kan om Scheme för att realisera (implementera) sammansatta data? DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 1 / 16
Idag: Dataabstraktion Hur använder vi det vi hittills kan om Scheme för att realisera (implementera) sammansatta data? Hur separerar man datastrukturen från resten av ett program så att ändringar i datastrukturen inte påverkar resten av programmet? DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 1 / 16
Idag: Dataabstraktion Hur använder vi det vi hittills kan om Scheme för att realisera (implementera) sammansatta data? Hur separerar man datastrukturen från resten av ett program så att ändringar i datastrukturen inte påverkar resten av programmet? Bra om du läst följande avsnitt i AS: Inledningen i avsnittet: Building Abstractions with Data Introduction to Data Abstraction DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 1 / 16
Exempel rationella tal De flesta Scheme-varianterna har någon form av stöd för rationella tal men Scheme väljer ganska fritt hur presentationen skall ske och växlar mellan olika former av presentationsformat DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 2 / 16
Exempel rationella tal De flesta Scheme-varianterna har någon form av stöd för rationella tal men Scheme väljer ganska fritt hur presentationen skall ske och växlar mellan olika former av presentationsformat Om man vill representera rationella tal exakt så duger alltså inte talrepresentationen i Scheme. DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 2 / 16
Exempel rationella tal De flesta Scheme-varianterna har någon form av stöd för rationella tal men Scheme väljer ganska fritt hur presentationen skall ske och växlar mellan olika former av presentationsformat Om man vill representera rationella tal exakt så duger alltså inte talrepresentationen i Scheme. Ett rationellt tal kan skrivas som ett bråk: 2 3, 1219 150, 10 15 DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 2 / 16
Exempel rationella tal De flesta Scheme-varianterna har någon form av stöd för rationella tal men Scheme väljer ganska fritt hur presentationen skall ske och växlar mellan olika former av presentationsformat Om man vill representera rationella tal exakt så duger alltså inte talrepresentationen i Scheme. Ett rationellt tal kan skrivas som ett bråk: 2 3, 1219 150, 10 15 Vi kan använda en lista med två element för att lagra (representera) ett rationellt tal: > (list 2 3) (2 3) DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 2 / 16
Exempel rationella tal De flesta Scheme-varianterna har någon form av stöd för rationella tal men Scheme väljer ganska fritt hur presentationen skall ske och växlar mellan olika former av presentationsformat Om man vill representera rationella tal exakt så duger alltså inte talrepresentationen i Scheme. Ett rationellt tal kan skrivas som ett bråk: 2 3, 1219 150, 10 15 Vi kan använda en lista med två element för att lagra (representera) ett rationellt tal: > (list 2 3) (2 3) > (list 1219 150) (1219 150) DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 2 / 16
Exempel: rationella tal... Använder vi listor för att lagra täljare och nämnare kan de aritmetiska operationer för rationella tal implementeras på följande sätt, här endast addition och multiplikation: DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 3 / 16
Exempel: rationella tal... Använder vi listor för att lagra täljare och nämnare kan de aritmetiska operationer för rationella tal implementeras på följande sätt, här endast addition och multiplikation: (define +rat (lambda (x y) (list (+ (* (car x) (cadr y)) (* (car y) (cadr x))) (* (cadr x) (cadr y))))) DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 3 / 16
Exempel: rationella tal... Använder vi listor för att lagra täljare och nämnare kan de aritmetiska operationer för rationella tal implementeras på följande sätt, här endast addition och multiplikation: (define +rat (lambda (x y) (list (+ (* (car x) (cadr y)) (* (car y) (cadr x))) (* (cadr x) (cadr y))))) (define *rat (lambda (x y) (list (* (car x) (car y)) (* (cadr x) (cadr y))))) DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 3 / 16
Exempel: rationella tal... > (define x (list 2 3)) > DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 4 / 16
Exempel: rationella tal... > (define x (list 2 3)) > (define y (list 3 4)) > DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 4 / 16
Exempel: rationella tal... > (define x (list 2 3)) > (define y (list 3 4)) > (+rat x y) (17 12) > DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 4 / 16
Exempel: rationella tal... > (define x (list 2 3)) > (define y (list 3 4)) > (+rat x y) (17 12) > (*rat x y) (6 12) DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 4 / 16
Exempel: rationella tal... I och för sig fungerar den lösningen. Men den kan förbättras. T.ex. kan man minska minnesbehovet genom att använda par istället för listor för att lagra rationella tal. > (define x (cons 2 3)) > DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 5 / 16
Exempel: rationella tal... I och för sig fungerar den lösningen. Men den kan förbättras. T.ex. kan man minska minnesbehovet genom att använda par istället för listor för att lagra rationella tal. > (define x (cons 2 3)) > (define y (cons 3 4)) > DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 5 / 16
Exempel: rationella tal... I och för sig fungerar den lösningen. Men den kan förbättras. T.ex. kan man minska minnesbehovet genom att använda par istället för listor för att lagra rationella tal. > (define x (cons 2 3)) > (define y (cons 3 4)) > (+rat x y) När det sista uttrycket beräknas, kommer Scheme att klaga på att proceduren cadr har ett par som argument. Man måste byta alla cadr mot cdr. DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 5 / 16
Exempel: rationella tal... (define +rat (lambda (x y) (cons (+ (* (car x) (cdr y)) DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 6 / 16
Exempel: rationella tal... (define +rat (lambda (x y) (cons (+ (* (car x) (cdr y)) (* (car y) (cdr x))) DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 6 / 16
Exempel: rationella tal... (define +rat (lambda (x y) (cons (+ (* (car x) (cdr y)) (* (car y) (cdr x))) (* (cdr x) (cdr y))))) DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 6 / 16
Exempel: rationella tal... (define +rat (lambda (x y) (cons (+ (* (car x) (cdr y)) (* (car y) (cdr x))) (* (cdr x) (cdr y))))) osv (define *rat (lambda (x y)... DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 6 / 16
Exempel: rationella tal... (define +rat (lambda (x y) (cons (+ (* (car x) (cdr y)) (* (car y) (cdr x))) (* (cdr x) (cdr y))))) osv (define *rat (lambda (x y)... Det krävs många ändringar i stora program när man vill ändra datastrukturen. DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 6 / 16
Dataabstraktion Vad man kan göra istället är att skriva en uppsättning konstruktorer och selektorer som hanterar datastrukturen. Procedurer som +rat och *rat anropar då inte car och cdr direkt, utan anropar istället konstruktorerna och selektorerna. DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 7 / 16
Dataabstraktion Vad man kan göra istället är att skriva en uppsättning konstruktorer och selektorer som hanterar datastrukturen. Procedurer som +rat och *rat anropar då inte car och cdr direkt, utan anropar istället konstruktorerna och selektorerna. En konstruktor är en procedur som skapar en (tillämpningsspecifik) typ av dataobjekt. DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 7 / 16
Dataabstraktion Vad man kan göra istället är att skriva en uppsättning konstruktorer och selektorer som hanterar datastrukturen. Procedurer som +rat och *rat anropar då inte car och cdr direkt, utan anropar istället konstruktorerna och selektorerna. En konstruktor är en procedur som skapar en (tillämpningsspecifik) typ av dataobjekt. (define make-rat (lambda (numer denom) (list numer denom))) DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 7 / 16
Dataabstraktion... En selektor är en procedur som returnerar en del av ett (tillämpningsspecifikt) dataobjekt. (define numer (lambda (rat) (car rat))) DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 8 / 16
Dataabstraktion... En selektor är en procedur som returnerar en del av ett (tillämpningsspecifikt) dataobjekt. (define numer (lambda (rat) (car rat))) (define denom (lambda (rat) (cadr rat))) DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 8 / 16
Dataabstraktion... Med hjälp av konstruktorn och selektorerna kan de aritmetiska operationerna skrivas så: (define +rat (lambda (x y) (make-rat (+ (* (numer x) (denom y)) (* (numer y) (denom x))) (* (denom x) (denom y))))) DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 9 / 16
Dataabstraktion... Med hjälp av konstruktorn och selektorerna kan de aritmetiska operationerna skrivas så: (define +rat (lambda (x y) (make-rat (+ (* (numer x) (denom y)) (* (numer y) (denom x))) (* (denom x) (denom y))))) (define *rat (lambda (x y) (make-rat (* (numer x) (numer y)) (* (denom x) (denom y))))) DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 9 / 16
Dataabstraktion... Vi har lagt till ett isolerande skikt mellan de aritmetiska operationerna och datastrukturen: +rat, *rat,... DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 10 / 16
Dataabstraktion... Vi har lagt till ett isolerande skikt mellan de aritmetiska operationerna och datastrukturen: +rat, *rat,... aritmetiska regler (operationer) DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 10 / 16
Dataabstraktion... Vi har lagt till ett isolerande skikt mellan de aritmetiska operationerna och datastrukturen: +rat, *rat,... aritmetiska regler (operationer) DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 10 / 16
Dataabstraktion... Vi har lagt till ett isolerande skikt mellan de aritmetiska operationerna och datastrukturen: +rat, *rat,... aritmetiska regler (operationer) make-rat, numer, denom DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 10 / 16
Dataabstraktion... Vi har lagt till ett isolerande skikt mellan de aritmetiska operationerna och datastrukturen: +rat, *rat,... aritmetiska regler (operationer) make-rat, numer, denom dataabstraktion DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 10 / 16
Dataabstraktion... Vi har lagt till ett isolerande skikt mellan de aritmetiska operationerna och datastrukturen: +rat, *rat,... aritmetiska regler (operationer) make-rat, numer, denom dataabstraktion DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 10 / 16
Dataabstraktion... Vi har lagt till ett isolerande skikt mellan de aritmetiska operationerna och datastrukturen: +rat, *rat,... aritmetiska regler (operationer) make-rat, numer, denom dataabstraktion list, cons, car, cadr, cdr,... DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 10 / 16
Dataabstraktion... Vi har lagt till ett isolerande skikt mellan de aritmetiska operationerna och datastrukturen: +rat, *rat,... aritmetiska regler (operationer) make-rat, numer, denom dataabstraktion list, cons, car, cadr, cdr,... datastrukturer och språkprimitiver DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 10 / 16
Dataabstraktion... Om man nu vill använda par istället för listor, behöver man bara ändra make-rat och denom: (define make-rat (lambda (numer denom) (cons numer denom))) (define denom (lambda (rat) (cdr rat))) DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 11 / 16
Dataabstraktion... Vill man också ta bort gemensamma faktorer i täljaren och nämnaren i ett rationellt tal kan detta göras på två sätt: (define numer (lambda (rat) (let ((g (gcd (car rat) (cdr rat)))) (/ (car rat) g)))) (define denom (lambda (rat) (let ((g (gcd (car rat) (cdr rat)))) (/ (cdr rat) g)))) eller DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 12 / 16
Dataabstraktion... (define make-rat (lambda (numer denom) (let ((g (gcd numer denom))) (cons (/ numer g) (/ denom g))))) där det senare verkar mest naturligt man normaliserar vid konstruktion av ett rationellt tal. DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 13 / 16
Dataabstraktion... Resterande aritmetiska operationer för rationella tal: (define -rat (lambda (x y) (make-rat (- (* (numer x) (denom y)) (* (numer y) (denom x))) (* (denom x) (denom y))))) DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 14 / 16
Dataabstraktion... Resterande aritmetiska operationer för rationella tal: (define -rat (lambda (x y) (make-rat (- (* (numer x) (denom y)) (* (numer y) (denom x))) (* (denom x) (denom y))))) (define /rat (lambda (x y) (make-rat (* (numer x) (denom y)) (* (numer y) (denom x))))) DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 14 / 16
Dataabstraktion... (define =rat (lambda (x y) (= (* (numer x) (denom y)) (* (denom x) (numer y))))) DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 15 / 16
Dataabstraktion... (define =rat (lambda (x y) (= (* (numer x) (denom y)) (* (denom x) (numer y))))) (define print-rat (lambda (x) (newline) (display (numer x)) (display "/") (display (denom x)))) DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 15 / 16
Nästa gång: Hur gör man så generella procedurer att de klarar en hel klass av problem, DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 16 / 16
Nästa gång: Hur gör man så generella procedurer att de klarar en hel klass av problem, t.ex. alla sorters summeringar, som exempelvis nedanstående? DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 16 / 16
Nästa gång: Hur gör man så generella procedurer att de klarar en hel klass av problem, t.ex. alla sorters summeringar, som exempelvis nedanstående? b 0 om a > b i = b a + i annars i=a i=a+1 DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 16 / 16
Nästa gång: Hur gör man så generella procedurer att de klarar en hel klass av problem, t.ex. alla sorters summeringar, som exempelvis nedanstående? b 0 om a > b i = b a + i annars i=a i=a+1 eller 0 om a > b i = a + i annars a i b, a odd a+2 i b, a odd DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 16 / 16
Nästa gång: Hur gör man så generella procedurer att de klarar en hel klass av problem, t.ex. alla sorters summeringar, som exempelvis nedanstående? b 0 om a > b i = b a + i annars i=a i=a+1 eller 0 om a > b i = a + i annars a i b, a odd a+2 i b, a odd Läs gärna följande avsnitt i AS: Formulating Abstractions with Higher-Order Procedures men INTE: Procedures as General Methods Procedures as Returned Values DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 16 / 16