BuK/IIm15/KA-Hilbertbus

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>FLACI_c97gpsjc5dyr</language>
Hilfsprozeduren zur Streambehandlung
<code id="56fcb78422c21">
;Streambehandlung
(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)))))


;; Operationen mit streams

(define make-stream 
  (lambda (seed proc)
    (letrec 
      ((stream-builder
         (lambda (n)
           (stream-cons n (stream-builder (proc n))))))
      (stream-builder seed))))
  
(define stream-item
  (lambda (str k)
    (if (= k 0)
      (stream-car str)
      (stream-item (stream-cdr str) (- k 1)))))

(define stream-map
  (lambda (f str)
    (stream-cons
     (f (stream-car str))
     (stream-map f (stream-cdr str)))))

(define print-stream
  (lambda (stm n)
    (cond
      ((<= n 0) (display "...")(newline))
      (else
       (display (stream-car stm))
       (display ", ")
       (print-stream (stream-cdr stm) (- n 1))))))

(define nat_zahlen (make-stream 0 (lambda (n) (+ n 1))))

(define generiere_aufzaehlbare_menge
   (lambda (f)
      (stream-map f nat_zahlen )))

(define zeig-mir print-stream)
</code>
Erstellung eines Hilberthotels
<code id="56fcb78422cd1">
(define hilbert
  (lambda (n)
    #f))

(define baue-hilberthotel (generiere_aufzaehlbare_menge hilbert))

(define hilberthotel baue-hilberthotel)
</code>
<run id="56fcb78423403">
(zeig-mir hilberthotel 11)
</run>
Erstellung einer Einzelbuchung
<code id="56fcb78422d7a">
(define einzelbuchung
  (lambda (name stm pos)
    (if (not (equal? (stream-item stm pos) #f))
        (error "Fehler aufgetreten: Zimmer belegt.") 
        (cond
          ([and (= pos 0)(equal? (stream-item stm pos) #f)] (stream-cons name (stream-cdr stm)))
          (else (stream-cons (stream-car stm) (einzelbuchung name (stream-cdr stm) (- pos 1))))))))

(set! hilberthotel (einzelbuchung "Otto Grundmann" hilberthotel 3))

</code>
<run id="56fcb78423480">
(zeig-mir hilberthotel 12)
</run>
<code id="56fcb78422e2a">
(set! hilberthotel (einzelbuchung "Hella Milkel" hilberthotel 2))
;(set! hilberthotel (einzelbuchung "Heribert Wuischke" hilberthotel 3))
(set! hilberthotel (einzelbuchung "Heribert Wuischke" hilberthotel 7))
</code>
<run id="56fcb784234f8">
(zeig-mir hilberthotel 12)
</run>
Erstellung eines Kleinbusses
<code id="56fcb78422ed9">
(define baue-kleinbus1
  (lambda (name plaetze)
    (cond
      ([= plaetze 0] (list (cons name plaetze)))
      (else (cons (cons name plaetze) (baue-kleinbus1 name (- plaetze 1)))))))


(define umkehr
  (lambda (ls)
    (cond
      ([equal? (cdr ls) '()] (list (car ls)))
      (else (append (umkehr (cdr ls)) (list (car ls)))))))


(define baue-kleinbus
  (lambda (name plaetze)
    (umkehr (baue-kleinbus1 name plaetze))))

(define kleinbus815 (baue-kleinbus 815 8))
</code>
<run id="56fcb7842356f">
(write kleinbus815)
</run>
Erstellung einer Kleingruppenbuchung
<code id="56fcb78422f84">
(define getFirstFreePosition
  (lambda (stm pos)
    (if (equal? (stream-car stm) #f) pos
    (getFirstFreePosition (stream-cdr stm) (+ pos 1)))))

(define kleingruppenbuchung
  (lambda (ls stm)
    (cond
      ([equal? ls '()] stm)
      (else (kleingruppenbuchung (cdr ls) (einzelbuchung (car ls) stm (getFirstFreePosition stm 0)))))))

(set! hilberthotel (kleingruppenbuchung kleinbus815 hilberthotel))
</code>
<run id="56fcb784235e6">
(zeig-mir hilberthotel 12)
</run>
Erstellung eines Hilbertbusses
<code id="56fcb78423036">
(define hilbertb
  (lambda (name str)
    (stream-cons (cons name (stream-car str))
    (hilbertb name (stream-cdr str)))))


(define baue-hilbertbus
  (lambda (name)
    (hilbertb name nat_zahlen)))

(define bus3813 (baue-hilbertbus 3813))
</code>
<run id="56fcb7842367b">
(zeig-mir bus3813 8)
</run>
Erstellung des Check-In für einen Hilbertbus
<code id="56fcb784230c9">
(define hilbertCheckIn
  (lambda (stmBus str)
    (if (not (equal? (stream-car str) #f))
        (stream-cons (stream-car str) (hilbertCheckIn stmBus (stream-cdr str)))
        (stream-cons (stream-car stmBus) (hilbertCheckIn (stream-cdr stmBus) (stream-cdr str)))
        )))

(set! hilberthotel (hilbertCheckIn bus3813 hilberthotel))
</code>
<run id="56fcb78423729">(zeig-mir hilberthotel 20)</run>
Umzug der Hotelbewohner auf gerade Zimmernummern 
<code id="56fcb78423143">
(define gehe-in-gerade
  (lambda (stm n)
    (cond
      ([even? n] (stream-cons (stream-car stm) (gehe-in-gerade (stream-cdr stm) (+ n 1))))
      (else (stream-cons #f (gehe-in-gerade stm (+ n 1)))))))

(set! hilberthotel (gehe-in-gerade hilberthotel 0))
</code>
<run id="56fcb784237e3">
(zeig-mir hilberthotel 30)
</run>
Erstellung und Check-In eines weiteren Hilbertbusses
<code id="56fcb784231bb">
(define bus33 (baue-hilbertbus 33))

(set! hilberthotel (hilbertCheckIn bus33 hilberthotel))
</code>
<run id="56fcb7842388e">
(zeig-mir hilberthotel 30)
</run>
Erstellung eines Hilbertkonvoi
<code id="56fcb78423243">
(define hilbertK
  (lambda (buchstabenname name str)
    (stream-cons (cons (string-append buchstabenname (number->string name)) (stream-car str))
    (hilbertK buchstabenname name (stream-cdr str)))))


(define baue-hilbertbusKonvoi
  (lambda (buchstabenname name)
    (hilbertK buchstabenname name nat_zahlen)))

(define make-KStream
  (lambda (buchstabe name)
    (letrec
        ((stream-builder
          (lambda (n name)
           (stream-cons n (stream-builder (baue-hilbertbusKonvoi buchstabe name) (+ name 1))))))
              (stream-builder (baue-hilbertbusKonvoi buchstabe name) (+ name 1)))))

(define zeige-mir
  (lambda (stm spalte)
    (zeig-mir (stream-item stm 0) spalte)
    (zeig-mir (stream-item stm 1) spalte)
    (zeig-mir (stream-item stm 2) spalte)
    (zeig-mir (stream-item stm 3) spalte)
    (zeig-mir (stream-item stm 4) spalte)
    (zeig-mir (stream-item stm 5) spalte)))

(define k1 (make-KStream "MH" 0))
</code>
<run id="56fcb784239b4">
(zeige-mir k1 4)
</run>
Umwandlung des Konvoi in einen einzigen Stream
<code id="56fcb784232e0">
(define deleteValue
  (lambda (stm u)
    (cond
      ([= u 0](stream-cons (stream-cdr (stream-item stm u)) (stream-cdr stm)))
      (else (stream-cons (stream-car stm) (deleteValue (stream-cdr stm) (- u 1)))))))

(define konvoi->kette
  (lambda (strBusse o u)
    (cond
      ([= u 0] (stream-cons (stream-car (stream-item strBusse u)) (konvoi->kette (deleteValue strBusse u) (+ o 1)(+ o 1))))
      (else (stream-cons (stream-car (stream-item strBusse u)) (konvoi->kette (deleteValue strBusse u) o (- u 1)))))))

</code>
<run id="56fcb78423b2c">
(zeig-mir (konvoi->kette k1 0 0) 20)
</run>
Check-In des Konvoi
<code id="56fcb78423354">
(set! hilberthotel (gehe-in-gerade hilberthotel 0))

(set! hilberthotel (hilbertCheckIn (konvoi->kette k1 0 0) hilberthotel))
</code>
<run id="56fcb78423be6">
(zeig-mir hilberthotel 42)
</run>
Wer wohnt in Zimmer 234?
<run id="56fcb78423ca1">
(stream-item hilberthotel 234)
</run>