8.5 Turing-Maschinen simulieren Turing-Maschinen: die universelle Turing-Maschine

Im letzten Teilkapitel haben wir gesehen, wie wir jede Turingmaschine Mmit Eingabealphabet Σ codieren können als

enc(M)Λ ,

also als String über dem Codierungsalphabet

Λ:=Σ{0,1,#,,,L,S,R,;}

Diese Codierungsschema enthält implizit Codierungsfunktionen encQ:Q{0,1}+ und encΓ:ΓΣ{0,1}+, die wir verwenden, um die Zustände und Arbeitszeichen von M in Λ-Zeichen zu übersetzen. Für eine Konfiguration

C=u1umqv1vn

der Maschine M definieren wir die Codierung von C als

enc(C):=encΓ(u1)#encΓ(u2)#encΓ(um)#encQ(q)#encΓ(v1)##encΓ(vn)Λ .

Das ist alles nicht besonders tiefgründig und dient allein dazu, sicherzustellen, dass wir die Konfigurationen von M darstellen können in dem Alphabet Λ, das unabhängig von M ist. Dass wir also jede Turingmaschine M mit Eingabealphabet Σ und jede ihrer Konfigurationen als Strings über einem festen Alphabet Λ darstellen können.

Eine Turingmaschine simulieren heißt nun, einen String enc(M);w mit wΣ zu lesen und daraus den String enc(δ^M(w)) zu berechnen, also das Ergebnis δ^M(w), passend codiert über dem Alphabet Λ. Das zentrale Ergebnis dieses Teilkapitels ist, dass wir diese Simulation selbst mit einer Turingmaschine implementieren können.

Theorem 8.5.1 (Universelle Turingmaschine). Zu jedem endlichen Eingabealphabet Σ sei Λ:=Σ{0,1,#,,,L,S,R,;} das Codierungsalphabet. Es gibt es eine Turingmaschine U=UΣ mit Eingabealphabet Λ, so dass für alle cΛ und wΣ die Turingmaschine U mit Eingabewort xΛ folgendes tut:

  • Falls x nicht die Form enc(M);w mit wΣ hat, lehnt sie ab;
  • Ansonsten, falls also c=enc(M) für eine Turingmaschine M ist:
    • Falls M mit Eingabewort w nicht terminiert, dann terminiert U mit Eingabewort c;w auch nicht.
    • Falls M mit Eingabewort w eine Endkonfiguration C=uqv erreicht, dann erreicht U mit Eingabewort c;w die Endkonfiguration q enc(C). Das heißt insbesondere, dass U genau dann akzeptiert, wenn M akzeptiert, und genau dann ablehnt, wenn M ablehnt.

U akzeptiert also die Sprache

{cw | wΣ und c=enc(M) und M akzeptiert w} .

Ein technischer aber letztendlich irrelevanter Punkt: die Mengen Q und Γ der Turingmaschine M können ja beliebige (endliche) Mengen sein, und weder Λ noch die Turingmaschine U haben "Kenntnis" von ihnen. Wir nehmen aber aus Gründen der Einfachheit an, dass Q immer die Zustände qyes und qno enthält und auch U diese Zustände verwendet. Daraus ergibt sich, dass für eine Endkonfiguration uqv von M zwar q{qyes,qno} gilt, allerdings enc(q){0,1}+, da wir diese M-Zustände binär codieren. Somit ist q enc(uqv){qyes,qno}×Λ eine Endkonfiguration von U.

Des weiteren gehen wir davon aus, dass das Blank-Symbol für alle Turingmaschinen M mit Eingabealphabet Σ das gleiche ist. Auch U verwendet es. Wenn wir allerdings M codieren, so wird auch als enc(){0,1}+ codiert, wie jedes Arbeitssymbol zΓΣ von M binär codiert wird. Das heißt insbesondere, dass für eine M-Konfiguration C die Codierung enc(C) kein enthält (selbst wenn C als Konfiguration von M dies tut), und in der Tat ist ja enc(C)Λ, und Λ ist das Eingabealphabet von U mit Λ.

Beweis. Den Beweis in allen Details zu führen hieße, die Maschine U konkret als Turingmaschine zu implementieren. Wir tun dies nicht. Wir beschränken uns auf eine High-Level-Beschreibung ihrer Arbeitsweise.