Skip to content

nested-mappings

(define nil '())
(define (enumarate-interval low high)
    (if (> low high)
        nil
        (cons low (enumarate-interval (+ low 1) high))))
(define (accumulate op initial sequence)
    (if (null? sequence) 
        initial
        (op (car sequence) (accumulate op initial (cdr sequence)))))
(define (divides? a b) (= (remainder b a) 0))
(define (prime? n)
    (define (smallest-divisor n) (find-divisor n 2))
    (define (find-divisor n test-divisor)
        (cond ((> (square test-divisor) n) n)
                ((divides? test-divisor n) test-divisor)
                (else (find-divisor n (+ test-divisor 1)))))
    (= n (smallest-divisor n)))

; Problem: Given positive integer n, find all ordered pairs of distinctive
; integers i, j, where 1 <= j < i <= n, such that i+j is prime
(define (flatmap proc seq)
    (accumulate append nil (map proc seq)))
(define (prime-sum? pair)
    (prime? (+ (car pair) (cadr pair))))
(define (make-pair-sum pair)
    (list (car pair) (cadr pair) (+ (car pair) (cadr pair))))

(define (prime-sum-pairs n)
    (map make-pair-sum
         (filter 
            prime-sum?
            (flatmap
                (lambda (i)
                  (map (lambda (j) (list i j))
                       (enumarate-interval 1 (- i 1))))
                (enumarate-interval 1 n)))))

(prime-sum-pairs 6)
; ((2 1 3) (3 2 5) (4 1 5) (4 3 7) (5 2 7) (6 1 7) (6 5 11))

; Problem: Permutations of a set
(define (permutations s)
    (if (null? s)
        (list nil)
        (flatmap 
            (lambda (x)
                (map (lambda (p) (cons x p))
                     (permutations (remove x s))))
            s)))
(define (remove item sequence)
    (filter (lambda (x) (not (= x item)))
            sequence))

(permutations (list 1 2 3))
;Value 3: ((1 2 3) (1 3 2) (2 1 3) (2 3 1) (3 1 2) (3 2 1))