----- 1/07/17 ----- > In diversi esami ho trovato un esercizio riguardante il crivello di Eratostene > (ad esempio nell'esame del 3/02/2017) da svolgere in Scheme. > Dopo vari tentativi pero' non riesco a venirne a capo > (in particolare per quanto riguarda la funzione che rimuove i multipli del crivello). > Volevo percio' chiedere una delucidazione su cosa esattamente dovrebbe fare quella procedura, > perché proprio non ne capisco la logica. > Le allego anche la mia "soluzione" della procedura 'scan-sieve' (vedi sotto) > che non riesco a verificare mancandomi la rimozione dei multipli. > > (define primes-list > (lambda (n) > (eratosthenes 2 n (new-sieve)) > )) > > (define eratosthenes > (lambda (p n s) > (cond ((> p n) (sieve-list s n)) > ((is-in-sieve p s) (eratosthenes (+ p 1) n s)) > (else (eratosthenes (+ p 1) n s)) > ))) > > (define new-sieve > (lambda () ; "costruttore" senza argomenti > (lambda (x) (> x 1)) ; rappresentazione interna procedurale > )) > > (define is-in-sieve ; val: booleano > (lambda (p sieve) ; p: intero, sieve: crivello di Eratostene > (sieve p) > )) > > (define remove-multiples-of ; val: crivello di Eratostene > (lambda (p sieve) ; p: intero > 2, sieve: crivello di Eratostene > (lambda (x) > (if ( ?????? ) > (= x p) > ?????? > )) > )) > > (define sieve-list ; val: lista di interi > (lambda (sieve n) ; sieve: crivello di Eratostene, n: intero > (scan-sieve 2 n sieve) > )) > > (define scan-sieve > (lambda (x y s) > (cond ((> x y) '()) > ((= x y) '(2)) > ((< x y) > (lambda (x) '(< x n))) > ))) ----- Per quanto riguarda 'scan-sieve', i valori restituiti nella soluzione proposta non hanno un tipo coerente. In base alla definizione di 'scan-list' il tipo dovrebbe essere sempre una lista di interi, ma in uno dei casi viene restituita una procedura (con un 'quote' incongruente). A parte i casi base, le condizioni scelte non sono utili perche' l'elemento discriminante e' l'appartenenza o meno di x al crivello s. In relazione a 'remove-multiples-of' la procedura restituita (lambda x...) deve a sua volta restituire true se x appartiene al "nuovo" crivello, false altrimenti. Se x e' multiplo di p, allora x va rimosso (cioe' la procedura restituita ha valore false in x) a meno che x = p; altrimenti la risposta e' data direttamente da 'sieve'. ----- * -----