תורת החישוביות/כריעות שפות/רדוקציה חישובית: הבדלים בין גרסאות בדף

תוכן שנמחק תוכן שנוסף
Atavory (שיחה | תרומות)
מ הגהה
Atavory (שיחה | תרומות)
שורה 5:
 
<div class="toclimit-3">__TOC__</div>
==דוגמה לרדוקציה ומאפייניה==
==מוטיבציה==
נתונה הבעיה: עבור רשימת מספרים הנתונה כקלט, מצא האם קיימים שנים מספרים זהים.
 
נניח שנתנת לנו הבעיה הבאה: נתונה רשימת מספרים, ועלינו למצוא האם האיבר הגדול ביותר מופיע לפחות שלוש פעמים. כמובן שאפשר לפתור זאת בדרכים שונות. עם זאת, נניח שעומדת ברשותנו שגרה המקבלת רשימת מספרים, ומוצאת האם האיבר ה''קטן'' ביותר מופיע ''פחות'' משלוש פעמים. האם נוכל להשתמש בשגרה זו? בודאי. נוכל לעשות זאת באופן הבא:
פתרון אפשרי הוא ראשית למיין את הרשימה, ואז לבצע סריקה על הרשימה הממוינת לאיתור שני מספרים עוקבים זהים. כלומר, ראשית אנו '''ממירים''' את הקלט לקלט אחר (רשימה ממוינת), ואח"כ אנחנו '''פותרים בעיה קלה''' בהרבה – מציאת שני מספרים זהים ברשימה ממויינת.
# נקח את הרשימה המקורית, ונמיר אותה לרשימת המספרים ההפוכים בסימניהם לרשימה המקורית (לדוגמה, הרשימה <math>[1, -3, 4, 2]</math> תהפוך לרשימה <math>[-1, 3,-4, -2]</math>).
# נפעיל את השגרה שכבר קיימת לנו, ונקבל את תוצאתה.
# נחזיר את ההיפך מהתוצאה שהתקבלה.
 
קל לראות ששיטה זו פותרת את הבעיה החדשה. אמ"ם האיבר הקטן ביותר ברשימה החדשה, נסמנו כ
לא כל המרה לבעיה אחרת תעזור לנו לפתרון הבעיה המקורית. כדי להשתמש בשיטה זו נדרשות תכונות תכונות מסויימות מתהליך ההמרה:
<math>-y</math>
#לכל קלט יש קלט מומר – ניתן להמיר כל קלט!
מופיע פחות משלוש פעמים ברשימה החדשה, אז לא נכון שהמספר הגדול ביותר ברשימה המקורית, y, מופיע לפחות שלוש פעמים ברשימה המקורית.
 
אפשר לראות שהמרנו בעיה חדשה לבעיה קודמת, לגביה אנו יודעים יותר (במקרה זה, יש כבר שגרה כתובה לה), באופן שמועיל לפתרון. מה מאפיין המרה זו?
#לכל קלט לבעיה המקורית יש קלט מומר לבעיה הקודמת – ניתן להמיר כל קלט!.
#ניתן לבצע את ההמרה ע״י מ״ט – ההמרה ברת־חישוב.
#מפתרון הבעיה הקודמת אפשר להסיק חד-משמעית את הפתרון לבעיה .
#פתרון הבעיה השניה (על הקלט המומר) '''זהה''' לפתרון הבעיה המקורית על הקלט המקורי. (או לכל הפחות, מפתרון הבעיה השניה ניתן להסיק את פתרון הראשונה).
 
הרדוקציה, לכן, ממירה בעיה חדשה לבעיה קודמת שעליה אנו כבר יודעים משהו. בדוגמה זו, מצאנו דרך לפתור בעיה חדשה ע"י המרה לבעיה שפתרונה כבר קיים. אפשר לעשות גם הפוך: בהנתן בעיה, אפשר להראות שלו היה לה פתרון, אז היה גם פתרון לבעיה אחרת שלה ידוע שאין פתרון. בהמשך הפרק נשתמש ברעיון הרדוקציה כדי להמיר בין שפות פורמליות, בעיקר כדי להראות לגבי חלקן שהן אינן כריעות.
כעת נממש את הרעיון לעיל על שפות פורמליות.
 
==הגדרה==