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

בתורת השפות הפורמליות, אומרים כי דקדוק חסר הקשר ניתן להצגה בצורה הנורמלית של חומסקי (אותה הגה נועם חומסקי) אם כל כללי הגזירה שלו הם מהצורה הבאה: A → B C {\displaystyle A\to BC} A → α {\displaystyle A\to \alpha } S → ε {\displaystyle S\to \varepsilon } כאשר A {\displaystyle A} , B {\displaystyle B} ו- C {\displaystyle C} הם משתנים שאינם טרמינלים, α {\displaystyle \alpha } היא טרמינל, S {\displaystyle S} היא משתנה הגזירה ההתחלתי ו- ε {\displaystyle \varepsilon } היא המחרוזת הריקה. כמו כן B {\displaystyle B} ו- C {\displaystyle C} לא יכולים להיות המשתנה ההתחלתי, וכלל הגזירה השלישי מופיע בדקדוק אם"ם ε ∈ L ( G ) {\displaystyle \varepsilon \in L(G)} , כאשר L ( G ) {\displaystyle L(G)} היא השפה הנגזרת מ- G {\displaystyle G} . כל דקדוק המוגדר באמצעות הצורה הנורמלית של חומסקי הוא חסר הקשר, וכל דקדוק חסר הקשר יכול להיכתב באופן שקול כדקדוק בצורה הנורמלית של חומסקי (כלומר, ששפותיהם זהות). כיום קיימים מספר אלגוריתמים שעושים את ההעברות הנ"ל בין דקדוקים. החיסרון של שינויים אלו הוא שהם יכולים לגרום להתנפחות לא רצויה בגודל הדקדוק (המוגדר על ידי סכום הגדלים של כללי הגזירה שלו). אלגוריתמים שונים יכולים לקחת דקדוק בגודל | G | {\displaystyle |G|} ולהופכו לדקדוק בגדלים הנעים, במקרה הגרוע ביותר, בין | G | 2 {\displaystyle |G|^{2}} לבין 2 2 | G | {\displaystyle 2^{2|G|}} . דרך נוספת להגדיר את הצורה הנורמלית של חומסקי, היא כדלהלן: דקדוק פורמלי יופיע בצורה המצומצמת של חומסקי אם כל כללי הגזירה שלו הם מהצורה: A → B C {\displaystyle A\to BC} A → α {\displaystyle A\to \alpha } כאשר A {\displaystyle A} , B {\displaystyle B} ו- C {\displaystyle C} הם משתנים שאינם טרמינלים. כאשר משתמשים בהגדרה זו, B {\displaystyle B} או C {\displaystyle C} רשאים להיות המשתנה ההתחלתי. רק דקדוקים חסרי הקשר שלא מכילים את המחרוזת הריקה יכולים להיכתב בצורה המצומצמת של חומסקי. במאמר שפרסם דונלד קנות' בנושא BNF (אנ'), הוא רמז לתחביר BNF שבו כל ההגדרות יכולות להיכתב בצורה הנורמלית של פלויד, שהיא: ⟨ A ⟩ ::= ⟨ B ⟩ ∣ ⟨ C ⟩ {\displaystyle \langle A\rangle ::=\,\langle B\rangle \mid \langle C\rangle } ⟨ A ⟩ ::= ⟨ B ⟩ ⟨ C ⟩ {\displaystyle \langle A\rangle ::=\,\langle B\rangle \langle C\rangle } ⟨ A ⟩ ::= a {\displaystyle \langle A\rangle ::=\,a} כאשר ⟨ A ⟩ {\displaystyle \langle A\rangle } , ⟨ B ⟩ {\displaystyle \langle B\rangle } ו- ⟨ C ⟩ {\displaystyle \langle C\rangle } הם משתנים שאינם טרמינלים, ו- a {\displaystyle a} הוא טרמינל, וזאת כיוון שרוברט פלויד (אנ') הוכיח כי כל תחביר BNF יכול להפוך לצורה הזו ב-1961. פלויד הוא זה שטבע את המושג, היות ש"מאז ללא ספק הרבה אנשים השתמשו באופן עצמאי בעובדה פשוטה זו בעבודתם, והנקודה היא רק נלווית לשיקולים העיקריים בעבודתו של פלויד". הגדרת S 0 {\displaystyle S_{0}} הגדרת משתנה התחלתי חדש, S 0 {\displaystyle S_{0}} , וכלל גזירה חדש, S 0 → S {\displaystyle S_{0}\rightarrow S} , כאשר S {\displaystyle S} הוא המשתנה ההתחלתי הקודם. הסרת כל כללי ה- ε {\displaystyle \varepsilon } כללי ה- ε {\displaystyle \varepsilon } הם כללים מהצורה A → ε {\displaystyle A\rightarrow \varepsilon } , כאשר A ≠ S 0 {\displaystyle A\not =S_{0}} וכן A ∈ V {\displaystyle A\in V} , כאשר V {\displaystyle V} זו קבוצת המשתנים של הדקדוק חסר ההקשר. הסרת כל הכללים עם ε {\displaystyle \varepsilon } בצד הימני שלהם. עבור כל כלל מהצורה A → ε {\displaystyle A\rightarrow \varepsilon } שהסרנו, נעבור על כל הכללים שמכילים את A בצד הימני. עבור כל כלל כזה, נוסיף אוסף של כללים שיהווה את כל הקומבינציות שבהן A {\displaystyle A} מוחלפת על ידי ε {\displaystyle \varepsilon } . אם כלל מכיל את היחידון A {\displaystyle {A}} בצד ימין, נוסיף אוסף מתאים של כללים עבור המשתנה הנ"ל, ולא נוסיף את הכלל ממנו ל- ε {\displaystyle \varepsilon } אם טיפלנו כבר במקרה זה. לדוגמה, נוכל לראות את הדקדוק הבא: S → A b A ∣ B {\displaystyle S\rightarrow AbA\mid B} B → b ∣ c {\displaystyle B\rightarrow b\mid c} A → ε {\displaystyle A\rightarrow \varepsilon } ל- G {\displaystyle G} יש כלל ε {\displaystyle \varepsilon } אחד. כשנסיר אותו, נקבל את הכללים הבאים: S → A b A ∣ A b ∣ b A ∣ b ∣ B {\displaystyle S\rightarrow AbA\mid Ab\mid bA\mid b\mid B} B → b ∣ c {\displaystyle B\rightarrow b\mid c} על מנת לטפל באמת בכל האפשרויות שבהן יכול היה להתקיים A → ε {\displaystyle A\rightarrow \varepsilon } , הוספנו 3 כללים חדשים. הסרת כל כללי היחידה כללי יחידה הם כללים מהצורה A → B {\displaystyle A\rightarrow B} . אחרי שכל כללי ה- ε {\displaystyle \varepsilon } הוסרו, ניתן להסיר כללים אלה. ההסרה מתבצעת באופן הבא: על מנת להסיר את הכלל A → B {\displaystyle A\rightarrow B} , נעבור את כל הכללים מהצורה B → U {\displaystyle B\rightarrow U} , ונוסיף את הכללים A → U {\displaystyle A\rightarrow U} אלא אם כן זהו כלל יחידה שהסרנו כבר. הפיכת כל שאר כללי הגזירה לצורה הנורמלית של חומסקי בשלב זה נחליף את כל הכללים מהצורה: A → u 1 u 2 … u k , k ≥ 3 , u 1 ∈ V ∪ Σ {\displaystyle A\rightarrow u_{1}u_{2}\dotso u_{k},k\geq 3,u_{1}\in V\cup \Sigma } , לכללים: A → u 1 A 1 , A 1 → u 2 A 2 , … , A k − 2 → u k − 1 u k {\displaystyle A\rightarrow u_{1}A_{1},A_{1}\rightarrow u_{2}A_{2},\dotsc ,A_{k-2}\rightarrow u_{k-1}u_{k}} כאשר כל המשתנים מהצורה A i {\displaystyle A_{i}} הם משתנים חדשים. לסיכום, אם u i ∈ Σ {\displaystyle u_{i}\in \Sigma } , נחליף את u i {\displaystyle u_{i}} במשתנה חדש V i {\displaystyle V_{i}} , וניצור את כלל הגזירה V i → u i {\displaystyle V_{i}\rightarrow u_{i}} . מעבר לחשיבות התאורטית שלו, נעשה שימוש בהמרה לצורה הנורמלית של חומסקי בכמה אלגוריתמים כעיבוד מקדים, לדוגמה אלגוריתם CYK (אנ'). כמו כן, לצורה הנורמלית של חומסקי יתרון בניתוח הכרעה של שפות. כאשר דקדוק מורכב בצורה הנורמלית של חומסקי, מילה בגודל | w | {\displaystyle |w|} יכולה להיווצר על ידי לכל היותר 2 | w | − 1 {\displaystyle 2|w|-1} כללי גזירה (פרט למילה הריקה, שנגזרת מיד), ובצורה זו ניתן לבדוק האם שפה חסרת הקשר אינה שווה ל Σ ∗ {\displaystyle \Sigma ^{*}} באמצעות מכונת טיורינג, על ידי הרצה של כל המילים בסדר Minlex למשך 2 | w | − 1 {\displaystyle 2|w|-1} כללי גזירה, וכך אם יש מילה שלא שייכת לשפה נמצא אותה תוך זמן סופי ונדחה. דקדוק חסר הקשר הצורה הנורמלית של גרייבך John E. Hopcroft, Rajeev Motwani, and Jeffrey D. Ullman. Introduction to Automata Theory, Languages, and Computation, 3rd Edition, Addison-Wesley, 2006. ISBN 0-321-45536-3 (see subsection 7.1.5, page 272.) Lange, Martin and Leiß, Hans. To CNF or not to CNF? An Efficient Yet Presentable Version of the CYK Algorithm. Informatica Didactica 8, 2009. Hopcroft, Ullman (1979); sect.4, p.106 Noam Chomsky (1959). "On Certain Formal Properties of Grammars" (PDF). Information and Control. 2: 137–167. טרמינל הוא הסימן הבסיסי בשפה שמוגדרת על ידי דקדוק. בעצם, טרמינלים הם האותיות בשפה, בעוד שמשתנים שאינם טרמינלים הם אלו ש"נגזרים" באמצעות כללי הגזירה לטרמינלים ולמשתנים נוספים שאינם טרמינלים Hopcroft and Ullman 1978 Donald E. Knuth. 1964. Backus Normal Form vs. Backus Naur Form. Communications of the ACM, 7(12):735–736, December. אלגוריתם על שם Cocke-Younger-Kasami שמפרק (Parse) משפט המורכב מדקדוק חסר הקשר למרכיביו