אוטומטים ושפות פורמליות/תכונות של שפות רגולריות/למת הניפוח לשפות רגולריות
עד כאן עסקנו בשפות רגולריות וראינו תכונות שלהן. כעת נשאל מהן שפות לא-רגולריות. כמובן שיש המון שפות כאלו, ולא נוכל לאפיין את כולן בצורה אחת, אבל יש באפשרותנו ליצור כלים הבוחנים האם שפה מסויימת היא רגולרית או לא. הכלי העיקרי נקרא למת הניפוח.
שפה לא רגולרית
עריכהנתחיל בדוגמא. האם ניתן לבנות אוטומט סופי לשפה הבאה:
נסו לבנות מכונה כזו, ונסו להבין מדוע הבנייה נכשלת.
ניכר כי למכונה הנ"ל צריכים להיות אינסוף מצבים, אשר "זוכרים" בכל רגע נתון, מה ההפרש בין כמות האפסים וכמות האחדים שהמכונה ראתה עד כה. נוכיח שאין מכונה כזו.
הוכחה: נניח בשלילה שקיים אס"ד שמכריע את השפה הנ"ל. נניח שלאוטומט יש n מצבים, ונביט על פעולתו עבור הקלט אנחנו יודעים שבמהלך קריאת האפסים, האוטומט מגיע פעמים לאותו מצב (עקב עקרון שובך היונים), נסמן מצב זה ב -r. מכיוון שכל ה"זיכרון" של האוטומט הוא המצב, אנחנו יכולים "למחוק" את כל האפסים שבין שתי הפעמים שהאוטומט מגיע למצב r. נניח שבין שתי הפעמים נקראו i אפסים. אם כך הקלט חייב להתקבל על-ידי המכונה, מכיוון שהיא עוברת בדיוק באותם מצבים כמו עבור הקלט , רק במקום להגיע פעמיים למצב r, היא מגיעה אליו פעם אחת (ואז ממשיכה כמו בקלט המקורי עד קבלת הקלט)
למת הניפוח
עריכהלמת הניפוח לשפה רגולרית משתמשת ומכלילה את הרעיון שהוצג בדוגמא לעיל: העובדה שלאוטומט מספר מצבים סופי גורם לכך שהקלטים שהאוטומט מקבל חייבים להיות במבנה מסויים. ספציפית, אם האוטומט מקבל מילה כלשהי ארוכה דיה (ארוכה יותר ממספר המצבים של האוטומט), אז הוא חייב לקבל גם מילים שבנויות בצורה דומה למילה שהתקבלה ללא ה"חזרות" (ללא הקלט בין שתי הפעמים בהם האוטומט ביקר במצב r, בדוגמא לעיל.) באופן דומה, האוטומט חייב לקבל גם מילים שבנויות בצורה דומה אבל בתוספת החזרות. באופן מדוייק,
משפט: למת הניפוח לשפות רגולריות
עריכהלכל שפה רגולרית קיים מספר כך שעבור כל מילה בשפה הארוכה מ- , ניתן לפרק את המילה לשלושה חלקים כך ש- , ומתקיים
- לכל גם המילה שייכת לשפה
הוכחה:
נניח ש- רגולרית, אזי קיים אוטומט שמכריע אותה, ויהי מספר המצבים ב- . יהי . נביט על פעולת המכונה כאשר הקלט הוא .
מכיוון שהאורך של הקלט הוא לכל הפחות , המכונה מבצעת לפחות מעברים. נובע שהמכונה "מבקרת" בלכל הפחות n+1 מצבים (נסמנם ). לפי עקרון שובך היונים, לפחות שנים מהמצבים הנ"ל שווים, בהנ"כ נניח ש .
נשים לב שבין שני המצבים המכונה קוראת את הקלט . נסמן מחרוזת זו ב- . כלומר נוכל לפרק את x בצורה הבאה ולכן, לפי העקרון שראינו לעיל (המכונה לא יכולה להבדיל בין מצב למצב ), גם הוספת מספר פעמים, או השמטתו, לא משנות את העובדה שהמכונה מקבלת את הקלט, כלומר לכל .
דוגמאות
עריכהשפה שאינה ניתנת לניפוח
עריכההשפה ידועה כשפה לא רגולרית. נראה כיצד ניתן להשתמש בלמת הניפוח כדי להוכיח זאת.
נניח בשלילה כי השפה כן רגולרית, ונניח ש- הוא המספר שקיומו מובטח על ידי למת הניפוח. נביט במילה . אורכה גדול מ- (אורכה הוא בדיוק ) ולכן המילה ניתנת לניפוח, כלומר קיים לה פירוק כמתואר.
כעת, מכיוון ש- בהכרח , כאשר . זאת מכיוון ש- האותיות הראשונות במילה הן .
לכן, כאשר . כעת נביט על המילה , כלומר . מילה זו שייכת לשפה על פי למת הניפוח. אבל היא בדיוק מהצורה ומכיוון ש- הרי שבהכרח , והגענו לסתירה, מפני שבכל המילים בשפה L מספר ה- וה- זהה. לכן אינה שפה רגולרית.
שפה רגולרית שאינה ניתנת לניפוח
עריכהנביט בשפה , כלומר השפה שמכילה מילה בודדת: . ברור כי לא ניתן לנפח את השפה הזו - מכיוון שקיימת בה רק מילה אחת, אם נגדיל או נקטין את מספר האותיות בה נקבל מילה אחרת, שאינה שייכת לשפה. עם זאת, השפה רגולרית, כי כל שפה סופית היא רגולרית.
אין כאן סתירה עם למת הניפוח, מכיוון שבמקרה זה הלמה מתקיימת באופן ריק. נוכל לבחור ואז לא תהיה קיימת בשפה אף מילה שאורכה גדול מ- . מכיוון שרק מילים מגודל זה ואילך אמורות להיות ניתנות לניפוח, הלמה כלל לא עומדת למבחן ולכן תנאיה מתקיימים.
בצורה דומה, כל שפה סופית מקיימת את תנאי למת הניפוח באופן ריק. פשוט בוחרים שגדול מגודלה של המילה הגדולה ביותר בשפה. בשפות אינסופיות זה בלתי אפשרי, כי בכל שפה אינסופית גודל המילים אינו חסום.
תרגיל
עריכהתרגיל : הוכח כי השפה , אינה רגולרית | ||
---|---|---|
|
הרחבה של הלמה
עריכהבלמה שראינו לעיל, אחת הדרישות היא , ומשמעותה שה"לולאה" שנוצרת נמצאת קרוב לתחילת המילה . דרישה זו היא מלאכותית – אם ניקח מילה ארוכה דיה, אין סיבה שנגביל את הניפוח ל- האותיות הראשונות. למעשה – כל תת-מחרוזת ארוכה דיה ב- תגרום לאוטומט הסופי לבקר במצב כלשהו פעמיים ותאפשר "ניפוח". רעיון זה מוביל ללמת הניפוח המוכללת המובאת להלן:
משפט: למת הניפוח המוכללת לשפות רגולריות
עריכהלכל שפה רגולרית קיים מספר כך שעבור כל מילה בשפה הארוכה מ- , ניתן לפרק את המילה לשלושה חלקים כך ש- , ולכל פירוק כנ"ל המקיים ניתן לפרק את תת המחרוזת לשלושה חלקים ומתקיים
- לכל גם המילה שייכת לשפה
ניתן לחשוב על תת-המחרוזת כעל המילה אותה ניפחנו בלמה ה"פשוטה" שהצגנו למעלה. החלוקה מאפשרת לבחור את החלק לניפוח בכל מקום במילה, ולא רק בראשה.
הפרק הקודם: סגירות תחת פעולות שונות |
למת הניפוח לשפות רגולריות תרגילים |
הפרק הבא: משפט מיהיל-נרוד |