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

תוכן שנמחק תוכן שנוסף
Atavory (שיחה | תרומות)
מ ←‏דוגמאות לשפות בRE: נווט תחתון לתרגילים
Atavory (שיחה | תרומות)
ארגון מחודש של החלק
שורה 1:
 
{{תורת החישוביות}}
 
ב[[תורת החישוביות/מבוא#מוטיווציה|חלק המוטיווציה במבוא לספר]], ראינו שאי אפשר לכתוב תוכנית מחשב המזהה באופן כללי תוכנית מחשב כלשהי עוצרת כאשר היא מקבלת קלט כלשהו. בחלק זה נגדיר מושג זה ומושגים נלווים בצורה מדוייקת יותר, ונעסוק בתכונותיהם.
נאמר שמ"ט M '''מכריעה''' שפה L אם היא <u>מקבלת</u> כל מילה ב־L ו<u>דוחה</u> כל מילה שאינה ב־L. כלומר, M עוצרת על כל מילת קלט (אין מילים שגורמות למכונה להכנס ללולאה אינסופית).
{{הגדרה|תוכן=שפה L '''ניתנת להכרעה''' אם קיימת מ"ט M שמכריעה אותה.&nbsp;&nbsp;}}
 
בפרק זה נראה שלוש מחלקות של בעיות. באופן לא מדוייק, ה[[#כריעות|שפות הכריעות]] הן משפחת השפות שאפשר לזהות באופן מלא, ואילו [[#כריעות למחצה חיובית|שפות כריעות למחצה חיובית]] ו[[#כריעות למחצה שלילית|שפות כריעות למחצה שלילית]] הן שפות שאפשר לזהות באופן חלקי.
דוגמאות של שפות כריעות:
 
בשאר חלקי הפרק נעסוק במחלקות אלו. הפרק [[תורת החישוביות/כריעות שפות/קיום שפות שאינן כריעות/ארגז חול|קיום שפות שאינן כריעות]] מראה שאכן יש שפות שאי אפשר לזהותן (כפי שראינו מעט ב[[תורת החישוביות/מבוא#מוטיווציה|חלק המוטיווציה במבוא]]). הפרקים [[תורת החישוביות/כריעות שפות/רדוקציה|רדוקציה]] ו[[תורת החישוביות/כריעות שפות/משפט רייס|משפט רייס]] מראים שתי טכניקות כלליות ביותר, שכ"א מהן יכולה לשמש להוכחה ששפה כלשהי נמצאת (או לא) באחת ממחלקות אלו. הפרק [[תורת החישוביות/כריעות שפות/אי-הפרדתיות רקורסיבית|אי-הפרדתיות רקורסיבית]] דן במאפיין נוסף של שפות במחלקות אלו.
 
==סוגי הכריעות ומחלקות הכריעות==
 
===כריעות (מלאה)===
 
אינטואיטיבית, שפה היא '''כריעה''' אם יש מכונת טיורינג העוצרת בוודאות על כל קלט, ומקבלת או דוחה בצורה נכונה האם הקלט שייך לשפה.
 
{{הגדרה|תוכן=
נאמר שמ"ט <math>M</math> '''מכריעה''' שפה <math>L</math> אם היא <u>מקבלת</u> כל מילה ב־<math>L</math> ו<u>דוחה</u> כל מילה שאינה ב־<math>L</math>. כלומר, <math>M</math> עוצרת על כל מילת קלט (אין מילים שגורמות למכונה להכנס ללולאה אינסופית).
 
שפה <math>L</math> '''ניתנת להכרעה''' אם קיימת מ"ט <math>M</math> שמכריעה אותה. שפה <math>L</math> '''אינה כריעה''' אם לא קיימת מ״ט <u>שמכריעה</u> אותה.
}}
 
{{דוגמה|תוכן=
להלן דוגמאות לשפות כריעות:
# השפה <math>\Sigma^*</math> – לכל קלט, בצעד החישוב הראשון המכונה עוברת ל־<math>q_{acc}</math>.
# השפה הריקה <math>\emptyset</math> – לכל קלט, המכונה עוברת בצעד החישוב הראשון ל־<math>q_{rej}</math>.
#כל שפה סופית <math>L=\{ a_1, a_2, \ldots, a_n \}</math> – נבדוק כל מילה אפשרית. מכיוון שכמות המילים סופית, נדרשים מספר סופי של מצבים (ובפרט, זו [[אוטומטים ושפות פורמליות/תכונות של שפות רגולריות|שפה רגולרית]])
# (כל שפה רגולרית – אוטומט סופי הוא מקרה פרטי של מכונת טיורינג, לכן מ"ט מסוגלת לחשב כל מה שאוטומט סופי יכול.)
# <math>\}</math> מספר האפסים בקלט שווה למספר האחדים <math>L=\{ x\in\{0,1\}^* \mid</math>. (זו שפה לא-רגולרית)
}}
 
נוכל כמובן להגדיר את מחלקת השפות הכריעות.
נאמר ששפה <math>L</math> '''אינה כריעה''' אם לא קיימת מ״ט <u>שמכריעה</u> אותה.
{{הגדרה|שם=מחלקת השפות הכריעות (או הרקורסיביות)|תוכן=
 
נגדיר את המחלקה <math>R</math> כקבוצת השפות ה'''כריעות''' (לחלופין, '''ניתנות להכרעה''' או '''רקורסיביות''', '''R'''ecursive)
{{-}}
==כריעות: מחלקות של שפות ותכונותיהן==
נגדיר את מחלקות השפות הבאות:
{{הגדרה|תוכן=
1. <math>R</math> – קבוצת השפות ה'''כריעות''' (גם: '''ניתנות להכרעה''' או '''רקורסיביות''', '''R'''ecursive)
<center>
<math>LR= \}</math>{ L ניתנת\;|\; להכרעה‏ <math>R=L \text{ Lrecursive} \mid }</math>
</center>
}}
 
===כריעות למחצה חיובית===
2. <math>RE</math> – קבוצת השפות ה'''כריעות למחצה''' (גם: כריעות למחצה '''(לחיוב)''' או שפות הניתנות ל'''מניה רקורסיבית''', '''R'''ecursive '''E'''numerable)
 
<center><math>\ \}</math> קיימת מ"ט M ש<u>מקבלת</u> את כל המילים ב־L ו<u>אינה מקבלת</u> אף מילה שאינה ב־L (אבל לאו דווקא דוחה) <math>RE = \{ L \mid</math></center>
גם אם שפה איננה כריעה לחלוטין, עדיין אפשר לחשוב על כריעות חלקית במובן כלשהו. אינטואיטיבית, שפה היא '''כריעה למחצה חיובית''' אם יש מכונת טיורינג העוצרת בוודאות על כל קלט השייך לשפה ומקבלת אותה, ואיננה עוצרת ומקבלת קלט שאינו שייך לשפה (יחד עם זאת, אם הקלט אינו שייך לשפה, היא איננה חייבת לעצור).
{{הגדרה|תוכן=
נאמר שמ"ט <math>M</math> '''מכריעה למחצה חיובית''' או '''מונה רקורסיבית''' שפה <math>L</math> אם היא <u>מקבלת</u> כל מילה ב־<math>L</math> ואיננה מקבלת מילה שאיננה ב-<math>L</math>
 
שפה <math>L</math> '''ניתנת למנייה רקורסיבית''' אם קיימת מ"ט <math>M</math> שמכריעה אותה למחצה חיובית. שפה <math>L</math> '''אינה נתנת למניה רקורסיבית''' אם לא קיימת מ״ט המקבלת אותה למחצה חיובית.
3. <math>coRE</math> – קבוצת השפות ה'''כריעות למחצה (לשלילה)'''
<center><math>\}</math> קיימת מ"ט M ש<u>דוחה</u> את כל המילים שאינן ב־L ו<u>אינה דוחה</u> אף מילה ב־L (אבל לאו דווקא מקבלת) <math>coRE = \{ L \mid</math></center>
}}
 
נשים לב, אלו מחלקות של שפות, כלומר קבוצה של שפות שונות. כל קבוצה כזו מכילה אינסוף שפות שונות (וכל שפה כשלעצמה, מכילה מספר סופי או אינסופי של מילים).
 
{{חלון מידע|
מעט [[w:אטימולוגיה|אטימולוגיה]].
 
שפה נקראת "נתנת למניה רקורסיבית" מהסיבה הבאה. נניח ש-<math>L</math> היא שפה נתנת למניה רקורסיבית ע"י מ"ט <math>M</math>. נקח מניה כלשהי של המחרוזות על פני <math>\Sigma^*</math>. כעת נפעיל את <math>M</math> צעד אחד על המחרוזת הראשונה במניה, 2 צעדים על כ"א מ2 המחרוזות הראשונות במניה, 3 צעדים על כ"א מ3 -המחרוזות הראשונות במניה, וכו'. ברור שכל מחרוזת השייכת לL, תזוהה ככזו בשלב כלשהו ע"י כך שM תעצור ותקבל אותה. בכל פעם שמילה מתקבלת, נרשום אותה ברשימה בצד.
אין קשר ישיר בין "רקורסיבית" במושג "שפה רקורסיבית" לבין [[w:פונקציות רקורסיביות|פונקציות רקורסיביות]] בשפות תכנות.
מצאנו דרך לבצע מניה של כל המחרוזות של <math>L</math>.
}}
 
 
שפה נקראת "נתנת למניה רקורסיבית" מהסיבה הבאה. נניח שL היא שפה נתנת למניה רקורסיבית ע"י מ"ט M. נקח מניה כלשהי של המחרוזות על פני
להלן מספר דוגמאות לשפות נתנות למניה רקורסיבית:
<math>\Sigma^*</math>. כעת נפעיל את M צעד אחד על המחרוזת הראשונה במניה, 2 צעדים על כ"א מ2 המחרוזות הראשונות במניה, 3 צעדים על כ"א מ3 המחרוזות הראשונות במניה, וכו'. ברור שכל מחרוזת השייכת לL, תזוהה ככזו בשלב כלשהו ע"י כך שM תעצור ותקבל אותה. בכל פעם שמילה מתקבלת, נרשום אותה ברשימה בצד. אם כך, מצאנו דרך לבצע מניה של כל המחרוזות השייכות לL.
 
{{דוגמה|שם=השפה האוניברסלית|תוכן=
'''השפה האוניברסלית''' מוגדרת כך: <math>L_U = \{ (\langle M \rangle,x) \mid x \in L(M) \}</math>{{ש}}
כל מילה בשפה זו מורכבת משתי מחרוזות – הראשונה היא קידוד של מכונה <math>M</math> והשניה הינה מחרוזת כלשהי <math>x</math>. המילה <math>(\langle M \rangle,x)</math> שייכת לשפה האוניברסלית אם המחרוזת <math>x</math> מתקבלת ע״י המכונה <math>M</math>.
 
נוכיח כריעות למחצה חיובית: נבנה מכונה אשר על הקלט <math>(\langle M \rangle,x)</math> [[תורת החישוביות/מכונת טיורינג אוניברסלית#המכונה האוניברסלית|מסמלצת הרצה]] של המכונה <math>M</math> על הקלט <math>x</math>, ומתנהגת כמותה (כלומר, אם <math>M</math> עצרה במצב <math>q_{acc}</math>, נקבל ואם עצרה ב־<math>q_{rej}</math> – נדחה. אם <math>M</math> אינה עוצרת, כך גם המכונה שבנינו.
}}
 
 
{{דוגמה|שם=שפת האלכסון|תוכן=
'''שפת האלכסון''' מוגדרת כך: <math>L_D = \{ \langle M \rangle \mid \langle M \rangle\in L(M)</math>{{ש}}
דהיינו, קידודי כל המכונות המקבלות את הקידוד של עצמן.
 
הקידוד של המכונה M ששפתה <math>L(M)=\Sigma^*</math> שייך ל־<math>L_D</math>, כי <math>M</math> מקבלת כל קלט ובפרט את המחרוזת <math>\langle M \rangle</math>.
נוכיח כריעות למחצה חיובית: כמקודם, נבנה מכונה שמסמלצת את הרצת <math>M</math> על הקלט <math>\langle M \rangle</math>, ומקבלת/דוחה בהתאם לסימולציית ההרצה.
}}
 
{{דוגמה|שם=שפת בעיית העצירה|תוכן=
שפת '''בעיית העצירה''' מוגדרת כך: <math>M \}</math> עוצרת על <math>L_{HP} = \{ (\langle M \rangle,x) \mid x</math>{{ש}}
 
נוכיח כריעות למחצה חיובית: נריץ את <math>M</math> על <math>x</math> – אם המכונה תעצור, נקבל. אחרת – <math>M</math> לא עצרה וגם המכונה המסמלצת בלולאה אינסופית, ואינה מקבלת את הקלט הנ״ל.
}}
 
גם כאן נוכל כמובן להגדיר את מחלקת השפות הנתנות למנייה רקורסיבית.
{{הגדרה|שם=מחלקת השפות הכריעות למחצה חיובית (או הנתנות למניה רקורסיביות)|תוכן=
 
נגדיר את המחלקה <math>RE</math> כקבוצת השפות ה'''כריעות למצה חיובית''' (לחלופין, '''נתנות למניה רקורסיבית''', '''R'''ecursively '''E'''numerable)
<center>
<math>RE= \{ L \;|\; L \text{ recursively enumerable} \}</math>
</center>
}}
 
===כריעות למחצה שלילית===
 
הגדרה זו מזכירה ל[[#כריעות למחצה חיובית|כריעות למחצה חיובית]] אך הפוכה לה. אינטואיטיבית, שפה היא '''כריעה למחצה שלילית''' אם יש מכונת טיורינג העוצרת בוודאות על כל קלט שאינו שייך לשפה ודוחה אותה, ואיננה עוצרת ודוחה קלט ששייך לשפה (יחד עם זאת, אם הקלט שייך לשפה, היא איננה חייבת לעצור).
 
{{הגדרה|תוכן=
נאמר שמ"ט <math>M</math> '''מכריעה למחצה שלילית''' היא <u>דוחה</u> כל מילה שאיננה ב־<math>L</math> ואיננה דוחה מילה ב-<math>L</math>
}}
 
 
{{הגדרה|שם=מחלקת השפות הכריעות למחצה שלילית)|תוכן=
 
נגדיר את המחלקה <math>coRE</math> כקבוצת השפות ה'''כריעות למצה שלילית''' ('''coR'''ecursively '''E'''numerable)
<center>
<math>RE= \{ L \;|\; L \text{ co-recusively enumerable} \}</math>
</center>
}}
 
 
==תכונות מחלקות הכריעות==
 
בחלק זה נוכיח תכונות של מחלקות הכריעות, ובפרט נוכיח שהתרשים הבא מתאר אותן.
 
[[File:RecursiveSets.png|500px|left|הייחסים בין קבוצות השפות]]
 
 
 
{{טענה|
שורה 45 ⟵ 120:
#<math>R=RE \cap coRE</math>}}
 
{{הוכחה:|תוכן=
קל לראות כי <math>R \subseteq RE\cap coRE</math> כי אם השפה ניתנת להכרעה, אז ברור שקיימת מכונה שרק דוחה או רק מקבלת.
 
שורה 51 ⟵ 126:
מכיוון ש־<math>L\in RE</math> קיימת מ"ט <math>M_1</math> שמקבלת כל מילה <math>x\in L</math> ולא מקבלת <math>x\in \overline L</math>. באופן דומה, מכיוון ש־<math>L\in coRE</math> קיימת מ"ט <math>M_2</math> שדוחה כל מילה <math>x\in \overline L</math> ולא דוחה אף <math>x\in L</math>.{{ש}}
נריץ את שתי המכונות במקביל (למשל ע״י שני סרטים): אם <math>M_1</math> מקבלת, נקבל; ואם <math>M_2</math> דוחה, נדחה (הראשון מביניהם). כל מילה <math>x</math> או שייכת או לא שייכת ל־<math>L</math> ולכן בהכרח אחד משני המקרים לעיל ייתרחש לאחר זמן סופי (כלומר, אם הקלט בשפה הוא בהכרח ייתקבל ע״י <math>M_1</math> לאחר זמן סופי, ואם הוא לא בשפה הוא יידחה ע״י <math>M_2</math> לאחר זמן סופי). לפיכך, המכונה שבנינו עוצרת על כל קלט אפשרי עם התשובה הנכונה.
}}
 
{{טענה|תוכן=
:3.{{רווח קשיח|2}}<math>\ R</math> סגורה למשלים: אם <math>L \in R</math> אז גם השפה המשלימה, <math>\overline{L}\in R</math>{{רווח קשיח|2}}
}}
 
הוכחה:
{{הוכחה|תוכן=
אם <math>L\in R</math> אז קיימת מ"ט M המכריעה את L. נבנה מ"ט <math>\overline M</math> ע״י החלפת המצבים הסופיים: <math>q_{acc,M}=q_{rej,\overline M}</math> ו־<math>q_{rej,M}=q_{acc,\overline M}</math>.{{ש}}
<math>\overline M</math> עוצרת על כל קלט (כי <math>M</math> עוצרת על כל קלט), ובנוסף, <math>\overline M</math> עונה הפוך מ־<math>M</math>, כלומר <math>L(\overline M)= \overline M</math> כנדרש.
}}
 
{{טענה|תוכן=
שורה 74 ⟵ 152:
:6.{{רווח קשיח|2}}<math>R, RE, coRE</math> סגורות לחיתוך ושרשור{{רווח קשיח|2}}}}
(תרגיל: הוכח).
 
== דוגמאות לשפות בRE==
נביא מספר דוגמאות לשפות ב־RE. בפרק [[תורת החישוביות/כריעות שפות/שפות שאינן כריעות|שפות שאינן כריעות]] נוכיח כי השפות להלן '''אינן כריעות'''
 
1. '''השפה האוניברסלית''', <math>L_U = \{ (\langle M \rangle,x) \mid x \in L(M) \}</math>{{ש}}
כל מילה בשפה זו מורכבת משתי מחרוזות – הראשונה היא קידוד של מכונה M והשניה הינה מחרוזת כלשהי x. המילה <math>(\langle M \rangle,x)</math> שייכת לשפה האוניברסלית אם המחרוזת x מתקבלת ע״י המכונה M.
:שייכות ל־RE: נבנה מכונה אשר על הקלט <math>(\langle M \rangle,x)</math> [[../מכונת טיורינג אוניברסלית#המכונה האוניברסלית|מסמלצת הרצה]] של המכונה M על הקלט x, ומתנהגת כמותה (כלומר, אם M עצרה במצב <math>q_{acc}</math>, נקבל ואם עצרה ב־<math>q_{rej}</math> – נדחה. אם M אינה עוצרת, כך גם המכונה שבנינו.
 
 
 
2. '''שפת האלכסון''', <math>L_D = \{ \langle M \rangle \mid \langle M \rangle\in L(M)</math>{{ש}}
אוסף כל המחרוזות, שהמכונה שהן מקודדות מקבלת את מחרוזת הקלט (שהיא הקידוד עצמו של המכונה). כלומר - קידודי כל המכונות המקבלות את הקידוד של עצמן. דוגמא, הקידוד של המכונה M ששפתה <math>L(M)=\Sigma^*</math> שייך ל־<math>L_D</math>, כי M מקבלת כל קלט ובפרט את המחרוזת <math>\langle M \rangle</math>.
:שייכות ל־RE: כמקודם, נבנה מכונה שמסמלצת את הרצת M על הקלט <math>\langle M \rangle</math>, ומקבלת/דוחה בהתאם לסימולציית ההרצה.
 
 
3. '''בעיית העצירה''', <math>M \}</math> עוצרת על <math>\text{HP} = \{ (\langle M \rangle,x) \mid x</math>{{ש}}
:שייכות ל־RE: נריץ את M על x – אם המכונה תעצור, נקבל. אחרת – M לא עצרה וגם המכונה המסמלצת בלולאה אינסופית, ואינה מקבלת את הקלט הנ״ל.
 
 
מההגדרה, נובע עבור השפות המשלימות, <math>\overline{L_U}, \overline{L_D}, \overline{\text{HP}} \in coRE</math>.
 
[[קטגוריה:תורת החישוביות]]