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

Abstract syntax tree}} של הביטוי האריתמטי <math>a^2+4b</math>. התחביר לדוגמה (למעלה) וצורת חומסקי המתאימה לו (למטה)

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

:<math>A \to BC</math>
:<math>A \to \alpha</math>
:<math>S \to \varepsilon</math>

כאשר <math>A</math>,<math>B</math> ו-<math>C</math> הם משתנים שאינם טרמינלים, <math>\alpha</math> היא טרמינל, <math>S</math> היא משתנה הגזירה ההתחלתי ו-<math>\varepsilon</math> היא המחרוזת הריקה. כמו כן <math>B</math> ו-<math>C</math> לא יכולים להיות המשתנה ההתחלתי, וכלל הגזירה השלישי מופיע בדקדוק אם"ם <math>\varepsilon \isin L(G)</math>, כאשר <math>L(G)</math> היא השפה הנגזרת מ-<math>G</math>.

כל דקדוק המוגדר באמצעות הצורה הנורמלית של חומסקי הוא חסר הקשר, וכל דקדוק חסר הקשר יכול להיכתב באופן שקול כדקדוק בצורה הנורמלית של חומסקי (כלומר, ששפותיהם זהות). כיום קיימים מספר אלגוריתמים שעושים את ההעברות הנ"ל בין דקדוקים. החיסרון של שינויים אלו הוא שהם יכולים לגרום להתנפחות לא רצויה בגודל הדקדוק (המוגדר על ידי סכום הגדלים של כללי הגזירה שלו). אלגוריתמים שונים יכולים לקחת דקדוק בגודל <math>|G|</math> ולהופכו לדקדוק בגדלים הנעים, במקרה הגרוע ביותר, בין <math>|G|^2</math> לבין <math>2^{2|G|}</math>.

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

דקדוק פורמלי יופיע בצורה המצומצמת של חומסקי אם כל כללי הגזירה שלו הם מהצורה:
:<math>A \to BC</math>
:<math>A \to \alpha</math>

כאשר <math>A</math>, <math>B</math> ו-<math>C</math> הם משתנים שאינם טרמינלים. כאשר משתמשים בהגדרה זו, <math>B</math> או <math>C</math> רשאים להיות המשתנה ההתחלתי. רק דקדוקים חסרי הקשר שלא מכילים את המחרוזת הריקה יכולים להיכתב בצורה המצומצמת של חומסקי.

===הצורה הנורמלית של פלויד===
במאמר שפרסם דונלד קנות' בנושא BNF , הוא רמז לתחביר BNF שבו כל ההגדרות יכולות להיכתב בצורה הנורמלית של פלויד, שהיא:

: <math>\langle A \rangle ::= \, \langle B \rangle \mid \langle C \rangle</math>
: <math>\langle A \rangle ::= \, \langle B \rangle \langle C \rangle</math>
: <math>\langle A \rangle ::=\, a</math>

כאשר <math>\langle A \rangle </math>, <math>\langle B \rangle </math> ו-<math>\langle C \rangle </math> הם משתנים שאינם טרמינלים, ו-<math>a</math> הוא טרמינל, וזאת כיוון שרוברט פלויד הוכיח כי כל תחביר BNF יכול להפוך לצורה הזו ב-1961. פלויד הוא זה שטבע את המושג, היות ש"מאז ללא ספק הרבה אנשים השתמשו באופן עצמאי בעובדה פשוטה זו בעבודתם, והנקודה היא רק נלווית לשיקולים העיקריים בעבודתו של פלויד".

==הפיכת תחביר לצורה הנורמלית של חומסקי==
# הגדרת <math>S_0</math>

#: הגדרת משתנה התחלתי חדש, <math>S_0</math>, וכלל גזירה חדש, <math>S_0 \rightarrow S</math>, כאשר <math>S</math> הוא המשתנה ההתחלתי הקודם.
# הסרת כל כללי ה-<math>\varepsilon</math>
#: כללי ה-<math>\varepsilon</math> הם כללים מהצורה <math>A \rightarrow \varepsilon</math>, כאשר <math>A \not= S_0</math> וכן <math>A \in V</math>, כאשר <math>V</math> זו קבוצת המשתנים של הדקדוק חסר ההקשר.
#: הסרת כל הכללים עם <math>\varepsilon</math> בצד הימני שלהם. עבור כל כלל מהצורה <math>A \rightarrow \varepsilon</math> שהסרנו, נעבור על כל הכללים שמכילים את A בצד הימני. עבור כל כלל כזה, נוסיף אוסף של כללים שיהווה את כל הקומבינציות שבהן <math>A </math> מוחלפת על ידי <math>\varepsilon</math>. אם כלל מכיל את היחידון <math>{A}</math> בצד ימין, נוסיף אוסף מתאים של כללים עבור המשתנה הנ"ל, ולא נוסיף את הכלל ממנו ל-<math>\varepsilon</math> אם טיפלנו כבר במקרה זה.
#: לדוגמה, נוכל לראות את הדקדוק הבא:
#:: <math>S \rightarrow AbA \mid B</math>
#:: <math>B \rightarrow b \mid c</math>
#:: <math>A \rightarrow \varepsilon</math>
#: ל-<math>G</math> יש כלל <math>\varepsilon</math> אחד. כשנסיר אותו, נקבל את הכללים הבאים:
#:: <math>S \rightarrow AbA \mid Ab \mid bA \mid b \mid B</math>
#:: <math>B \rightarrow b \mid c</math>
#: על מנת לטפל באמת בכל האפשרויות שבהן יכול היה להתקיים <math>A \rightarrow \varepsilon</math>, הוספנו 3 כללים חדשים.
# הסרת כל כללי היחידה
#: כללי יחידה הם כללים מהצורה <math>A \rightarrow B</math>. אחרי שכל כללי ה-<math>\varepsilon</math> הוסרו, ניתן להסיר כללים אלה. ההסרה מתבצעת באופן הבא:
#: על מנת להסיר את הכלל <math>A \rightarrow B</math>, נעבור את כל הכללים מהצורה <math> B \rightarrow U</math>, ונוסיף את הכללים <math>A \rightarrow U</math> אלא אם כן זהו כלל יחידה שהסרנו כבר.
# הפיכת כל שאר כללי הגזירה לצורה הנורמלית של חומסקי
#: בשלב זה נחליף את כל הכללים מהצורה: <math>A \rightarrow u_1 u_2 \dotso u_k, k \ge 3, u_1 \in V \cup \Sigma</math>, לכללים: <math>A \rightarrow u_1 A_1, A_1 \rightarrow u_2 A_2, \dotsc, A_{k-2} \rightarrow u_{k-1} u_k</math> כאשר כל המשתנים מהצורה <math>A_i</math> הם משתנים חדשים.
#: לסיכום, אם <math>u_i \in \Sigma</math>, נחליף את <math>u_i</math> במשתנה חדש <math>V_i</math>, וניצור את כלל הגזירה <math>V_i \rightarrow u_i</math>.

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

כמו כן, לצורה הנורמלית של חומסקי יתרון בניתוח הכרעה של שפות. כאשר דקדוק מורכב בצורה הנורמלית של חומסקי, מילה בגודל <math>|w|</math> יכולה להיווצר על ידי לכל היותר <math>2 |w|-1</math> כללי גזירה (פרט למילה הריקה, שנגזרת מיד), ובצורה זו ניתן לבדוק האם שפה חסרת הקשר אינה שווה ל<math>\Sigma ^*</math> באמצעות מכונת טיורינג, על ידי הרצה של כל המילים בסדר Minlex למשך <math>2 |w|-1</math> כללי גזירה, וכך אם יש מילה שלא שייכת לשפה נמצא אותה תוך זמן סופי ונדחה.

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

==לקריאה נוספת==
<div class="mw-content-ltr">
* John E. Hopcroft, Rajeev Motwani, and Jeffrey D. Ullman. Introduction to Automata Theory, Languages, and Computation, 3rd Edition, Addison-Wesley, 2006. (see subsection 7.1.5, page 272.)
*Lange, Martin and Leiß, Hans. [http://ddi.cs.uni-potsdam.de/InformaticaDidactica/LangeLeiss2009.pdf To CNF or not to CNF? An Efficient Yet Presentable Version of the CYK Algorithm.] Informatica Didactica 8, 2009.
</div>

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

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