BuK/IIm11/Studenten/sidatasc/k2

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>Scheme</language>
Die Durchschnittsmenge zweier aufzählbar unendlicher Mengen ist ebenso aufzählbar.

<code id="4f786a0772831" hidden>
;; Selektoren
(define stream-car car)
(define stream-cdr
  (lambda (stm)
    (force (cdr stm))))

;; Konstruktoren
(define-syntax stream-cons
  (syntax-rules ()
    ((_ head tail) (cons head (delay tail)))))

;; Praedikat
(define stream?
  (lambda (stm)
    (and (pair? stm)(promise? (cdr stm)))))

;; Operationen mit streams
(define print-stream
  (lambda (stm n)
    (cond
      ((<= n 0) (display "...\n"))
      (else
       (display (stream-car stm))
       (display ", ")
       (print-stream (stream-cdr stm) (- n 1))))))
(define stream-item
  (lambda (str k)
    (if (= k 0)
      (stream-car str)
      (stream-item (stream-cdr str) (- k 1)))))
</code>
<code id="4f788b8284bf7">
(define enthalten?
  (lambda(element liste)
    (cond
      [(not (list? liste)) #f]
      [(null? liste) #f]
      [(= (car liste) element) #t]
      [else (enthalten? element (cdr liste))]
    )
  )
)

(define bilde-sm
  (lambda (f g)
    (letrec(
      (suche-element
        (lambda (f-pool g-pool index)
          (let (
                (f-element (f index))
                (g-element (g index))
            )
            (begin
              (if (enthalten? f-element g-pool)
                  (stream-cons f-element (suche-element f-pool (append g-pool (list g-element)) (+ index 1)))
                  (if (enthalten? g-element (append f-pool (list f-element)))
                    (stream-cons g-element (suche-element (append f-pool (list f-element)) g-pool (+ index 1)))
                    (suche-element (append f-pool (list f-element)) (append g-pool (list g-element)) (+ index 1))
                  )
              )
            )
          )
        )
       ))
      (suche-element '() '() 1)
    )
  )
)
</code>

<run id="4f786a077289d">
(define f (lambda (x) (+ (* 2 x) 1)))
(define g (lambda (x) (* x x)))
(define sm (bilde-sm f g))
(print-stream sm 10)
</run>