למת הניפוח לשפות רגולריות

למת הניפוח נועדה להוכיח ששפה <math>L</math> כלשהי איננה שפה רגולרית. הלמה מגדירה תנאי הכרחי לרגולריות שפה, והשימוש העיקרי בה הוא בהוכחה בדרך השלילה ששפה איננה רגולרית על ידי הוכחת אי קיומו של התנאי עליו מדברת הלמה. הלמה נוסחה והוכחה על ידי יהושע בר-הלל, מיכה פרלס, ואלי שמיר מהאוניברסיטה העברית בירושלים.

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

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

ייתכן שגם שפות שאינן רגולריות יכילו בתוכן תבנית כלשהי, ולכן ייתכן שלמת הניפוח תתקיים גם עבור שפות שאינן רגולריות. אולם על פי הלמה כל שפה שהיא רגולרית ניתנת לניפוח, ולכן אם לא ניתן לנפח שפה כלשהי, הדבר גורר את היותה אי-רגולרית.

==למת הניפוח לשפות הרגולריות==
תהי <math>L</math> שפה רגולרית. אז קיים מספר טבעי <math>n</math>, כך שכל מילה <math>z</math> ב-<math>L</math>, שאורכה לפחות <math>n</math>, ניתנת לפירוק מהצורה <math>z = uvw</math>, באופן שמתקיימים התנאים האלה:

1. <math>|uv| \leq n</math>

2. <math>|v| \geq 1</math>

3. לכל <math>i \geq 0</math> טבעי מתקיים <math>z_i = u v^i w \in L </math>

כמובן, ייתכן מצב בו <math>u = \varepsilon </math> או <math>w = \varepsilon </math>.

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

התנאי השני מבטיח לנו שהקטע שאותו אנו מנפחים אינו טריוויאלי (כלומר, יש בו לפחות אות אחת).

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

==דוגמאות==
===שפה שאינה ניתנת לניפוח===
השפה <math>L_{ab}=\left\{a^ib^i|i\isin\mathbb{N}\right\}</math> ידועה כשפה לא רגולרית. נראה כיצד ניתן להשתמש בלמת הניפוח כדי לראות זאת.

נניח בשלילה כי השפה כן רגולרית, אז קיים ה- <math>n</math> שקיומו מובטח על ידי המשפט. נביט במילה <math>a^nb^n</math>. אורכה גדול מ-<math>n</math> (הוא בדיוק <math>2n</math>) ולכן המילה ניתנת לניפוח, כלומר קיים לה פירוק <math>\ uvw </math> כמתואר.

כעת, מכיוון ש-<math>|uv|\le n</math> בהכרח <math>uv=a^k</math>, שכן <math>n</math> האותיות הראשונות במילה הן <math>a</math>-ים. לכן <math>v=a^t</math> כאשר <math>1 \le t \le n</math> (שהרי מהלמה <math>|v| \geq 1</math>).

כעת נביט על המילה <math>uv^0w</math>, כלומר <math>uw</math>. מילה זו שייכת לשפה על פי למת הניפוח. אבל היא בדיוק מהצורה <math>\ a^{n-t}b^n</math> ומכיוון ש-<math>t \ge 1</math> הרי שבהכרח <math>n-t \ne n</math>, והגענו לסתירה, כי כל המילים בשפה הן כאלו שבהן מספר ה-<math>a</math>-ים וה-<math>b</math>-ים זהה. לכן <math>\ L</math> אינה שפה רגולרית.

===שפה רגולרית שאינה ניתנת לניפוח===
נביט בשפה <math>L=\left\{ab\right\}</math>, כלומר השפה שמכילה מילה בודדת: <math>ab</math>. ברור כי לא ניתן לנפח את השפה הזו - מכיוון שקיימת בה רק מילה אחת, אם נגדיל או נקטין את מספר האותיות בה נקבל מילה אחרת, שאינה שייכת לשפה. עם זאת, השפה רגולרית, כי כל שפה סופית היא רגולרית.

אין כאן סתירה עם למת הניפוח, מכיוון שבמקרה זה הלמה מתקיימת באופן ריק. נוכל לבחור <math>n=3</math> ואז לא תהיה קיימת בשפה אף מילה שאורכה גדול מ-<math>n</math>. מכיוון שרק מילים מגודל זה ואילך אמורות להיות ניתנות לניפוח, הלמה כלל לא עומדת למבחן ולכן תנאיה מתקיימים.

בצורה דומה, כל שפה סופית מקיימת את תנאי למת הניפוח באופן ריק. פשוט בוחרים <math>n</math> שגדול מגודלה של המילה הגדולה ביותר בשפה. בשפות אינסופיות זה בלתי אפשרי, כי בכל שפה אינסופית גודל המילים אינו חסום.
==רעיון ההוכחה==
עבור כל שפה סופית ניתן לבחור בתור הקבוע <math>n</math> מספר כלשהו הגדול מאורך כל המילים בשפה (אם אורך המילים בשפה אינו חסום, השפה בהכרח אינסופית) ואז תנאי המשפט מתקיימים באופן ריק. על כן, ההוכחה עוסקת רק בשפה רגולרית אינסופית כלשהי <math>L</math>.

על פי הגדרתה, שפה רגולרית היא שפה שקיים אוטומט סופי דטרמיניסטי המקבל אותה. לכן עבור <math>L</math> קיים אוטומט סופי דטרמיניסטי <math>A</math> המקבל אותה. בתור <math>n</math> בוחרים את מספר מצביו של האוטומט הזה (כאן באה הסופיות של האוטומט לידי ביטוי).

המחשת הוכחת הלמה
כעת, אם <math>z</math> היא מילה שאורכה לפחות <math>\ n</math>, בריצתו של האוטומט עליה הוא מבצע לפחות <math>n</math> צעדים (בכל צעד נקראת אות אחת מהמילה) ולכן עובר ב-<math>n+1</math> מצבים של האוטומט. מכיוון שיש באוטומט רק <math>n</math> מצבים, נובע מעקרון שובך היונים שקיים מצב <math>q</math> שהאוטומט מבקר בו פעמיים תוך כדי קריאת <math>n</math> האותיות הראשונות.

כעת מפרקים את <math>z</math> כדלהלן: בתור <math>u</math> בוחרים את הרישא של המילה אותה קורא האוטומט עד שהוא מגיע לראשונה למצב <math>q</math>. בתור <math>v</math> בוחרים את המשך המילה אותה האוטומט קורא עד שהוא חוזר אל המצב <math>q</math>. בתור <math>w</math> בוחרים את שאר המילה.

תנאי מספר 1 מתקיים בבירור שכן <math>u,v</math> נבחרו שתיהן מתוך <math>n</math> האותיות הראשונות של המילה. גם תנאי מספר 2 מתקיים שכן כדי לבקר פעמיים במצב <math>q</math> על האוטומט לקרוא לפחות אות אחת מהרגע בו ביקר במצב בפעם הראשונה ועד שהוא מבקר בו בפעם השנייה.

תנאי מספר 3 מתקיים מכיוון שאין לאותיות שהאוטומט קורא בזמן המעבר מ-<math>q</math> חזרה אל <math>q</math> שום השפעה על שאר ריצתו. ניתן להשמיט אותן כליל, ואז האוטומט יבקר רק פעם אחת ב-<math>\ q</math> וימשיך לקרוא את <math>w</math> מיד לאחר מכן, וניתן גם לחזור עליהן מספר שרירותי של פעמיים והדבר יתבטא בכך שהאוטומט ישוב ל-<math>q</math> כמספר הפעמים הזה, ולאחר מכן יחזור לקרוא את <math>w</math> כמו במילה המקורית.

== ראו גם ==
*למת הניפוח לשפות חופשיות הקשר
*תורת האוטומטים - מונחים

== לקריאה נוספת ==
* 
* 

==קישורים חיצוניים==

* 

==הערות שוליים==

קטגוריה:שפות פורמליות
ניפוח לשפות רגולריות
ניפוח