Bergervei/Hilberthotel
Aus ProgrammingWiki
Wiki-Quelltext dieser Seite.
<language>SchemeJS</language>
<code id="63ad4ce454572" hidden>
(define stream-car car)
(define stream-cdr
(lambda (stm)
(force (cdr stm))))
(define-macro (stream-cons head tail)
`(cons ,head (delay ,tail)))
(define stream?
(lambda (stm)
(and (pair? stm) (promise? (cdr stm)))))
(define stream-map
(lambda (proz stm)
(stream-cons (proz (stream-car stm)) (stream-map proz (stream-cdr stm)))))
(define show-stream
(lambda (stm n)
(if (= n 0)
(begin
(display "...")
'ok)
(begin
(display (stream-car stm))
;(display "\n")
(show-stream (stream-cdr stm) (- n 1))))))
</code>
== Das Hilberthotel ==
Das Hilberthotel besitzt (abzählbar) undendlich viele Zimmer. Leere Zimmer werden mit <tt>#f</tt> gekennzeichnet.
<code id="4f789fe2b1e48">
(define baue-hilberthotel
(lambda ()
(stream-cons #f (baue-hilberthotel))))
(define zeige-hotel
(lambda (hotel n)
(show-stream hotel n)))
(define hilberthotel (baue-hilberthotel))
</code>
<run id="4f789fe2b2121">
(zeige-hotel hilberthotel 10)
</run>
== Einzelne Gäste ==
Einzelne Gäste buchen nun Zimmer im Hilberthotel.
<code id="4f78ab009e397">
(define einzelbuchung
(lambda (stm name nr)
(if (= nr 0)
(if (eqv? (stream-car stm) #f)
(stream-cons name (stream-cdr stm))
(error
(string-append "Fehler bei Einzelbuchung: "
"Dieses Zimmer ist schon durch "
(stream-car stm) " belegt.")))
(stream-cons (stream-car stm)
(einzelbuchung (stream-cdr stm) name (- nr 1))))))
(set! hilberthotel (einzelbuchung hilberthotel "Otto Grundmann" 3))
(set! hilberthotel (einzelbuchung hilberthotel "Hella Milkel" 2))
(set! hilberthotel (einzelbuchung hilberthotel "Heribert Wuischke" 7))
</code>
<run id="4f789fe2b2190">
(zeige-hotel hilberthotel 10)
</run>
== Kleine Reisegruppe ==
Ein Kleinbus soll nun eine kleine Reisegruppe zum Hotel bringen.<br />
Der Kleinbus muss aber zunächst noch hergestellt werden.
<code id="4f789fe2b1f31">
(define baue-kleinbus
(lambda (name nr)
(if (= nr 0)
()
(append (baue-kleinbus name (- nr 1)) (list (cons name nr))))))
(define zeige-kleinbus
(lambda (ls)
(display ls)
'ok))
(define kleingruppenbuchung
(lambda (stm ls)
(if (null? ls)
stm
(if (eqv? (stream-car stm) #f)
(stream-cons (car ls) (kleingruppenbuchung (stream-cdr stm) (cdr ls)))
(stream-cons (stream-car stm) (kleingruppenbuchung (stream-cdr stm) ls))))))
(define kleinbus815 (baue-kleinbus 815 8))
(set! hilberthotel (kleingruppenbuchung hilberthotel kleinbus815))
</code>
Nun kann die kleine Reisegruppe anreisen ...
<run id="4f789fe2b21ea">
(zeige-kleinbus kleinbus815)
</run>
... und im Hilberthotel einchecken.
<run id="4f789fe2b2258">
(zeige-hotel hilberthotel 15)
</run>
== Hilbertbus ==
Ein Hilbertbus besitzt im Gegensatz zum Kleinbus (abzählbar) unendlich viele Sitzplätze.
<code id="4f789fe2b1f9d">
(define baue-hilbertbus
(lambda (name)
(letrec
([herstellung
(lambda (nr)
(stream-cons (cons name nr) (herstellung (+ nr 1))))])
(herstellung 1))))
(define zeige-hilbertbus
(lambda (bus n)
(show-stream bus n)))
(define bus3813 (baue-hilbertbus 3813))
</code>
<run id="4f789fe2b22c8">
(zeige-hilbertbus bus3813 15)
</run>
== Große Reisegruppe ==
Nun reist eine große Reisegruppe mit einem Hilbertbus an. Wie lässt sich diese Reisegruppe im Hotel unterbringen? <br />
Kein Problem! Jeder Hotelgast verdoppelt seine Zimmernummer und zieht in das entsprechende Zimmer um. Damit werden alle Zimmer mit ungerader Zimmernummer frei. Diese können durch die Reisegruppe des Hilbertbusses belegt werden.
<code id="63ad4ce4545c3">
(define belege-gerade-zimmer
(lambda (hotel-stm)
(stream-cons
#f (stream-cons (stream-car hotel-stm) (belege-gerade-zimmer (stream-cdr hotel-stm))))))
(set! hilberthotel (belege-gerade-zimmer hilberthotel))
</code>
<run id="4f789fe2b233a">
(zeige-hotel hilberthotel 20)
</run>
<code id="4f78ab009e418">
(define hilbertbuchung
(lambda (hotel-stm bus-stm)
(if (eqv? (stream-car hotel-stm) #f)
(stream-cons
(stream-car bus-stm) (hilbertbuchung (stream-cdr hotel-stm) (stream-cdr bus-stm)))
(stream-cons
(stream-car hotel-stm) (hilbertbuchung (stream-cdr hotel-stm) bus-stm)))))
(set! hilberthotel (hilbertbuchung hilberthotel bus3813))
</code>
<run id="4f78ab009e52d">
(zeige-hotel hilberthotel 50)
</run>