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

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

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

אלגוריתם להפיכת תחביר לצורה הנורמלית של גרייבך
----------------------------------------------

יהי {\displaystyle G=(V,T,P,S)} דקדוק חופשי הקשר שיוצר שפה כלשהי שלא מכילה את המילה הריקה (אם השפה מכילה את המילה הריקה, אז אחרי ביצוע האלגוריתם נוסיף את הכלל {\displaystyle S\rightarrow \varepsilon } לקבלת דקדוק מהצורה המורחבת של גרייבך), ונניח ש- {\displaystyle V=\{A\_{1},...A\_{n}\}}.

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

### בניית עזר 1

לכל כלל ב-P מהצורה {\displaystyle A\rightarrow \sigma \_{1}B\sigma \_{2}}, כאשר כל כללי B הם מהצורה {\displaystyle B\rightarrow \gamma \_{1}|\gamma \_{2}|...|\gamma \_{n}}, נשמיט את הכלל {\displaystyle A\rightarrow \sigma \_{1}B\sigma \_{2}} ונוסיף במקומו את הכללים {\displaystyle B\rightarrow \sigma \_{1}\gamma \_{1}\sigma \_{2}|\sigma \_{1}\gamma \_{2}\sigma \_{2}|...|\sigma \_{1}\gamma \_{n}\sigma \_{2}}.

### בניית עזר 2

נפריד את הכללים של כל משתנה A לשתי קבוצות. בקבוצה הראשונה יהיו כל הכללים שגוזרים מילה שמתחילה בA, ובקבוצה השנייה כל שאר הכללים, כלומר הקבוצה הראשונה תכיל כללים מהצורה {\displaystyle A\rightarrow A\sigma \_{1}|A\sigma \_{2}|...|A\sigma \_{m}}והקבוצה השנייה תכיל את שאר הכללים שנגזרים מA, נניח {\displaystyle A\rightarrow \gamma \_{1}|\gamma \_{2}|...|\gamma \_{n}}. נוסיף ל-V משתנה חדש, {\displaystyle A'} ונחליף את כל הכללים שA גוזר ב-P באופן הבא:

לכל {\displaystyle 1\leq i\leq m} נוסיף את הכללים:

* {\displaystyle A'\rightarrow \alpha \_{i}}
* {\displaystyle A'\rightarrow \alpha \_{i}A'}

ולכל {\displaystyle 1\leq j\leq n} נוסיף את הכללים:

* {\displaystyle A\rightarrow \gamma \_{i}}
* {\displaystyle A\rightarrow \gamma \_{i}A'}

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

### שלב 1

בעבור A\_{1}, אם קיימים כללים מהצורה {\displaystyle A\_{1}\rightarrow A\_{1}\sigma }, נשתמש בבניית עזר 2 כדי להוסיף לדקדוק משתנה {\displaystyle A\_{1}'} ונפעל על פי הבניה לתיקון כללי הגזירה.

לכל משתנה אחר, A\_{i} כאשר {\displaystyle 1\leq i} ב-V, תחילה נטפל בכללים מהצורה {\displaystyle A\_{i}\rightarrow A\_{j}\sigma }כאשר {\displaystyle j\leq i} באמצעות הפעלת בניית עזר 1 על המשתנה {\displaystyle A\_{j}}. לאחר מכן, נטפל בכללים מהצורה {\displaystyle A\_{k}\rightarrow A\_{k}\sigma }באמצעות בניית עזר 2, תוך הוספת המשתנה {\displaystyle A\_{k}'} והגדרת כללי בנייה 2.

### שלב 2

נשים לב שאחרי שביצענו את שלב 1, כל כלל בקבוצת הכללים החדשה שלנו הוא מהצורה {\displaystyle A\_{i}\rightarrow \sigma \alpha } כאשר \sigma  טרמינל, או מהצורה {\displaystyle A\_{i}\rightarrow A\_{j}\sigma }כאשר {\displaystyle i\leq j}, ובפרט כל הכללים שנגזרים מA\_{n} הם מהצורה הראשונה. לכל כלל שנגזר מ{\displaystyle A\_{k}} החל מ{\displaystyle k=n-1} ועד k=1 נפעיל את בנייה 1 כדי לקבל כללים שכולם מהצורה {\displaystyle A\_{k}\rightarrow \sigma \alpha } כאשר \sigma  טרמינל.

### שלב 3

נדאג שגם כל הכללים של משתני העזר יהיו מהצורה {\displaystyle A\_{k}'\rightarrow \sigma \alpha } כאשר \sigma  טרמינל בעזרת בנייה 1.

### שלב 4

כעת כל הכללים הם מהצורה {\displaystyle A\rightarrow \sigma \alpha } או מהצורה {\displaystyle A\rightarrow \sigma } כאשר \sigma  טרמינל ו-\alpha  מורכב הן ממשתנים והן מסימנים טרמינלים.

מכיוון שהמטרה שלנו היא להגיע לדקדוק מהצורה של גרייבך, נצטרך לגרום ל\alpha  להיות מורכבת אך ורק ממשתנים. אם כל ה\alpha  בכל הכללים מורכבות ממשתנים בלבד, סיימנו. אחרת, קיימת \alpha  כך שמופיע בה משתנה טרמינלי \tau. לכל טרמינל כזה שנותר, נגדיר משתנה חדש {\displaystyle B\_{\tau }}, נחליף את כל המופעים של \tau בכל \alpha  שהוא מופיע בה ב{\displaystyle B\_{\tau }}, ונוסיף את הכלל {\displaystyle B\_{\tau }\rightarrow \tau }.

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

שימושים
-------

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

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

ראו גם
------

* דקדוק חסר הקשר
* הצורה הנורמלית של חומסקי

לקריאה נוספת
------------

* שמואל זקס ונסים פרנסיז, ‏**אוטומטים ושפות פורמליות ב**, האוניברסיטה הפתוחה, 2000 (**הספר** במיזם פא"ר)

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

1. 1 2  שמואל זקס ונסים פרנסיז, **אוטומטים ושפות פורמליות ב**, האוניברסיטה הפתוחה, 2000, עמ' 103-109
2. ↑  שילה גרייבך, "A New Normal-Form Theorem for Context-Free Phrase Structure Grammars", **הז'ורנל של ACM**, ינואר 1965