1 3H 0 2gre ordningens procedurer 6 1 Anonyma procedurer DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 1 / 18
1 3H 0 2gre ordningens procedurer 6 1 Anonyma procedurer 6 1 Objekt DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 1 / 18
1 3H 0 2gre ordningens procedurer 6 1 Anonyma procedurer 6 1 Objekt 6 1 Hur generaliseras procedurer? DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 1 / 18
1 3H 0 2gre ordningens procedurer 6 1 Anonyma procedurer 6 1 Objekt 6 1 Hur generaliseras procedurer? 6 1 Hur anv 0 1nds procedurer som argument? DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 1 / 18
1 3 6 1 H 0 2gre ordningens procedurer 6 1 Anonyma procedurer 6 1 Objekt 6 1 Hur generaliseras procedurer? 6 1 Hur anv 0 1nds procedurer som argument? 6 1 Bra om ni l 0 1st f 0 2ljande avsnitt i AS: Formulating Abstractions with Higher-Order Procedures men INTE: Procedures as General Methods Procedures as Returned Values DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 1 / 18
1 3 6 1 Anonyma procedurer En procedur som definieras p 0 2 f 0 2ljande s 0 1tt (define square (lambda (x) (* x x))) kallas f 0 2r en namngiven procedur. Sj 0 1lva lambda-uttrycket (lambda (x) (* x x)) kallas f 0 2r en anonym procedur. DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 2 / 18
1 3 6 1 Anonyma procedurer... En anonym procedur kan direkt anv 0 1ndas i en procedurapplikation: >((lambda (x) (* x x)) 3) 9 lika bra som namnet den bundits till. >(square 3) 9 DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 3 / 18
1 3Objekt 6 1 I Scheme kallas b 0 2de data och procedurer f 0 2r objekt. DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 4 / 18
1 3Objekt 6 1 I Scheme kallas b 0 2de data och procedurer f 0 2r objekt. 6 1 Alla typer av objekt kan namnges. DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 4 / 18
1 3 6 1 Objekt 6 1 I Scheme kallas b 0 2de data och procedurer f 0 2r objekt. 6 1 Alla typer av objekt kan namnges. 6 1 De kan 0 1ven anv 0 1ndas som argument till procedurer eller returneras som resultat av proceduranrop. DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 4 / 18
1 3Hur generalisera procedurdefinitioner? Procedurer kan vara argument till procedurer. DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 5 / 18
1 3Hur generalisera procedurdefinitioner? Procedurer kan vara argument till procedurer. F 0 2rst tittar vi p 0 2 n 0 2gra exempel med procedurer d 0 1r vi kan hitta m 0 2nster DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 5 / 18
1 3Hur generalisera procedurdefinitioner? Procedurer kan vara argument till procedurer. F 0 2rst tittar vi p 0 2 n 0 2gra exempel med procedurer d 0 1r vi kan hitta m 0 2nster Ex: 6Ь1 6Ь4 6Ь2 0 om a > b i = 6Ь4 6Ь3 a + i annars i=a i=a+1 DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 5 / 18
1 3Hur generalisera procedurdefinitioner? Procedurer kan vara argument till procedurer. F 0 2rst tittar vi p 0 2 n 0 2gra exempel med procedurer d 0 1r vi kan hitta m 0 2nster Ex: 6Ь1 6Ь4 6Ь2 0 om a > b i = 6Ь4 6Ь3 a + i annars i=a i=a+1 (define sum-int (lambda (a b) (if (> a b) DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 5 / 18
1 3Hur generalisera procedurdefinitioner? Procedurer kan vara argument till procedurer. F 0 2rst tittar vi p 0 2 n 0 2gra exempel med procedurer d 0 1r vi kan hitta m 0 2nster Ex: 6Ь1 6Ь4 6Ь2 0 om a > b i = 6Ь4 6Ь3 a + i annars i=a i=a+1 (define sum-int (lambda (a b) (if (> a b) 0 DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 5 / 18
1 3 6 1 Hur generalisera procedurdefinitioner? Procedurer kan vara argument till procedurer. F 0 2rst tittar vi p 0 2 n 0 2gra exempel med procedurer d 0 1r vi kan hitta m 0 2nster Ex: 6Ь1 6Ь4 6Ь2 0 om a > b i = 6Ь4 6Ь3 a + i annars i=a i=a+1 (define sum-int (lambda (a b) (if (> a b) 0 (+ a (sum-int (+ a 1) b))))) DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 5 / 18
1 3Hur generalisera procedurdefinitioner?... 6Ь1 6Ь4 6Ь2 0 om a > b i 2 = 6Ь4 6Ь3 a 2 + i 2 annars i=a i=a+1 DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 6 / 18
1 3Hur generalisera procedurdefinitioner?... 6Ь1 6Ь4 6Ь2 0 om a > b i 2 = 6Ь4 6Ь3 a 2 + i 2 annars i=a i=a+1 (define sum-square (lambda (a b) (if (> a b) DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 6 / 18
1 3Hur generalisera procedurdefinitioner?... 6Ь1 6Ь4 6Ь2 0 om a > b i 2 = 6Ь4 6Ь3 a 2 + i 2 annars i=a i=a+1 (define sum-square (lambda (a b) (if (> a b) 0 DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 6 / 18
1 3 6 1 Hur generalisera procedurdefinitioner?... 6Ь1 6Ь4 6Ь2 0 om a > b i 2 = 6Ь4 6Ь3 a 2 + i 2 annars i=a i=a+1 (define sum-square (lambda (a b) (if (> a b) 0 (+ (square a) (sum-square (+ a 1) b))))) DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 6 / 18
1 3Hur generalisera procedurdefinitioner?... i=a 1 i 6Ь1 6Ь4 6Ь2 0 om a > b = 1 6Ь4 6Ь3 a + 1 i annars i=a+1 DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 7 / 18
1 3Hur generalisera procedurdefinitioner?... i=a 1 i 6Ь1 6Ь4 6Ь2 0 om a > b = 1 6Ь4 6Ь3 a + 1 i annars i=a+1 (define sum-harm (lambda (a b) (if (> a b) DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 7 / 18
1 3Hur generalisera procedurdefinitioner?... i=a 1 i 6Ь1 6Ь4 6Ь2 0 om a > b = 1 6Ь4 6Ь3 a + 1 i annars i=a+1 (define sum-harm (lambda (a b) (if (> a b) 0 DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 7 / 18
1 3 6 1 Hur generalisera procedurdefinitioner?... i=a 1 i 6Ь1 6Ь4 6Ь2 0 om a > b = 1 6Ь4 6Ь3 a + 1 i annars i=a+1 (define sum-harm (lambda (a b) (if (> a b) 0 (+ (/ 1 a) (sum-harm (+ a 1) b))))) DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 7 / 18
1 3Hur generalisera procedurdefinitioner?... Alla procedurerna har det gemensamma m 0 2nstret: 6Ь1 6Ь4 6Ь2 0 om a > b f (i) = 6Ь4 6Ь3 f (a) + f (i) annars i=a i=a+1 DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 8 / 18
1 3Hur generalisera procedurdefinitioner?... Alla procedurerna har det gemensamma m 0 2nstret: 6Ь1 6Ь4 6Ь2 0 om a > b f (i) = 6Ь4 6Ь3 f (a) + f (i) annars i=a i=a+1 (define sum (lambda (a b f) (if (> a b) DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 8 / 18
1 3Hur generalisera procedurdefinitioner?... Alla procedurerna har det gemensamma m 0 2nstret: 6Ь1 6Ь4 6Ь2 0 om a > b f (i) = 6Ь4 6Ь3 f (a) + f (i) annars i=a i=a+1 (define sum (lambda (a b f) (if (> a b) 0 DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 8 / 18
1 3 6 1 Hur generalisera procedurdefinitioner?... Alla procedurerna har det gemensamma m 0 2nstret: 6Ь1 6Ь4 6Ь2 0 om a > b f (i) = 6Ь4 6Ь3 f (a) + f (i) annars i=a i=a+1 (define sum (lambda (a b f) (if (> a b) 0 (+ (f a) (sum (+ a 1) b f))))) DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 8 / 18
1 3Hur generalisera procedurdefinitioner?... sum kan anv 0 1ndas f 0 2r att definiera sum-int, sum-square, sum-harm: DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 9 / 18
1 3Hur generalisera procedurdefinitioner?... sum kan anv 0 1ndas f 0 2r att definiera sum-int, sum-square, sum-harm: (define sum-int (lambda (a b) (sum a b (lambda (x) x)))) DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 9 / 18
1 3 6 1 Hur generalisera procedurdefinitioner?... sum kan anv 0 1ndas f 0 2r att definiera sum-int, sum-square, sum-harm: (define sum-int (lambda (a b) (sum a b (lambda (x) x)))) (define sum-square (lambda (a b) (sum a b (lambda (x) (* x x))))) DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 9 / 18
1 3Hur generalisera procedurdefinitioner?... Om vi dessutom vill summera t. ex. 6Ь1 0 om a > b ф 6Ь4 6Ь2 i = a + ф i annars 6Ь4 6Ь3 a эi эb, a odd a+2 эi эb, a odd d 0 1r a m 0 2ste vara udda i f 0 2rsta anropet, annars fungerar inte formeln. DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 10 / 18
1 3Hur generalisera procedurdefinitioner?... Om vi dessutom vill summera t. ex. 6Ь1 0 om a > b ф 6Ь4 6Ь2 i = a + ф i annars 6Ь4 6Ь3 a эi эb, a odd a+2 эi эb, a odd d 0 1r a m 0 2ste vara udda i f 0 2rsta anropet, annars fungerar inte formeln. (define sum-odd (lambda (a b) (if (> a b) DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 10 / 18
1 3Hur generalisera procedurdefinitioner?... Om vi dessutom vill summera t. ex. 6Ь1 0 om a > b ф 6Ь4 6Ь2 i = a + ф i annars 6Ь4 6Ь3 a эi эb, a odd a+2 эi эb, a odd d 0 1r a m 0 2ste vara udda i f 0 2rsta anropet, annars fungerar inte formeln. (define sum-odd (lambda (a b) (if (> a b) 0 DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 10 / 18
1 3 6 1 Hur generalisera procedurdefinitioner?... Om vi dessutom vill summera t. ex. 6Ь1 0 om a > b ф 6Ь4 6Ь2 i = a + ф i annars 6Ь4 6Ь3 a эi эb, a odd a+2 эi эb, a odd d 0 1r a m 0 2ste vara udda i f 0 2rsta anropet, annars fungerar inte formeln. (define sum-odd (lambda (a b) (if (> a b) 0 (+ a (sum-odd (+ a 2) b))))) DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 10 / 18
1 3Hur generalisera procedurdefinitioner?... har vi m 0 2nstret: (define sum (lambda (a b) (if (> a b) DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 11 / 18
1 3Hur generalisera procedurdefinitioner?... har vi m 0 2nstret: (define sum (lambda (a b) (if (> a b) 0 DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 11 / 18
1 3Hur generalisera procedurdefinitioner?... har vi m 0 2nstret: (define sum (lambda (a b) (if (> a b) 0 (+ (term a) (sum (next a) b))))) d 0 1r term beskriver hur en term erh 0 2lls ur a DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 11 / 18
1 3 6 1 Hur generalisera procedurdefinitioner?... har vi m 0 2nstret: (define sum (lambda (a b) (if (> a b) 0 (+ (term a) (sum (next a) b))))) d 0 1r term beskriver hur en term erh 0 2lls ur a och next beskriver hur a skall 0 1ndras. DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 11 / 18
1 3Hur generalisera procedurdefinitioner?... Om vi definierar (define sum (lambda (a b term next) (if (> a b) DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 12 / 18
1 3Hur generalisera procedurdefinitioner?... Om vi definierar (define sum (lambda (a b term next) (if (> a b) 0 DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 12 / 18
1 3 6 1 Hur generalisera procedurdefinitioner?... Om vi definierar (define sum (lambda (a b term next) (if (> a b) 0 (+ (term a) (sum (next a) b term next))))) DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 12 / 18
1 3Hur generalisera procedurdefinitioner?... D 0 2 kan sum-int skrivas (define sum-int (lambda (a b) (sum a b (lambda (x) x) DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 13 / 18
1 3Hur generalisera procedurdefinitioner?... D 0 2 kan sum-int skrivas (define sum-int (lambda (a b) (sum a b (lambda (x) x) (lambda (a) (+ a 1))))) DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 13 / 18
1 3 6 1 Hur generalisera procedurdefinitioner?... D 0 2 kan sum-int skrivas (define sum-int (lambda (a b) (sum a b (lambda (x) x) (lambda (a) (+ a 1))))) sum-square kan skrivas (define sum-square (lambda (a b) (sum a b (lambda (x) (* x x)) (lambda (a) (+ a 1))))) DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 13 / 18
1 3Hur generalisera procedurdefinitioner?... sum-harm kan skrivas (define sum-harm (lambda (a b) (sum a b (lambda (x) (/ 1 x)) (lambda (a) (+ a 1))))) DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 14 / 18
1 3Hur generalisera procedurdefinitioner?... sum-harm kan skrivas (define sum-harm (lambda (a b) (sum a b (lambda (x) (/ 1 x)) (lambda (a) (+ a 1))))) sum-odd kan skrivas (define sum-odd (lambda (a b) (sum a b (lambda (x) x) DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 14 / 18
1 3 6 1 Hur generalisera procedurdefinitioner?... sum-harm kan skrivas (define sum-harm (lambda (a b) (sum a b (lambda (x) (/ 1 x)) (lambda (a) (+ a 1))))) sum-odd kan skrivas (define sum-odd (lambda (a b) (sum a b (lambda (x) x) (lambda (a) (+ a 2))))) DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 14 / 18
1 3 6 1 Hur generalisera procedurdefinitioner?... Nu kan vi g 0 2ra mycket komplexa summationsber 0 1kningar, t.ex. п = 8 ф i щ0 1 (4i + 1)(4i + 3) DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 15 / 18
1 3Hur generalisera procedurdefinitioner?... Med (define term (lambda (a) (/ 1 (* (+ (* 4 a) 1) (+ (* 4 a) 3))))) DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 16 / 18
1 3Hur generalisera procedurdefinitioner?... Med (define term (lambda (a) (/ 1 (* (+ (* 4 a) 1) (+ (* 4 a) 3))))) (define next (lambda (a) (+ a 1))) DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 16 / 18
1 3 6 1 Hur generalisera procedurdefinitioner?... Med (define term (lambda (a) (/ 1 (* (+ (* 4 a) 1) (+ (* 4 a) 3))))) (define next (lambda (a) (+ a 1))) (define pi (lambda (n) (* 8 (sum 0 n term next)))) DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 16 / 18
1 3Hur generalisera procedurdefinitioner?... f 0 2r vi > (pi 3) 3.017071817071817 > DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 17 / 18
1 3Hur generalisera procedurdefinitioner?... f 0 2r vi > (pi 3) 3.017071817071817 > (pi 100) 3.1366421888703013 > DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 17 / 18
1 3Hur generalisera procedurdefinitioner?... f 0 2r vi > (pi 3) 3.017071817071817 > (pi 100) 3.1366421888703013 > (pi 1000) 3.141093153121449 > DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 17 / 18
1 3 6 1 Hur generalisera procedurdefinitioner?... f 0 2r vi > (pi 3) 3.017071817071817 > (pi 100) 3.1366421888703013 > (pi 1000) 3.141093153121449 > (pi 10000) 3.1415426585893242 DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 17 / 18
1 3N 0 1sta g 0 2ng: Kan vi med v 0 2ra kunskaper i Scheme: 6 1 ber 0 1kna ett nollst 0 1lle till en funktion? DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 18 / 18
1 3N 0 1sta g 0 2ng: Kan vi med v 0 2ra kunskaper i Scheme: 6 1 ber 0 1kna ett nollst 0 1lle till en funktion? 6 1 hantera m 0 1ngder? DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 18 / 18
1 3N 0 1sta g 0 2ng: Kan vi med v 0 2ra kunskaper i Scheme: 6 1 ber 0 1kna ett nollst 0 1lle till en funktion? 6 1 hantera m 0 1ngder? Dessutom: DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 18 / 18
1 3N 0 1sta g 0 2ng: Kan vi med v 0 2ra kunskaper i Scheme: 6 1 ber 0 1kna ett nollst 0 1lle till en funktion? 6 1 hantera m 0 1ngder? Dessutom: 6 1 0 2r rekursiva ber 0 1kningar alltid av godo? DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 18 / 18
1 3N 0 1sta g 0 2ng: Kan vi med v 0 2ra kunskaper i Scheme: 6 1 ber 0 1kna ett nollst 0 1lle till en funktion? 6 1 hantera m 0 1ngder? Dessutom: 6 1 0 2r rekursiva ber 0 1kningar alltid av godo? 6 1 L 0 1s g 0 1rna f 0 2ljande avsnitt i AS: Procedures as General Methods Procedures as Returned Values Tree Recursion Orders of Growth Exponentiation Example: Representing Sets 7 1 DA2001 (F 0 2rel 0 1sning 8) Datalogi 1 H 0 2sten 2013 18 / 18