BuK/IIm10/BuK-Übung05 G2

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>Scheme</language>
= Prozedur <tt>stoppt-collatz-bis?</tt> =

== Aufgabe ==
Schreiben Sie eine Scheme-Prozedur <tt>stoppt-collatz-bis?</tt>, die eine Zahl n als Eingabe erwartet und feststellt, ob die endlichen Collatzfolgen für <math> i = 2, 3, ..., n</math> existieren.

<language>Scheme</language>
<language>Scheme</language>
== Lösung ==
Die Collatz-Folge, auch '''(3n+1)-Problem''' oder '''Ulam-Funktion''' genannt, ist so definiert:

<math>
collatz(n)= 
\left\lbrace
\begin{aligned}
   1           & \text{, wenn } n=1\\
  collatz(n/2) & \text{, wenn } n \text{ gerade}\\
  collatz(3n+1)& \text{, wenn } n \text{ ungerade}\\
\end{aligned}
</math>

Die Vermutung ist, das die Folge, für eine beliebige Zahl <math>n \in \mathds{N}, n > 0</math> immer auf <math>1</math> endet.
Diese Vermutung konnte bisher noch nicht mathematisch bewiesen werden.

Wir können auch eine Prozedur angeben, welche die Folge berechnet:
<code id="4db830ef18b33">
(define collatz
  (lambda (n)
    (cond
      ((= n 1) 1)
      ((= (modulo n 2) 0) (collatz (/ n 2)))
      (else (collatz (+ 1 (* 3 n))))
)))
</code>
Dazu der Aufruf:
<run id="4db830ef18c1d">
(collatz 5)
</run>

Das Problem besteht darin, dass nicht festgestellt werden kann, ob die Folge auch für alle <math>n \in \mathds{N}</math> wirklich auf <math>1</math> endet.
Das folgende Diagramm soll die Unregelmäßigkeit der Folge weiter verdeutlichen, indem die Anzahl der Glieder welche benötigt werden um bis zur <math>1</math> zu kommen benötigt werden dargestellt sind.

[[Bild:Simaklem_CollatzDiagr.png]]


Man könnte beweisen, das die Folge immer stoppt. Diese Prozedur sieht so aus:

<code id="4db830ef18b9f">
(define stoppt-collatz-bis?
  (lambda (start)
    (if (= 1 (collatz start))
    #t
    #f
)))
</code>

<run id="4db830ef18c88">
(stoppt-collatz-bis? 7)
</run>

Dieses Problem führt uns direkt zu dem Halteproblem: Es kann nicht festgestellt werden, ob diese/eine Prozedur stoppt.

[[Media:Beispiel.ogg]]= Beweis =

== Aufgabe ==
Beweisen Sie, dass <math>{f}_{total}</math> nicht berechenbar ist, d.h. eine Prozedur <tt>totalmacher</tt> für <math>{f}_{total}</math>,
die eine partielle zahlentheoretische Funktion <math>{f}_{partiell}</math> nimmt, gibt es nicht.

== Lösung ==
Die Prozedur <tt>totalmacher</tt> soll prüfen ob eine Funktion total ist. Daher sollen "nicht anhatende Programme" auf ein Element "a" aus dem Wertebereich <math>{W}_{f}</math> abgebildet werden. Die Funktion wird so definiert:

<math>
{f}_{total}(x) = 
\left\lbrace
\begin{aligned}
   {f}_{partiell}(x)       & \text{, wenn } x \in {D}_{f}\\
   a & \text{, sonst}\\
\end{aligned}
</math>

;Satz
<math>{f}_{total}</math> ist nicht berechenbar.

;Beweis
Zuerst wird angenommen, dass <math>{f}_{total}</math> berechnenbar ist. 

<math>\rightarrow</math> Das Prädikat <math> x \in {D}_{f} </math> ist berechenbar.

<math>\rightarrow</math> Dann gibt es eine Prozedur <tt>hält_f_für_n?</tt>, welche das Prädikat berechnet.

Dies stellt ein Widerspruch zum Halteproblem dar, und daraus kann man schließen, das solch eine berechenbare Funktion <math>{f}_{total}</math>  nicht existiert.

= Turingmaschine (TM) und RADOsche Funktion =
== Aufgabe ==
== Lösung ==

= Beweis =
== Aufgabe ==
== Lösung ==