משפט רייס

משפט רייס (מאנגלית: Rice's theorem), הוא משפט מרכזי בתחום החישוביות, שעוסק ביכולת של אלגוריתמים לחקור אלגוריתמים אחרים. המשפט אומר שאין תוכנית מחשב שמקבלת כקלט תוכנית מחשב אחרת, ומכריעה האם הפונקציה שמחשבת תוכנית מחשב זו היא בעלת תכונה מסוימת "לא-טריוויאלית" או לא (כלומר, תכונות אשר מאפיינות חלק מהפונקציות שמחושבות בידי תוכנית מחשב, אך לא את כולן). יש לשים לב שהתכונה היא תכונה של הפונקציה, ולא של תוכנית המחשב עצמה. באופן אינטואיטיבי המשפט טוען שתוכנית מחשב אינה יכולה לדעת כמעט מאום על הפלטים של תוכניות מחשב הנתונות לה כקלט. באופן פורמלי, שפת הקידודים למכונות הטיורינג, שהשפה שלהן ב- S {\displaystyle S} L S = { ⟨ M ⟩ ∣ L ( M ) ∈ S } {\displaystyle L_{S}=\{\langle M\rangle \mid L(M)\in S\}} היא שפה בלתי כריעה אם   S {\displaystyle \ S} היא קבוצה לא-טריוויאלית של שפות. בנוסף, אם מתקיים כי ∅ ∈ S {\displaystyle \varnothing \in S} אזי השפה אינה כריעה למחצה. הקבוצה   S {\displaystyle \ S} תחשב טריוויאלית אם היא הקבוצה הריקה (אינה מכילה אף שפה), או קבוצת כלל השפות מזוהות טיורינג. הסימון ⟨ M ⟩ {\displaystyle \langle M\rangle } מציין מחרוזת בינארית המהווה קידוד של מכונת טיורינג   M {\displaystyle \ M} . הוכחת המשפט מפרידה בין שני מקרים, תוך שימוש בפונקציה הריקה. הפונקציה הריקה היא פונקציה שתחום ההגדרה שלה ריק. אלגוריתם מחשב את הפונקציה הריקה אם ורק אם הוא לא עוצר על אף קלט, כלומר נכנס תמיד ללולאה אינסופית או שערכי הביניים של האלגוריתם גדלים תמיד ללא הגבלה. נניח בשלילה שקיים אלגוריתם   Q {\displaystyle \ Q} שמכריע האם הפונקציה שמחשב אלגוריתם נתון היא בעלת התכונה, ונראה כי ניתן לפתור בעזרתו את בעיית העצירה. מכיוון שהתכונה לא טריוויאלית, קיים אלגוריתם כלשהו   A {\displaystyle \ A} המחשב פונקציה שיש לה את התכונה הזו. בעזרת   A {\displaystyle \ A} נבנה תוכנית שתפתור את בעיית העצירה. התוכנית מקבלת את הקלט הסטנדרטי עבור בעיית העצירה: אלגוריתם   M {\displaystyle \ M} וקלט   x {\displaystyle \ x} , ומטרתה לומר האם   M {\displaystyle \ M} מסיים את ריצתו על   x {\displaystyle \ x} או ממשיך לרוץ לנצח. התוכנית שלנו תיצור מ-   M {\displaystyle \ M} ו-   x {\displaystyle \ x} אלגוריתם חדש,   M x {\displaystyle \ M_{x}} , שפועל בצורה הבאה על הקלט   w {\displaystyle \ w} : הפעל את   M {\displaystyle \ M} על הקלט   x {\displaystyle \ x} (אם קיים פלט, נתעלם ממנו). הפעל את   A {\displaystyle \ A} על הקלט   w {\displaystyle \ w} והחזר את התוצאה כפלט. כלומר, האלגוריתם   M x {\displaystyle \ M_{x}} מורכב משני שלבים שאינם קשורים זה בזה. החשיבות של השלב הראשון בכך שהוא מהווה אבן בוחן לשאלה האם   M {\displaystyle \ M} עוצר על   x {\displaystyle \ x} ; אם הוא אינו עוצר,   M x {\displaystyle \ M_{x}} לא יגיע לעולם לשלב השני. בשל אופן הבנייה שלו,   M x {\displaystyle \ M_{x}} מחשב אחת משתי פונקציות: אם   M {\displaystyle \ M} לא עוצר על   x {\displaystyle \ x} , הרי ש-   M x {\displaystyle \ M_{x}} מחשב את הפונקציה הריקה - שכן ללא תלות בקלט   w {\displaystyle \ w} , הוא פשוט רץ לנצח. אם לעומת זאת   M x {\displaystyle \ M_{x}} כן עוצר על   x {\displaystyle \ x} , הרי שהוא יחשב בשלב הבא את פעולת הפונקציה של   A {\displaystyle \ A} על הקלט   w {\displaystyle \ w} . מכיוון שהפונקציה הריקה אינה בעלת התכונה, ואילו   A {\displaystyle \ A} כן בעלת התכונה, נובע מכך שהכרעה בשאלה האם   M x {\displaystyle \ M_{x}} מקיימת את התכונה מכריעה גם את השאלה האם   M x {\displaystyle \ M_{x}} עוצרת על   x {\displaystyle \ x} . לכן כל מה שהתוכנית שלנו עושה כדי לפתור את בעיית העצירה הוא לבדוק באמצעות   Q {\displaystyle \ Q} האם   M x {\displaystyle \ M_{x}} בעלת התכונה, ולענות כמוהו. כלומר, מצאנו פתרון לבעיית העצירה - וזה בלתי אפשרי, בסתירה להנחה הראשונה שקיים אלגוריתם שבודק את קיום התכונה. נשים לב כי לכל תכונה   X {\displaystyle \ X} ניתן לחשוב על התכונה ה"משלימה" לה,   X ¯ {\displaystyle \ {\overline {X}}} . פונקציה מקיימת את   X ¯ {\displaystyle \ {\overline {X}}} אם ורק אם היא אינה מקיימת את   X {\displaystyle \ X} . אם קיים אלגוריתם   Q {\displaystyle \ Q} שמכריע האם הפונקציה שמחשב   A {\displaystyle \ A} היא בעלת התכונה   X {\displaystyle \ X} , אז ניתן ליצור בעזרתו אלגוריתם אחר שבודק האם   A {\displaystyle \ A} היא בעלת התכונה   X ¯ {\displaystyle \ {\overline {X}}} – הוא פשוט מריץ את   Q {\displaystyle \ Q} על   A {\displaystyle \ A} ועונה הפוך ממנו. אלא שהפונקציה הריקה אינה בעלת התכונה   X ¯ {\displaystyle \ {\overline {X}}} (שכן הנחנו שהיא כן בעלת התכונה   X {\displaystyle \ X} ) ולכן הגענו לסתירה לתוצאה שהוכחנו בסעיף הקודם - הראינו כיצד ניתן להכריע האם אלגוריתם   A {\displaystyle \ A} נתון מחשב פונקציה בעלת תכונה לא טריוויאלית שהפונקציה הריקה לא מקיימת. גדי אלכסנדרוביץ', על הבעיה הלא טריוויאלית של זיהוי תכונה לא טריוויאלית, באתר "לא מדויק", 9 באוקטובר 2007 גדי אלכסנדרוביץ', משפט רייס – הגרסה המלאה, באתר "לא מדויק", 18 במאי 2011 משפט רייס, באתר MathWorld (באנגלית)