הצורה הנורמלית של גרייבך

בתורת השפות הפורמליות, אומרים כי דקדוק חסר הקשר מוצג בצורה הנורמלית של גרייבך (אותה הגתה שילה גרייבך) אם כל כללי הגזירה שלו הם מהצורה <math>A \rightarrow \sigma\alpha</math>, כאשר <math>\sigma</math> סימן טרמינלי, <math>A</math> משתנה שאינו טרמינלי, ו-<math>\alpha</math> מילה המורכבת מאפס משתנים או יותר.

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

גם לשפה שכן מכילה את המילה הריקה ניתן להגדיר דקדוק מהצורה הנורמלית של גרייבך, באמצעות הוספת הכלל <math>S \rightarrow \varepsilon</math> לדקדוק שכל כלליו הם מהצורה שהוצגה מעלה.

==אלגוריתם להפיכת תחביר לצורה הנורמלית של גרייבך==
יהי <math>G=(V,T,P,S)</math> דקדוק חופשי הקשר שיוצר שפה כלשהי שלא מכילה את המילה הריקה (אם השפה מכילה את המילה הריקה, אז אחרי ביצוע האלגוריתם נוסיף את הכלל <math>S \rightarrow \varepsilon</math> לקבלת דקדוק מהצורה המורחבת של גרייבך), ונניח ש- <math>V=\{A_1,...,A_n\}</math>.

נגדיר שתי בניות עזר לפישוט האלגוריתם.

=== בניית עזר 1 ===
לכל כלל ב-<math>P</math> מהצורה <math>A \rightarrow \sigma_1B\sigma_2</math>, כאשר כל כללי <math>B</math> הם מהצורה <math>B \rightarrow \gamma_1|\gamma_2|...|\gamma_n</math>, נשמיט את הכלל <math>A \rightarrow \sigma_1B\sigma_2</math> ונוסיף במקומו את הכללים <math>B \rightarrow \sigma_1\gamma_1\sigma_2|\sigma_1\gamma_2\sigma_2|...|\sigma_1\gamma_n\sigma_2</math>.

=== בניית עזר 2 ===
נפריד את הכללים של כל משתנה <math>A</math> לשתי קבוצות. בקבוצה הראשונה יהיו כל הכללים שגוזרים מילה שמתחילה ב<math>A</math>, ובקבוצה השנייה כל שאר הכללים, כלומר הקבוצה הראשונה תכיל כללים מהצורה <math>A \rightarrow A\sigma_1|A\sigma_2|...|A\sigma_m</math>והקבוצה השנייה תכיל את שאר הכללים שנגזרים מ<math>A</math>, נניח <math>A \rightarrow \gamma_1|\gamma_2|...|\gamma_n</math>. נוסיף ל-<math>V</math> משתנה חדש, <math>A'</math> ונחליף את כל הכללים ש<math>A</math> גוזר ב-<math>P</math> באופן הבא:

לכל <math>1\leq i \leq m</math> נוסיף את הכללים:
* <math>A' \rightarrow \alpha_i</math>
* <math>A' \rightarrow \alpha_iA'</math>
ולכל <math>1\leq j \leq n</math> נוסיף את הכללים:
* <math>A \rightarrow \gamma_i</math>
* <math>A \rightarrow \gamma_iA'</math>
כעת נציג את האלגוריתם תוך שימוש מתמיד בבניות העזר.

=== שלב 1 ===
בעבור <math>A_1</math>, אם קיימים כללים מהצורה <math>A_1 \rightarrow A_1\sigma</math>, נשתמש בבניית עזר 2 כדי להוסיף לדקדוק משתנה <math>A_1'</math> ונפעל על פי הבניה לתיקון כללי הגזירה.

לכל משתנה אחר, <math>A_i</math> כאשר <math>1\leq i</math> ב-<math>V</math>, תחילה נטפל בכללים מהצורה <math>A_i \rightarrow A_j\sigma</math>כאשר <math>j\leq i</math> באמצעות הפעלת בניית עזר 1 על המשתנה <math>A_j</math>. לאחר מכן, נטפל בכללים מהצורה <math>A_k \rightarrow A_k\sigma</math>באמצעות בניית עזר 2, תוך הוספת המשתנה <math>A_k'</math> והגדרת כללי בנייה 2.

=== שלב 2 ===
נשים לב שאחרי שביצענו את שלב 1, כל כלל בקבוצת הכללים החדשה שלנו הוא מהצורה <math>A_i \rightarrow \sigma\alpha</math> כאשר <math>\sigma</math> טרמינל, או מהצורה <math>A_i \rightarrow A_j\sigma</math>כאשר <math>i \leq j</math>, ובפרט כל הכללים שנגזרים מ<math>A_n</math> הם מהצורה הראשונה. לכל כלל שנגזר מ<math>A_k</math> החל מ<math>k=n-1</math> ועד <math>k=1</math> נפעיל את בנייה 1 כדי לקבל כללים שכולם מהצורה <math>A_k \rightarrow \sigma\alpha</math> כאשר <math>\sigma</math> טרמינל.

=== שלב 3 ===
נדאג שגם כל הכללים של משתני העזר יהיו מהצורה <math>A_k' \rightarrow \sigma\alpha</math> כאשר <math>\sigma</math> טרמינל בעזרת בנייה 1.

=== שלב 4 ===
כעת כל הכללים הם מהצורה <math>A \rightarrow \sigma\alpha</math> או מהצורה <math>A \rightarrow \sigma</math> כאשר <math>\sigma</math> טרמינל ו-<math>\alpha</math> מורכב הן ממשתנים והן מסימנים טרמינלים.

מכיוון שהמטרה שלנו היא להגיע לדקדוק מהצורה של גרייבך, נצטרך לגרום ל<math>\alpha</math> להיות מורכבת אך ורק ממשתנים. אם כל ה<math>\alpha</math> בכל הכללים מורכבות ממשתנים בלבד, סיימנו. אחרת, קיימת <math>\alpha</math> כך שמופיע בה משתנה טרמינלי <math>\tau</math>. לכל טרמינל כזה שנותר, נגדיר משתנה חדש <math>B_\tau</math>, נחליף את כל המופעים של <math>\tau</math> בכל <math>\alpha</math> שהוא מופיע בה ב<math>B_\tau</math>, ונוסיף את הכלל <math>B_\tau \rightarrow \tau</math>.

כעת בידינו דקדוק מהצורה הנורמלית של גרייבך ששקול לדקדוק המקורי.

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

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

==ראו גם==
* דקדוק חסר הקשר
* הצורה הנורמלית של חומסקי

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

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

קטגוריה:בלשנות
קטגוריה:אוטומטים
קטגוריה:שפות פורמליות