INF2810: Funksjonell Programmering. Strømmer

Like dokumenter
INF2810: Funksjonell Programmering. Strømmer

INF2810: Funksjonell Programmering. Køer, tabeller, og (litt om) parallelitet

INF2810: Funksjonell Programmering. Køer, tabeller, og (litt om) parallelitet

INF2810: Funksjonell Programmering. Mer om strømmer

INF2810: Funksjonell Programmering. Mer om strømmer

INF2810: Funksjonell Programmering. Strømmer og utsatt evaluering

INF2810: Funksjonell Programmering. Muterbare data

INF2810: Funksjonell Programmering. Strømmer og utsatt evaluering

INF2810: Funksjonell Programmering. Mer om verditilordning. Tabeller. Og strømmer.

INF2810: Funksjonell Programmering. Mer om verditilordning. Tabeller. Og strømmer.

INF2810: Funksjonell Programmering. Dataabstraksjon og Trerekursjon

INF2810: Funksjonell Programmering. Utsatt evaluering og strømmer

INF2810: Funksjonell Programmering. Utsatt evaluering og strømmer

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering. Kommentarer til prøveeksamen

UNIVERSITETET I OSLO

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering. Mer om verditilordning og muterbare data.

INF2810: Funksjonell Programmering. Mer om verditilordning og muterbare data.

INF2810: Funksjonell Programmering. Utsatt evaluering og strømmer

INF2810: Funksjonell Programmering. Eksamensforberedelser

INF2810: Funksjonell Programmering. Muterbare data

Rekursjon og lister. Stephan Oepen & Erik Velldal. 1. februar, Universitetet i Oslo

Høyere-ordens prosedyrer

INF2810: Funksjonell Programmering. Utsatt evaluering og strømmer

INF2810: Funksjonell Programmering. Muterbare data

UNIVERSITETET I OSLO

Side 1. Oppgave 1. Prosedyrer 1.1. Prosedyrene f og g skal begge returnere prosedyrer. a. Skriv f slik at ((f a) b) returnerer summen av a og b.

INF2810: Funksjonell Programmering. Lokale variabler. Og trær.

INF2810: Funksjonell Programmering. En metasirkulær evaluator, del 2

INF2810: Funksjonell Programmering. En metasirkulær evaluator, del 2

INF2810: Funksjonell Programmering. Lokale variabler. Og trær.

INF2810: Funksjonell Programmering. Lister og høyereordens prosedyrer

INF2810: Funksjonell Programmering. Lister og høyereordens prosedyrer

UNIVERSITETET I OSLO

INF2810: Funksjonell Programmering. Trær og mengder

(define (naer-nok-kuberot? y x) (< (abs (- (kube y) x)) 0.001)) (define (naermere-kuberot y x) (/ (+ (* y 2) (/ x (kvadrat y))) 3))

INF2810: Funksjonell Programmering. Tilstand og verditilordning

INF2810: Funksjonell Programmering. Tilstand og verditilordning

INF2810: Funksjonell Programmering. Trær og mengder

INF2810: Funksjonell Programmering. Trær og mengder

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme, del 2

Memoisering, utsatt evaluering og strømmer

Memoisering, utsatt evaluering og strømmer

INF2810: Funksjonell programmering: Mer om Scheme. Rekursjon og iterasjon.

INF2810: Funksjonell Programmering. Tilstand og verditilordning

UNIVERSITETET I OSLO

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme, del 2

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme, del 2

INF2810: Funksjonell Programmering. Mengder og lokal tilstand

INF2810: Funksjonell Programmering. Tilstand og verditilordning

Gjennomgåelse av eksamensoppgaven i HUMIT2710 fra våren 2004

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme

Eksamen i SLI230, vår 2003.

Par og Lister (først et par sider fra forrige uke) Par er byggestener for lister og trær og sammensatte datatyper.

INF2810: Funksjonell Programmering. En metasirkulær evaluator

INF2810: Funksjonell Programmering. En metasirkulær evaluator

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme

UNIVERSITETET I OSLO

Eksamen i HUMIT 2710, Funksjonell programmering, våren Ingen hjelpemidler er tillatt. <resten av forsiden> Side 1 av 7

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser

INF2810: Funksjonell Programmering. Mer om Scheme. Rekursjon og iterasjon.

INF2810: Funksjonell Programmering. Mer om Scheme. Rekursjon og iterasjon.

INF2810: Funksjonell Programmering. Mer om Scheme. Rekursjon og iterasjon.

Vi skal se på lambda-uttrykk. Følgende er definerte og vil bli brukt gjennom oppgaven

INF2810: Funksjonell Programmering. Eksamensforberedelser

INF2810: Funksjonell Programmering. Huffman-koding

INF2810: Funksjonell Programmering. Lister og høyereordens prosedyrer

Moderne Funksjonell Programmering i Lisp

INF2810: Funksjonell Programmering. Huffman-koding

Innlevering 2b i INF2810, vår 2017

Det er ikke tillatt med andre hjelpemidler enn de to sidene som er vedlagt oppgavesettet. Følgende funksjoner er definert og brukes i oppgaven:

INF2810: Funksjonell Programmering. Huffman-koding

Appendiks A Kontinuasjoner

Memoisering. I de følgende memoiseringeksemplene brukes tabeller, og vi tar derfor først en repetisjon av dette.

Par og Lister (først et par sider fra forrige uke) Par er byggestener for lister og trær og sammensatte datatyper.

LISP PVV-kurs 25. oktober 2012

Lisp 2: Lister og funksjoner

INF2810: Funksjonell Programmering. Huffman-koding

INF2810: Funksjonell programmering: Introduksjon

Rekursiv programmering

INF2810: Funksjonell Programmering. Huffmankoding

Forelesning 4 torsdag den 28. august

Innlevering 2a i INF2810, vår 2017

INF2810: Funksjonell programmering: Introduksjon

IN2040: Funksjonell programmering. Trær, mengder og huffmankoding

UNIVERSITETET I OSLO

Uke 4: z-transformasjonen

INF3140 Modeller for parallellitet INF3140/4140: Låser og Barrierer

Side om side. Trettende forelesning

MAT1030 Diskret Matematikk

INF2810: Funksjonell Programmering. Huffman-koding

Transkript:

INF2810: Funksjonell Programmering Strømmer Stephan Oepen & Erik Velldal Universitetet i Oslo 12. april 2013

Tema 2 Forrige uke Litt mer i dybden om køer Eksperiment: live-programmering Tabeller som hierarkiske lister Grunnleggende om parallelitet

Tema 2 Forrige uke Litt mer i dybden om køer Eksperiment: live-programmering Tabeller som hierarkiske lister Grunnleggende om parallelitet I dag Repetisjon: parallelitet Noe helt nytt: strømmer Litt mer live-programmering

(Assosiative) Tabeller 3 Også assosiative tabeller kan implementeres med cons-celler i bunnen. Lime sammen nøkkel, verdi -par som cons; så samle de som en liste. Noen operasjoner kan forenkles ved å sette én ekstra cons-celle foran. En slik headed list kan også bruke allerførste car som typemerkelapp.

En todimensjonal assosiativ tabell 4

Veldig kort om parallelitet (1/3) 5

Veldig kort om parallelitet (2/3) 6 Suppose that John, Luke, and Mark share a joint bank account that initially contains $100. Concurrently, John deposits $10, Luke withdraws $20, and Mark withdraws half the money in the account. John (set! balance (+ balance 10)) Luke (set! balance (- balance 20)) Mark (set! balance (- balance (/ balance 2)))

Veldig kort om parallelitet (2/3) 6 Suppose that John, Luke, and Mark share a joint bank account that initially contains $100. Concurrently, John deposits $10, Luke withdraws $20, and Mark withdraws half the money in the account. John (set! balance (+ balance 10)) Luke (set! balance (- balance 20)) Mark (set! balance (- balance (/ balance 2))) Hvor mange mulige sluttsaldoer, hvis hvert set!-uttrykk var atomært? Hvor mange muligheter uten hvilke som helst antakelser om rekkefølge? Hva er kritiske punkter med tanke på parallelitet og tidsdimensjonen?

Veldig kort om parallelitet (2/3) 6 Suppose that John, Luke, and Mark share a joint bank account that initially contains $100. Concurrently, John deposits $10, Luke withdraws $20, and Mark withdraws half the money in the account. John (set! balance (+ balance 10)) Luke (set! balance (- balance 20)) Mark (set! balance (- balance (/ balance 2))) Hvor mange mulige sluttsaldoer, hvis hvert set!-uttrykk var atomært? Hvor mange muligheter uten hvilke som helst antakelser om rekkefølge? Hva er kritiske punkter med tanke på parallelitet og tidsdimensjonen?

Veldig kort om parallelitet (3/3) 7 For å synkronisere rundt bruk av felles ressurser brukes semaphores; (aka mutex or lock) som ble først diskutert av Edsger Dijkstra (1965).

Veldig kort om parallelitet (3/3) 7 For å synkronisere rundt bruk av felles ressurser brukes semaphores; (aka mutex or lock) som ble først diskutert av Edsger Dijkstra (1965). Før kritisk avsnitt, få tak i semaphoren (acquire); Ved utgang fra kritisk avsnitt, slippe (release).

Veldig kort om parallelitet (3/3) 7 For å synkronisere rundt bruk av felles ressurser brukes semaphores; (aka mutex or lock) som ble først diskutert av Edsger Dijkstra (1965). Før kritisk avsnitt, få tak i semaphoren (acquire); Ved utgang fra kritisk avsnitt, slippe (release). Prosesser blokkeres under venting på semaphoren.

Veldig kort om parallelitet (3/3) 7 For å synkronisere rundt bruk av felles ressurser brukes semaphores; (aka mutex or lock) som ble først diskutert av Edsger Dijkstra (1965). Før kritisk avsnitt, få tak i semaphoren (acquire); Ved utgang fra kritisk avsnitt, slippe (release). Prosesser blokkeres under venting på semaphoren. (define (make-account) (let ((balance 0) (mutex (make-mutex))) (define (withdraw amount) (mutex acquire) (set! balance (- balance amount))) (mutex release) ))

Veldig kort om parallelitet (3/3) 7 For å synkronisere rundt bruk av felles ressurser brukes semaphores; (aka mutex or lock) som ble først diskutert av Edsger Dijkstra (1965). Før kritisk avsnitt, få tak i semaphoren (acquire); Ved utgang fra kritisk avsnitt, slippe (release). Prosesser blokkeres under venting på semaphoren. (define (make-account) (let ((balance 0) (mutex (make-mutex))) (define (withdraw amount) (mutex acquire) (set! balance (- balance amount))) (mutex release) )) Hver konto (som ressurs) har sin egen semaphore.

Tilbake til sekvenser som konvensjonell grensesnitt 8 (define (mystery low high) (define (recurse count sum) (cond ((> count high) sum) ((prime? count) (recurse (+ count 1) (+ count sum))) (else (recurse (+ count 1) sum)))) (recurse low 0))

Tilbake til sekvenser som konvensjonell grensesnitt 8 (define (mystery low high) (define (recurse count sum) (cond ((> count high) sum) ((prime? count) (recurse (+ count 1) (+ count sum))) (else (recurse (+ count 1) sum)))) (recurse low 0))? (mystery 1 5) Hva er formålet med mystery, og hva returnerer eksempelkallingen?

Tilbake til sekvenser som konvensjonell grensesnitt 8 (define (mystery low high) (define (recurse count sum) (cond ((> count high) sum) ((prime? count) (recurse (+ count 1) (+ count sum))) (else (recurse (+ count 1) sum)))) (recurse low 0))? (mystery 1 5) Hva er formålet med mystery, og hva returnerer eksempelkallingen? Ved bruk av høyreordensprosedyrer kan problemet løses elegantere : (define (sum-primes low high) (accumulate + 0 (filter prime? (interval low high))))

Tilbake til sekvenser som konvensjonell grensesnitt 8 (define (mystery low high) (define (recurse count sum) (cond ((> count high) sum) ((prime? count) (recurse (+ count 1) (+ count sum))) (else (recurse (+ count 1) sum)))) (recurse low 0))? (mystery 1 5) Hva er formålet med mystery, og hva returnerer eksempelkallingen? Ved bruk av høyreordensprosedyrer kan problemet løses elegantere : (define (sum-primes low high) (accumulate + 0 (filter prime? (interval low high)))) Kan vi finne noen relevante forskjell i tids- eller plasskompleksitet?

Begrensninger med sekvenser som konvensjonell grensesnitt 9 Satt på spissen, kan teknikken bli svært (og unødvendig) ueffisient:? (car (cdr (filter prime? (interval 100 100000)))) 103

Begrensninger med sekvenser som konvensjonell grensesnitt 9 Satt på spissen, kan teknikken bli svært (og unødvendig) ueffisient:? (car (cdr (filter prime? (interval 100 100000)))) 103 Det beregnes en lang sekvens, så én til, men bare fire elementer brukes. Helst ta vare på den elegante strukturen men bare beregne etter behov.

Begrensninger med sekvenser som konvensjonell grensesnitt 9 Satt på spissen, kan teknikken bli svært (og unødvendig) ueffisient:? (car (cdr (filter prime? (interval 100 100000)))) 103 Det beregnes en lang sekvens, så én til, men bare fire elementer brukes. Helst ta vare på den elegante strukturen men bare beregne etter behov. Utsatt evaluering (delayed evaluation) og strømmer gir oss begge deler. En strøm (stream) skal ha kontrakt som ligner på vanlige lister: (stream-car (cons-stream x y)) x (stream-cdr (cons-stream x y)) y

Begrensninger med sekvenser som konvensjonell grensesnitt 9 Satt på spissen, kan teknikken bli svært (og unødvendig) ueffisient:? (car (cdr (filter prime? (interval 100 100000)))) 103 Det beregnes en lang sekvens, så én til, men bare fire elementer brukes. Helst ta vare på den elegante strukturen men bare beregne etter behov. Utsatt evaluering (delayed evaluation) og strømmer gir oss begge deler. En strøm (stream) skal ha kontrakt som ligner på vanlige lister: (stream-car (cons-stream x y)) x (stream-cdr (cons-stream x y)) y Men elementene (untatt det første) blir først evaluert når de brukes.

Begrensninger med sekvenser som konvensjonell grensesnitt 9 Satt på spissen, kan teknikken bli svært (og unødvendig) ueffisient:? (car (cdr (filter prime? (interval 100 100000)))) 103 Det beregnes en lang sekvens, så én til, men bare fire elementer brukes. Helst ta vare på den elegante strukturen men bare beregne etter behov. Utsatt evaluering (delayed evaluation) og strømmer gir oss begge deler. En strøm (stream) skal ha kontrakt som ligner på vanlige lister: (stream-car (cons-stream x y)) x (stream-cdr (cons-stream x y)) y Men elementene (untatt det første) blir først evaluert når de brukes. Også tom strøm the-empty-stream og stream-null?-predikatet. For øyeblikket skal vi bare late som om disse var innebygget i Scheme.

Høyreordensprosedyrer for strømmer 10 Etter at grensesnittet er lik lister, kan filter, et al. lett adapteres: (define (stream-interval low high) (if (> low high) the-empty-stream (cons-stream low (stream-interval (+ low 1) high)))) (define (stream-filter predicate stream) (cond ((stream-null? stream) the-empty-stream) ((predicate (stream-car stream)) (cons-stream (stream-car stream) (stream-filter predicate (stream-cdr stream)))) (else (stream-filter predicate (stream-cdr stream)))))

Høyreordensprosedyrer for strømmer 10 Etter at grensesnittet er lik lister, kan filter, et al. lett adapteres: (define (stream-interval low high) (if (> low high) the-empty-stream (cons-stream low (stream-interval (+ low 1) high)))) (define (stream-filter predicate stream) (cond ((stream-null? stream) the-empty-stream) ((predicate (stream-car stream)) (cons-stream (stream-car stream) (stream-filter predicate (stream-cdr stream)))) (else (stream-filter predicate (stream-cdr stream))))) Nå litt live-programmering.

Høyreordensprosedyrer for strømmer 10 Etter at grensesnittet er lik lister, kan filter, et al. lett adapteres: (define (stream-interval low high) (if (> low high) the-empty-stream (cons-stream low (stream-interval (+ low 1) high)))) (define (stream-filter predicate stream) (cond ((stream-null? stream) the-empty-stream) ((predicate (stream-car stream)) (cons-stream (stream-car stream) (stream-filter predicate (stream-cdr stream)))) (else (stream-filter predicate (stream-cdr stream))))) Nå litt live-programmering. En strøm utsetter evalueringen av sin cdr inntill den blir etterspurt. Da styrer etterspørselen beregningsrekkefølge (computing on demand).

Uendelige strømmer 11 (define (integers-starting-from n) (cons-stream n (integers-starting-from (+ n 1))))

Uendelige strømmer 11 (define (integers-starting-from n) (cons-stream n (integers-starting-from (+ n 1)))) (define integers (integers-starting-from 1))

Uendelige strømmer 11 (define (integers-starting-from n) (cons-stream n (integers-starting-from (+ n 1)))) (define integers (integers-starting-from 1)) En strøm kan definere en uendelig sekvens uten å faktisk beregne den. Dette kan kombineres med andre strøm-prosedyrer og strømmer, f.eks. (define primes (stream-filter prime? integers))? (stream-ref primes 3)

Uendelige strømmer 11 (define (integers-starting-from n) (cons-stream n (integers-starting-from (+ n 1)))) (define integers (integers-starting-from 1)) En strøm kan definere en uendelig sekvens uten å faktisk beregne den. Dette kan kombineres med andre strøm-prosedyrer og strømmer, f.eks. (define primes (stream-filter prime? integers))? (stream-ref primes 3) 7

Uendelige strømmer 11 (define (integers-starting-from n) (cons-stream n (integers-starting-from (+ n 1)))) (define integers (integers-starting-from 1)) En strøm kan definere en uendelig sekvens uten å faktisk beregne den. Dette kan kombineres med andre strøm-prosedyrer og strømmer, f.eks. (define primes (stream-filter prime? integers))? (stream-ref primes 3) 7 (define (add-streams stream1 stream2) (stream-map + stream1 stream2))

Uendelige strømmer 11 (define (integers-starting-from n) (cons-stream n (integers-starting-from (+ n 1)))) (define integers (integers-starting-from 1)) En strøm kan definere en uendelig sekvens uten å faktisk beregne den. Dette kan kombineres med andre strøm-prosedyrer og strømmer, f.eks. (define primes (stream-filter prime? integers))? (stream-ref primes 3) 7 (define (add-streams stream1 stream2) (stream-map + stream1 stream2)) (define ones (cons-stream 1 ones))

Uendelige strømmer 11 (define (integers-starting-from n) (cons-stream n (integers-starting-from (+ n 1)))) (define integers (integers-starting-from 1)) En strøm kan definere en uendelig sekvens uten å faktisk beregne den. Dette kan kombineres med andre strøm-prosedyrer og strømmer, f.eks. (define primes (stream-filter prime? integers))? (stream-ref primes 3) 7 (define (add-streams stream1 stream2) (stream-map + stream1 stream2)) (define ones (cons-stream 1 ones))

Uendelige strømmer 11 (define (integers-starting-from n) (cons-stream n (integers-starting-from (+ n 1)))) (define integers (integers-starting-from 1)) En strøm kan definere en uendelig sekvens uten å faktisk beregne den. Dette kan kombineres med andre strøm-prosedyrer og strømmer, f.eks. (define primes (stream-filter prime? integers))? (stream-ref primes 3) 7 (define (add-streams stream1 stream2) (stream-map + stream1 stream2)) (define ones (cons-stream 1 ones)) (define integers (cons-stream 1 (add-streams ones integers)))

Previously on Twin Peaks: Fibonaccitall 12 For å illustrere nok en annen type rekursiv prosess skal vi se på en prosedyre for å beregne tall i den såkalte Fibonacci-rekken: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55,... Bortsett fra de to første er hvert tall gitt som summen av de to foregående. 0 hvis n = 0 fib(n) = 1 hvis n = 1 fib(n 1) + fib(n 2) ellers

Previously on Twin Peaks: Fibonaccitall 12 For å illustrere nok en annen type rekursiv prosess skal vi se på en prosedyre for å beregne tall i den såkalte Fibonacci-rekken: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55,... Bortsett fra de to første er hvert tall gitt som summen av de to foregående. 0 hvis n = 0 fib(n) = 1 hvis n = 1 fib(n 1) + fib(n 2) ellers? (define (fib n) (cond ((= n 0) 0) ((= n 1) 1) (else (+ (fib (- n 1)) (fib (- n 2))))))

Previously on Twin Peaks: Fibonaccitall 12 For å illustrere nok en annen type rekursiv prosess skal vi se på en prosedyre for å beregne tall i den såkalte Fibonacci-rekken: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55,... Bortsett fra de to første er hvert tall gitt som summen av de to foregående. 0 hvis n = 0 fib(n) = 1 hvis n = 1 fib(n 1) + fib(n 2) ellers? (define (fib n) (cond ((= n 0) 0) ((= n 1) 1) (else (+ (fib (- n 1)) (fib (- n 2))))))? (fib 5) 5? (fib 6) 8? (fib 7) 13? (fib 8) 21? (fib 9) 34

Previously on Twin Peaks: Fibonaccitall 12 For å illustrere nok en annen type rekursiv prosess skal vi se på en prosedyre for å beregne tall i den såkalte Fibonacci-rekken: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55,... Bortsett fra de to første er hvert tall gitt som summen av de to foregående. Litt mer liveprogrammering 0 hvis n = 0 fib(n) = 1 hvis n = 1 fib(n 1) + fib(n 2) ellers? (define (fib n) (cond ((= n 0) 0) ((= n 1) 1) (else (+ (fib (- n 1)) (fib (- n 2))))))? (fib 5) 5? (fib 6) 8? (fib 7) 13? (fib 8) 21? (fib 9) 34

Fibonacci-rekken som en uendelig strøm 13 Kjenner man til de to siste verdiene, kan neste verdi enkelt beregnes. Igjen, en rekursiv prosedyre som strøm-generator, med to argumenter. Prosedyreargumente tar vare på relevant historie: f (n 2) og f (n 1). (define (fib n) (define (generator x y) (cons-stream x (generator y (+ x y)))) (stream-ref (generator 0 1) n))? (fib 10) 55

Fibonacci-rekken som en uendelig strøm 13 Kjenner man til de to siste verdiene, kan neste verdi enkelt beregnes. Igjen, en rekursiv prosedyre som strøm-generator, med to argumenter. Prosedyreargumente tar vare på relevant historie: f (n 2) og f (n 1). (define (fib n) (define (generator x y) (cons-stream x (generator y (+ x y)))) (stream-ref (generator 0 1) n))? (fib 10) 55 Kan selvfølgelig også skrives som en ekvivalent prosedyre uten strøm. Men den har ikke like godt samsvar med den matematiske definisjonen.

Nok en strøm: Sielen til Eratosthenes 14 Også primtallene danner en uendelig sekvens: 2, 3, 5, 7, 11, 13, 17, 19,... Altså en strøm der ingen element er delbart på tidligere elementer. Kan modelleres som lag på lag av strømmer: hvert lag filtrerer videre: (define (sieve stream) (cons-stream (stream-car stream) (sieve (stream-filter (lambda (x) (not (divisible? x (stream-car stream)))) (stream-cdr stream))))) (define primes (sieve (integers-starting-from 2)))

Nok en strøm: Sielen til Eratosthenes Også primtallene danner en uendelig sekvens: 2, 3, 5, 7, 11, 13, 17, 19,... Altså en strøm der ingen element er delbart på tidligere elementer. Kan modelleres som lag på lag av strømmer: hvert lag filtrerer videre: (define (sieve stream) (cons-stream (stream-car stream) (sieve (stream-filter (lambda (x) (not (divisible? x (stream-car stream)))) (stream-cdr stream))))) (define primes (sieve (integers-starting-from 2)))? (stream-ref primes 3) 7 14