אוטומטים ושפות פורמליות/ביטויים רגולריים
מהם ביטויים רגולריים?
נגדיר קבוצה זו בצורה אינדוקטיבית:
- (בסיס 1) אות (מהאלפבית): לדוגמא
- (בסיס 2) אות ריקה:
- (בסיס 3) ביטוי ריק:
- (צעד 1) איחוד של ביטויים רגולריים: (לעיתים מסומן על-ידי חיבור: )
- (צעד 2) שרשור:
- (צעד 3) כוכב:
לדוגמא: מתאים למילים שמתחילות ברצף אפסים, ואחריהן 1, או רצף אפסים ואז רצף אחדים ו-0. כל ביטוי שכנ"ל מתאים לשפה ספציפית. נסמן ב- את השפה המתאימה לביטוי . בסיס האינדוקיציה מוגדר לפי:
ושלוש הפעולת מגדירות:
מסתבר ששלוש פעולות אלו מספיקות כדי להגדיר את כל השפות הרגולריות. בפרק הקודם ראינו ששפות רגולריות סגורות תחת פעולות אלו. וזהו כל הכח של אוטומט סופי, כלומר - ביטוי רגולרי הוא שקול לשפה רגולרית (ולכן, לאוטומט סופי).
באופן אינטואיטבי - נוכל להבין ששלוש הפעולות לעיל מספיקות לפי הרעיונות הבאים:
- איחוד הוא למעשה בחירה בין מספר מעברים אפשריים
- שרשור הוא למעשה רצף של מצבים שהמכונה עברה (או רצף הקשתות שעברה..)
- כוכב מתאים ללולאות, למשל לולאה עצמית או חזרה למצב שכבר היינו בו
כעת נוכיח את האינטואיציה לעיל באופן פורמלי.
שקילות ביטוי רגולרי לאוטומט סופי
[עריכה]כל ביטוי רגולרי מתאר שפה רגולרית
[עריכה]לפי ההגדרה לעיל, כל ביטוי רגולרי ניתן לייצר בצורה אינדוקטיבית מהבסיס ומשלוש הפעולות. השפה המתאימה לביטוי היא איחוד, שרשור או כוכב של שפות רגולריות (שפות שמכילות מילה יחידה). לכן גם אחרי הפעלת אחת הפעולות הללו, השפה המתקבלת היא רגולרית, בהתאם לתכונת הסגירות שראינו בפרק תכונות של שפות רגולריות.
דרך נוספת להוכיח את השקילות בכיוון זה, היא לבנות אסל"ד עבור כל ביטוי רגולרי. למעשה אנחנו צריכים לבנות מכונה עבור כל אחד מהבסיסים, ולהראות איך לחבר אותם לפי הפעולות לעיל. להשלמת התיאור להלן המכונות המתקבלות.
-
בסיס 1
-
בסיס 2
-
בסיס 3
-
צעד 1
-
צעד 2
-
צעד 3
לכל שפה רגולרית קיים ביטוי רגולרי המתאר אותה
[עריכה]הכיוון השני, יותר קשה, ונוכיח אותו כעת.
טענה: אם רגולרית, אזי קיים ביטוי רגולרי כך ש |
הוכחה:
קיים לשפה אס"ד שנסמנו .
על-מנת להוכיח טענה זו, נשנה במעט את המודל של המכונה כך שכל קשת תייצג ביטוי רגורלי ולא רק אות מהאלפבית. נכנה מכונה זו בשם אוטומט מוכלל לא-דטרמיניסטי (אמל"ד, GNFA).
נביט על אמל"ד כלשהו. כל מצב נראה מהצורה הבאה:
- מכיל כמה קשתות נכנסות
- מכיל לולאה מעצמו לעצמו
- מכיל כמה קשתות יוצאות
נתאר, באינדוקציה, איך "להפטר" ממצב אחד, כך שפעולת המכונה לא תשתנה. אם נמשיך לבצע זאת עד שישאר מצב אחד, הלולאה שבו תתאר את הביטוי הרגולרי השקול למכונה המקורית (בהנחה שאכן בכל צעד של האינדוקציה הפחתנו את מספר המצבים, ולא שינינו את פעולת המכונה).
נניח ש הוא מצב ממנו ניתן לעבור למצב q, והמצב הוא מצב שניתן לעבור מ-q אליו. על-מנת לבטל את המצב-q, בלי לשנות את פעולת המכונה, צריך להוסיף קשת מs ל t, כך שאם במכונה המקורית היתה קשת וקשת ול-q קשת עצמית עם הביטוי הרגולרי , נוסיף במכונה החדשה את הקשת . נחזור על פעולה זו עבור כל זוג מצבים שניתן להגיע מהאחד לשני דרך, q, ונמחק את q. באופן כללי, ייתכן כי , ובמקרה זה הקשת החדשה תהיה לולאה עצמית במצב .
צריך לשים לב, שאין ממש הגיון למחוק מצב מקבל. כדי להמנע מבעיות אנחנו נוסיף למכונה מצב התחלתי ומצב מקבל, שאותם לא נמחק לעולם. את המצב התחלתי נחבר למצב ההתחלתי של המכונה על-ידי מעבר אפסילון. כמו כן, נחבר כל מצב מקבל אל המצב הסופי החדש על-ידי מעברי אפסילון. המצבים המקבלים של יהפכו להיות מצבים רגילים.
נחזור על תהליך ביטול המצבים עבור כל מצב של עד שנישאר עם שני המצבים שהוספנו - וביניהם תהיה קשת יחידה המתארת את הביטוי הרגולרי השקול למכונה.
הפרק הקודם: משפט מיהיל-נרוד |
ביטויים רגולריים | הפרק הבא: אוטומט מחסנית |