תורת החישוביות/מכונת טיורינג אוניברסלית

עד כה עסקנו במכונות־טיורינג (מ"ט) אשר מחשבות פונקציה על מחרוזת הנתונה לה כקלט. בפרק זה נראה שיטה מסויימת לקודד מ״ט בתור מחרוזת, ונדון מה קורה כאשר מחרוזת אשר מתארת מ״ט מסויימת M, ניתנת כקלט למ״ט אחרת. זו קפיצה מחשבתית לא פשוטה: במקום מ״ט המחשבות פונקציה על מחרוזת, אנחנו ברמת קינון עמוקה יותר – דנים על מכונות המחשבות פונקציה על מכונות־טיורינג (שבעצמן מחשבות פונקציה על מחרוזות).


קידוד מ"ט על-ידי מחרוזת בינארית עריכה

נתונה מ״ט  . בלי הגבלת הכלליות (למשל, ע״י החלפת שמות) ניתן להניח

  •   כאשר המצב ההתחלתי  .
  •   שכן לא נדרשים יותר משני מצבים סופיים (אחד לקבלה, אחד לדחייה)
  •  
  •  
  •  

נרצה לתאר את המכונה (כלומר, כל אחד ממרכיביה השונים) על-ידי מחרוזת בינארית. נתחיל בקידוד המעברים:

 

(כאשר הכיוון d נתון על ידי:  ) יקודד על ידי המחרוזת

 

כלומר q פעמים הספרה 1, ולאחריה 0; לאחר מכן a פעמים הספרה 1 ולאחריה 0 יחיד, וכן הלאה.

נשים לב שאין שני אפסים רצופים!

קידוד המכונה   נתון על-ידי:

 

כאשר   הינו הקידוד של המעבר ה-i, כאשר נניח שהקידודים מסודרים בסדר כלשהו (קידוד המכונה אינו חד־חד ערכי; סדר שונה של מעברים יאפשר קידוד אותה המכונה בשני אופנים שונים). נשים לב:

  • ראשית אנו מקודדים את הפרמטרים של המכונה, המפרט את כלל המצבים לפי ההנחות לעיל
  • לאחר מכן שני אפסים מעידים על סוף הקידוד של מעבר אחר ותחילת המעבר הבא. מכיוון שבקידוד מעבר לעולם אין שני אפסים רצופים, הגדרה זו אינה דו־משמעית.
  • קיימים לכל היותר   מעברים שונים.
  • שלושה אפסים רצופים מציינים את סוף קידוד המכונה השלמה.




נגדיר שכל מחרוזת לא-חוקית (כלומר שלא מקיימת את הכללים לעיל, ואינה מתקבלת מקידוד של מ"ט כלשהי, למשל, המחרוזת "0100001") היא קידוד של מ"ט שבצעד החישוב הראשון שלה עובר ישירות למצב דחייה.

לכל מחרוזת נתונה, קל לבדוק האם היא מייצגת מכונת טיורינג או שהיא קידוד לא־חוקי. יותר מכך – קיים אלגוריתם שבודק האם מחרוזת מסוימת היא קידוד חוקי או לא, ומכאן שקיימת מכונת טיורינג שמקבלת כקלט מחרוזת ומקבלת אם ורק אם המחרוזת היא קידוד חוקי של מ״ט כלשהי. מכונה כנ״ל יכולה "לשאוב" את כל המידע הנחוץ (מספר המצבים וכו') על המכונה המקודדת במחרוזת הקלט.

סימון עריכה

הגדרה:

הקידוד של מ״ט M יסומן    



דוגמה:

משמעות הקבוצה  , היא אוסף כל המחרוזות (חוקיות או לא) שהמכונות שהן מקודדות, מבצעות XXXX.


קונפיגורציות וקידוד קופניגורציות עריכה

כעת נראה כיצד ניתן לקודד למחרוזת בינארית קונפיגורציות. כזכור, קונפיגורציה היא אוסף המידע המגדיר את מצב המכונה M בתחילת צעד חישוב. ראינו בפרק קודם שקונפיגורציה מכילה כמות מידע סופית ועל כן ניתן לקודד אותה למחרוזת בינארית (באורך סופי). הקונפיגורציה   תקודד באופן הבא

 

כל תא מקודד על-ידי רצף של אחדים לפי הסימן שבתא. מיקום הראש מסומן על-ידי שני אפסים רצופים מיד לפני התא עליו מצביע הראש. מייד לאחר קידוד מיקום הראש מסומן מצב המכונה הנוכחי, ולאחר מכן המשך תכולת הסרט. כמקודם, לא כל מחרוזת מהווה קידוד תקין של קונפיגורציה.



המכונה האוניברסלית עריכה

בפרק זה נגדיר מכונת-טיורינג אוניברסלית U, המסוגלת "לסמלץ" חישוב של כל מ"ט M על קלט x. ראשית, נגדיר את הפונקציה המתמטית אותה אנו רוצים לחשב, ואחרי כן נסביר איך המכונה U מחשבת את הפונקציה הנ"ל.

הפונקציה העוקבת עריכה

הגדרה:

הפונקציה העוקבת NEXT()‎ מוגדרת:

קידוד הקונפיגורציה העוקבת לC         

NEXT()‎ היא פונקציה חלקית (אינה מוגדרת על כל התחום):

  • ייתכן שהקידוד   אינו חוקי
  • ייתכן ש  אינו מתאים למכונה M (למשל, משתמש באות שאינה באלפבית של M)
  • ייתכן שC היא קונפיגורציה סופית, ואין לה קונפיגורציה עוקבת.


טענה:

הפונקציה NEXT()‎ ניתנת לחישוב על-ידי מכונת טיורינג        

 
הקלט של הפונקציה הוא  , כלומר שתי המחרוזות משורשרות זו לזו. ראינו איך מקודדים את M ואת C, אבל איך המכונה יודעת מתי מסתיים הקידוד M ומתי מתחיל C ? במילים אחרות - איך מקודדים את הפסיק? במקרה זה התשובה פשוטה, מכיוון שהקידוד   מסתיים בשלושה אפסים רצופים, נקודת הגבול בין שתי המחרוזות מוגדרת היטב.

במקרים אחרים, ייתכן שהקלט אינו מכיל הפרדה פנימית, למשל, אם הקלט הוא קידוד של מספר קונפיגורציות  . במקרה זה ניתן לקודד את ה"פסיק" בתור מחרוזת של, למשל, ארבעה אפסים רצופים, ולדעת להפריד בין מחרוזות הקלט השונות. פתרון אחר הוא להפריד על-ידי הספרה "2" (ואז מחרוזת הקלט אינה בינארית כי אם טרינרית, אבל החלקים ה"מעניינים" של הקלט מקודדים בצורה בינארית).

בהמשך נניח כי קיים קידוד כלשהו לסימן הפסיק, והמכונה מסוגלת להפריד בין חלקים שונים של הקלט, מבלי להכנס לקידוד הספציפי

הוכחה (להלן האלגוריתם של המכונה המתאימה):

  1. המכונה בודקת שהקלט מהווה קידוד תקין. (אם לא תקין - המכונה נכנסת ללולאה אינסופית, והפלט אינו מוגדר).
  2. אם C אינה קונפיגורציה סופית, נחשב את הקונפיגורציה העוקבת באופן הבא:
    1. מעבר על   וחילוץ המצב q בו המכונה M נמצאת, ואת האות a אותה הסרט רואה.
    2. מעבר על   וחילוץ המעבר   (הקידוד של מעבר זה מתחיל ב  כך שקל למצוא אותו על-ידי השוואה עם הקידוד   החל מהמקום בו קיימים שני אפסים..).
    3. מחלצים את (p,b,d) מהמעבר ומעדכנים את הקונפיגורציה: כותבים את האות b במקום a (שים לב: כדי לשנות אות צריך רק לשנות את מספר ה"1"ים בתא המתאים!); משנים את המצב לp ו"מזיזים" את המיקום של הראש לפי הצורך לפני התא המתאים.
  3. מזיזים את הקונפיגורציה החדשה לתחילת המסרט, מזיזים את הראש לסופה ועוצרים (כלומר: הפלט הוא הקונפיגורציה המעודכנת).

הפונקציה האוניברסלית עריכה

הגדרה:

הפונקציה האוניברסלית היא

         

כלומר, הפונקציה האוניברסלית על קלט קידוד   ומחרוזת x, מחשבת כפלט את תוצאת הריצה של המכונה M (המוגדרת על-ידי המחרוזת  ) על המחרוזת x. אם M לא עוצרת על x אזי   אינו מוגדר (U היא פונקציה חלקית).


טענה:

הפונקציה האוניברסלית ניתנת לחישוב על-ידי מכונת טיורינג        

 
מכונה המחשבת את הפונקציה האוניברסלית U נקראת המכונה האוניברסלית ובספרים רבים מסומנת  . קיימות מספר מכונות המחשבות את הפונקציה האוניברסלית ולהן מספר שונה של מצבים וגודל אלפבית. למשל מרווין מינסקי הראה ב-1962 כי קיימת מכונה אוניברסלית עם 7 מצבים בלבד ואלפבית בגודל 4, ולאחר מכן נתגלו מכונות אוניברסליות עם 5 מצבים ואלפבית בגודל 5; 4 מצבים ואלפבית בגודל 6; 3 מצבים ואלפבית בגודל 9; ואפילו 2 מצבים בלבד ואלפבית בגודל 18.

הוכחה: נניח מכונה בעלת שני סרטים, ונתאר את פעולה על הקלט  :

  1. אם   אינו קידוד תקין - עצור מייד עם הפלט  .
  2. אחרת - כתוב על הסרט השני את הקונפיגורציה ההתחלתית של M על x.
  3. בצע בלולאה:
    כל עוד הקונפיגורציה C המקודדת בסרט השני אינה סופית, חשב   כך שבסיום החישוב הסרט השני יכיל את הקידוד של  .
  4. חלץ את הפלט מתוך הקונפיגורציה הסופית המקודדת בסרט השני, העתק לסרט הראשון כמחרוזת הפלט וסיים.

הערות:

  • אם M לא עוצרת על x,   לא עוצרת על  .
  • המכונה האוניברסלית   היא מ"ט רגילה! יש לה מספר קבוע של מצבים, פונקצית מעבר, וכו'.. למרות זאת היא מצליחה "להריץ" מכונות עם מספר מצבים כלשהו.


הפרק הקודם:
שקילות מודלי חישוב
מכונת טיורינג אוניברסלית הפרק הבא:
מודל לבעיות הכרעה