אוטומט מחסנית – הבדלי גרסאות

מתוך ויקיפדיה, האנציקלופדיה החופשית
תוכן שנמחק תוכן שנוסף
שמירת ביניים (כלל הערך, עד פסקת "תיאור חישוב"): קישורים פנימיים, תיקון, עריכה והגהה, ועוד (שיפור הקריאות, והורדת סף הידע המקדים הנדרש לקריאה).
שורה 1: שורה 1:
[[תמונה:Automateapile.png|ממוזער|250px|ייצוג גרפי של אוטומט מחסנית, באמצעות [[גרף מכוון]]. האוטומט מורכב מ-4 [[מצב (מדעי המחשב)|מצבים]]: 2 מצבים מקבלים (מסומנים בעיגול כפול) ו-2 מצבים שאינם מקבלים (מסומנים בעיגול בודד).]]
[[תמונה:Automateapile.png|שמאל|ממוזער|250px|דוגמה לאוטומט מחסנית]]
ב[[מדעי המחשב]], '''אוטומט מחסנית''' הוא [[מודל חישובי]] שמהווה הרחבה של מודל [[אוטומט סופי דטרמיניסטי|האוטומט הסופי הדטרמיניסטי]] על ידי הוספת [[מחסנית (מבנה נתונים)|מחסנית]] שבה האוטומט מסוגל לאכסן מידע. ההרחבה מגדילה את כוחו של האוטומט, כלומר את מחלקת ה[[שפה פורמלית|שפות]] שהוא מסוגל לזהות; בגרסתו הסטנדרטית, מודל אוטומט המחסנית מסוגל לזהות בדיוק את כל [[שפה חסרת הקשר|השפות חסרות ההקשר]].
ב[[מדעי המחשב]], '''אוטומט מחסנית''' הוא [[מודל חישובי]], שמהווה הרחבה של [[מודל מתמטי|מודל]] ה[[אוטומט סופי|אוטומט הסופי]] (ה[[אוטומט סופי דטרמיניסטי|דטרמיניסטי]]), על ידי הוספת [[מחסנית (מבנה נתונים)|מחסנית]], שבה האוטומט מסוגל לאחסן [[נתונים|מידע]] (משמע, לאוטומט יש יכולת זיכרון). ההרחבה מגדילה את [[חישוביות|כוחו החישובי]] של האוטומט; כלומר, את [[קבוצה (מתמטיקה)|קבוצת]] ה[[שפה פורמלית|שפות]] שהוא מסוגל לזהות. בגרסתו הסטנדרטית, מודל אוטומט המחסנית מסוגל לזהות בדיוק את כל [[שפה חסרת הקשר|השפות חסרות ההקשר]].


==תיאור לא פורמלי==
==תיאור לא פורמלי==
בדומה לאוטומט הסופי הדטרמיניסטי, אוטומט המחסנית מורכב מאוסף של '''[[מצב (מדעי המחשב)|מצבים]]''' המקבילים למצבי הזיכרון בהם יכול להימצא מחשב בזמן ביצוע תוכנית מחשב. דרך הפעולה של האוטומט מבוססת על קריאת מילת קלט (המורכבת מאלפבית סופי וידוע מראש) באופן סדרתי, אות אחת בכל פעם, עד אשר מסתיימת קריאת המילה, ואז מחזיר האוטומט תשובה - האם המילה שנקראה שייכת לשפה אותה מזהה האוטומט, או לא.
בדומה לאוטומט הסופי הדטרמיניסטי, אוטומט המחסנית מורכב מאוסף של '''[[מצב (מדעי המחשב)|מצבים]]''', המקבילים למצבי הזיכרון בהם יכולה להימצא מכונת החישוב במהלך ביצוע חישוב. דרך הפעולה של האוטומט מבוססת על קריאת מילת [[קלט]] ([[מחרוזת (מדעי המחשב)|מחרוזת]], המורכבת מאלפבית סופי וידוע מראש) באופן סדרתי, אות אחת בכל פעם, עד אשר מסתיימת קריאת המילה, ואז מחזיר האוטומט תשובה האם המילה שנקראה שייכת ל[[שפה פורמלית|שפה]] אותה מזהה האוטומט, או לא.


ההבדל המרכזי שבין אוטומט סופי ובין אוטומט מחסנית הוא התקן הזיכרון הנוסף שעומד לרשות אוטומט המחסנית - מחסנית שמאפשרת אחסון נתונים. המחסנית מאחסנת אותיות (מעל אלפבית סופי וידוע מראש, אך לא בהכרח האלפבית שממנו בנויה מילת הקלט) בצורה סדרתית, כך שהאות האחרונה שהוכנסה למחסנית נמצאת בראשה, אחריה האות שהוכנסה לפניה למחסנית, וכן הלאה (שיטת [[LIFO]]). בצורה זו הגישה לזיכרון מוגבלת מאוד - ניתן לראות בכל פעם רק את האות שבראש המחסנית, וכדי לראות אות שבתוך המחסנית יש להוציא מהמחסנית את כל האותיות שמעליה (ובכך "לאבד" אותן, שכן אין מקום אחסון נוסף עבורן).
ההבדל המרכזי שבין [[אוטומט סופי]] ובין אוטומט מחסנית הוא התקן הזיכרון הנוסף, שעומד לרשות אוטומט המחסנית מחסנית, שמאפשרת אחסון (שמירת) [[נתונים]]. המחסנית מאחסנת אותיות (מעל אלפבית סופי וידוע מראש, אך לא בהכרח האלפבית שממנו בנויה מילת הקלט) בצורה סדרתית, כך שהאות האחרונה שהוכנסה למחסנית נמצאת בראשה, אחריה האות שהוכנסה לפניה למחסנית, וכן הלאה, עד האות הראשונה שהוכנסה למחסנית, הנמצאת בתחתיתה (ונגישה להצצה או שליפה אחרונה מכולן) (שיטת [[LIFO]]). בצורה זו, הגישה לזיכרון מוגבלת מאוד ניתן לראות בכל פעם רק את האות שבראש המחסנית, וכדי לראות אות שבתוך המחסנית, יש להוציא מהמחסנית את כל האותיות שמעליה (ובכך "לאבד" אותן, שכן אין מקום אחסון נוסף עבורן).


=== ביצוע חישוב ===
בכל צעד [[חישוב (מדעי המחשב)|חישוב]] שלו, אוטומט המחסנית מחליט על דרך הפעולה שלו בהתבסס של שלושה נתונים - האות שהוא קורא מהקלט (אם כי הוא אינו מחויב לקרוא אות מהקלט בכל צעד), האות שנמצאת בראש המחסנית, והמצב הפנימי שלו. לאחר שהחליט, הוא עובר למצב פנימי אחר, ומשנה את תוכן המחסנית באופן מסוים - הוא יכול להוציא מהמחסנית את האות שבראשה, ולדחוף לתוכה במקומה אותיות אחרות.
בכל צעד [[חישוב (מדעי המחשב)|חישוב]] שלו, אוטומט המחסנית מחליט על דרך הפעולה שלו, בהתבסס על שלושה נתונים:

* האות שהוא קורא מהקלט (אם כי הוא אינו מחויב לקרוא אות מהקלט בכל צעד).
המודל הסטנדרטי של אוטומט המחסנית הוא [[אי דטרמיניזם|אי דטרמיניסטי]] - בכל צעד חישוב האוטומט מסוגל לבצע מספר בחירות שונות, ולכן ניתן לתאר חישובים שונים רבים שהוא מבצע על כל מילת קלט, ודי בכך שבחישוב אחד האוטומט יכריע כי מילת הקלט שייכת לשפה אותה הוא מזהה. ניתן להגדיר גם מודל דטרמיניסטי של אוטומט מחסנית, אך מתברר כי מודל זה הוא בעל יכולת חישובית פחותה ממש מזו של המודל האי דטרמיניסטי - קיימות שפות אותן המודל האי דטרמיניסטי מסוגל לזהות והמודל הדטרמיניסטי לא. בכך נבדל אוטומט המחסנית הן מהאוטומט הסופי והן ממודל החישוב הכללי יותר, של [[מכונת טיורינג]] - בשני המודלים הללו מתקיימת שקילות מבחינת כוח החישוב בין המודל הדטרמיניסטי ובין המודל האי דטרמיניסטי.
* האות שנמצאת בראש המחסנית.
* המצב הפנימי שלו (שם המצב + מצב המחסנית).
לאחר שהחליט, הוא עובר למצב פנימי חדש (לא בהכרח אחר), תוך כדי שינוי תוכן המחסנית, באחד משלושה אופנים:
* הוצאת אות אחת בלבד מראש המחסנית (ב[[אנגלית]], פעולת Pop).
* אי-ביצוע כל שינוי במחסנית (לא הכנסה ולא הוצאה של אותיות; משמע, רק "הצצנו"/הסתכלנו על האות שבראש המחסנית).
* דחיפת (הכנסת) לתוכה במקומה אותיות אחרות (באנגלית, פעולת Push).
המודל הסטנדרטי של אוטומט המחסנית הוא [[אי-דטרמיניזם|אי-דטרמיניסטי]] בכל צעד חישוב, האוטומט מסוגל לבצע מספר בחירות שונות במקביל, ולכן, ניתן לתאר חישובים שונים רבים שהוא מבצע על כל מילת קלט, ודי בכך, שבאחד החישובים האוטומט יכריע כי מילת הקלט שייכת לשפה אותה הוא מזהה (כלומר, יסיים את חישובו במצב מקבל). ניתן להגדיר גם מודל [[דטרמיניזם|דטרמיניסטי]] של אוטומט מחסנית, אך מתברר כי מודל זה הוא בעל יכולת חישובית פחותה ממש מזו של המודל האי-דטרמיניסטי: קיימות שפות, אותן המודל האי-דטרמיניסטי מסוגל לזהות והמודל הדטרמיניסטי לא. בכך נבדל אוטומט המחסנית הן מהאוטומט הסופי והן ממודל החישוב הכללי יותר, של [[מכונת טיורינג]] בשני המודלים הללו מתקיימת [[שקילות (מתמטיקה)|שקילות]], מבחינת [[חישוביות|כוח החישוב]], בין המודל הדטרמיניסטי ובין המודל האי-דטרמיניסטי.


==תיאור פורמלי==
==תיאור פורמלי==
תיאור מתמטי פורמלי של אוטומט מחסנית <math>\ A</math> הוא באמצעות השביעייה הבאה:
{{סימון מתמטי}}[[מודל מתמטי|תיאור מתמטי פורמלי]] של אוטומט מחסנית <math>\ A</math> הוא באמצעות ה[[N-יה סדורה|שביעייה הסדורה]] הבאה:


<math>\ A=\left\{Q,\Sigma,\Gamma,\delta,q_0,\dashv,F\right\}</math>
<math>\ A=\left\{Q,\Sigma,\Gamma,\delta,q_0,\dashv,F\right\}</math>
שורה 18: שורה 25:
כאשר:
כאשר:


*<math>\ Q</math> היא קבוצת מצבי האוטומט.
*<math>\ Q</math> היא קבוצת מצבי האוטומט. כל מצב בקבוצה זו הוא, בהכרח, אחד מהשניים: "מצב מקבל" או "מצב לא מקבל".
*<math>\ \Sigma</math> הוא א"ב של הקלט.
*<math>\ \Sigma</math> היא (קבוצת) א"ב הקלט. כל [[איבר (מתמטיקה)|איבר]] בקבוצה זו מכונה "אות".
*<math>\ \Gamma</math> הוא א"ב של המחסנית.
*<math>\ \Gamma</math> היא (קבוצת) א"ב של המחסנית. כל [[איבר (מתמטיקה)|איבר]] בקבוצה זו מכונה "אות".
* <math>\ \delta :Q\times\left(\Sigma\cup\left\{\varepsilon\right\}\right)\times\Gamma\to \mathrm{P}\left(Q\times\Gamma^*\right)</math> היא פונקציית המעברים.
* <math>\ \delta :Q\times\left(\Sigma\cup\left\{\varepsilon\right\}\right)\times\Gamma\to \mathrm{P}\left(Q\times\Gamma^*\right)</math> היא [[פונקציית מעברים|פונקציית המעברים]] (הערה: ).
*<math>\ q_0</math> הוא המצב ההתחלתי.
*<math>\ q_0</math> הוא המצב ההתחלתי (ממנו מתחיל החישוב) <math>\ q_0\isin Q</math>.
*<math>\ \dashv</math> היא האות ההתחלתית שבמחסנית.
*<math>\ \dashv</math> היא האות ההתחלתית שבמחסנית - תמיד! זוהי אות שמורה מיוחדת, שמשמעותה בפועל היא שהמחסנית ריקה, כי למחסנית ריקה באמת יש משמעות מעשית אחרת באוטומט מחסנית.
*<math>\ F</math> היא קבוצת המצבים המקבלים, <math>\ F\subseteq Q</math>. מצב מקבל הוא מצב שמסמן שהאוטומט מחזיר תשובה חיובית. כלומר: אם בסוף הקלט האוטומט נמצא במצב מקבל, זה אומר שהקלט הוא מילה בשפה שהאוטומט מזהה.
*<math>\ F\subseteq Q</math> היא קבוצת המצבים המקבלים.


משמעותה של פונקציית המעברים היא זו: בהינתן המצב הנוכחי של האוטומט, האות הבאה שהוא קורא מהקלט (או המילה הריקה <math>\ \varepsilon</math> אם רוצים לתאר מעבר שאינו כולל קריאת מילה מהקלט) והאות שמופיעה בראש המחסנית, פעולת האוטומט תהיה לעבור למצב אחר (או להישאר במצב שבו היה קודם) ולשנות את תוכן המחסנית על ידי הסרת האות שנמצאת בראש המחסנית והכנסת מילה חדשה למחסנית במקומה.
משמעותה של פונקציית המעברים היא זו בהינתן:
* המצב הנוכחי של האוטומט (שם המצב),
* האות שמופיעה בראש המחסנית,
* האות הבאה שהוא קורא מהקלט (או [[מחרוזת ריקה (תכנות)|המילה הריקה]] <math>\ \varepsilon</math>, אם רוצים לתאר מעבר, שאינו כולל קריאת מילה מהקלט),
פעולת האוטומט תהיה לעבור למצב אחר (או להישאר במצב שבו הוא נמצא), ולשנות את תוכן המחסנית על ידי הסרת האות שנמצאת בראש המחסנית והכנסת אות או מילה חדשה במקומה למחסנית (ייתכן, אפילו, להכניס את אותה האות שהוצאה, על-מנת לא לשנות את מצב המחסנית).


מכיוון שהאוטומט אי דטרמיניסטי, לכל שלשה של מצב, אות קלט ואות מראש המחסנית מותאמת '''קבוצה''' של זוגות אפשריים של מצב שאליו עוברים ואות שמוכנסת לראש המחסנית. לכן טווח פונקציית המעברים הוא <math>\ \mathrm{P}\left(Q\times\Gamma^*\right)</math> - [[קבוצת החזקה]] של כל הזוגות האפשריים. עם זאת, מניחים כי רק תת-הקבוצות '''הסופיות''' של זוגות שכאלו יכולים להתקבל באמצעות פונקציית המעברים (כלומר, מספר דרכי הפעולה השונות של האוטומט בהינתן מצב, אות קלט ואות מראש המחסנית הוא סופי).
מכיוון שהאוטומט אי-דטרמיניסטי, לכל שלשה סדורה של: מצב + אות קלט + אות מראש המחסנית, [[יחס|מותאמת]] [[קבוצה (מתמטיקה)|קבוצה]] של זוגות סדורים אפשריים, שכל אחד מהם מורכב מ: המצב שאליו עוברים + האות שמוכנסת לראש המחסנית (יכולה להיות גם האות/המילה הריקה <math>\ \varepsilon</math>; דהינו, לא להכניס אף אות למחסנית). לכן, [[טווח של פונקציה|טווח פונקציית]] המעברים הוא <math>\ \mathrm{P}\left(Q\times\Gamma^*\right)</math> [[קבוצת החזקה]] של כל הזוגות האפשריים של מצב + מצב ראש המחסנית. עם זאת, מניחים כי רק [[תת-קבוצה|תת-הקבוצות]] [[קבוצה סופית|הסופיות]] של זוגות שכאלו יכולים להתקבל באמצעות פונקציית המעברים (כלומר, מספר דרכי הפעולה השונות של האוטומט, בהינתן מצב, אות קלט ואות מראש המחסנית הוא סופי).


פונקציית המעברים אינה מוגדרת כאשר המחסנית ריקה; על כן, ריקון של המחסנית לפני תום קריאת הקלט גורר בהכרח "היתקעות" של האוטומט ודחיית המילה הנקראת. באופן דומה, אין הכרח להגדיר את פונקציית המעברים עבור כל השלשות האפשריות, וניתן לחשוב על כל שלשה שעבורה הפונקציה אינה מוגדרת כאילו היא "תוקעת" את האוטומט.
פונקציית המעברים [[תחום הגדרה|אינה מוגדרת]], כאשר המחסנית ריקה. על כן, ריקון של המחסנית לפני תום קריאת מלוא מילת הקלט גורר בהכרח "היתקעות" של האוטומט ודחיית המילה הנקראת (כלומר, החזרת התשובה, שהמילה אינה בשפה שהאוטומט מזהה). באופן דומה, אין הכרח להגדיר את פונקציית המעברים עבור כל השלשות הסדורות האפשריות, וניתן לחשוב על כל שלשה סדורה, שעבורה הפונקציה אינה מוגדרת, כאילו היא "תוקעת" את האוטומט (כזכור, אנו מדברים על אוטומט (מחסנית) לא דטרמיניסטי).


להלן מספר דוגמאות לפעולת פונקציית המעברים שבכולן האוטומט מתחיל במצב <math>\ q</math> ונשאר בו:
להלן מספר דוגמאות לפעולת פונקציית המעברים, שבכולן האוטומט מתחיל במצב <math>\ q</math> ונשאר בו:
*<math>\ (q,Z)\in\delta (q,\sigma,Z)</math> - האוטומט קורא את <math>\ \sigma</math> מהקלט ואינו משנה את ראש המחסנית (ניתן לחשוב על כך כאילו הוא הוציא את האות <math>\ Z</math> מראש המחסנית ומיד הכניס אותה בחזרה).
*<math>\ (q,Z)\in\delta (q,\sigma,Z)</math> - האוטומט קורא את <math>\ \sigma</math> מהקלט ואינו משנה את ראש המחסנית (ניתן לחשוב על כך כאילו הוא הוציא את האות <math>\ Z</math> מראש המחסנית ומיד הכניס אותה בחזרה).
*<math>\ (q,\sigma Z)\in\delta (q,\sigma,Z)</math> - האוטומט קורא את <math>\ \sigma</math> מהקלט ודוחף אותה במחסנית אחרי ראש המחסנית הקיים (ניתן לחשוב על כך כאילו הוא הוציא את האות <math>\ Z</math> מראש המחסנית ומיד דחף אותה חזרה ואחריה דחף את <math>\ \sigma</math>).
*<math>\ (q,\sigma Z)\in\delta (q,\sigma,Z)</math> - האוטומט קורא את <math>\ \sigma</math> מהקלט ודוחף אותה במחסנית אחרי ראש המחסנית הקיים (ניתן לחשוב על כך כאילו הוא הוציא את האות <math>\ Z</math> מראש המחסנית ומיד דחף אותה חזרה ואחריה דחף את <math>\ \sigma</math>).
*<math>\ (q,\varepsilon)\in\delta (q,\sigma,Z)</math> האוטומט קורא את <math>\ \sigma</math> מהקלט ומוציא את <math>\ Z</math> מראש המחסנית מבלי שיוסיף שום דבר אחר במקומה (כלומר, הוא '''מוחק''' את ראש המחסנית).
*<math>\ (q,\varepsilon)\in\delta (q,\sigma,Z)</math> האוטומט קורא את <math>\ \sigma</math> מהקלט ומוציא את <math>\ Z</math> מראש המחסנית מבלי שיוסיף שום דבר אחר במקומה. בכך, נחשפת האות שמתחתיה שהוכנסה לפניה למחסנית.
===תיאור חישוב===
===תיאור חישוב===
על מנת לתאר חישובים באמצעות אוטומט מחסנית, נהוג להשתמש ב'''תיאור רגעי'''. תיאור רגעי הוא שלשה שמכילה את המידע הרלוונטי לחישוב הנוכחי של האוטומט - המצב בו הוא נמצא, הקלט שעוד נותר לו לקרוא, ותוכן המחסנית. בצורה פורמלית, מגדירים תיאור רגעי בתור השלשה <math>\ \left(q,w,\gamma\right)</math> כך ש-<math>\ q\in Q</math> הוא המצב הנוכחי, <math>\ w\in\Sigma^*</math> היא מילת הקלט שטרם נקראה, ו-<math>\ \gamma\in\Gamma^*</math> הוא תוכנה הנוכחי של המחסנית.
על מנת לתאר חישובים באמצעות אוטומט מחסנית, נהוג להשתמש ב'''תיאור רגעי'''. תיאור רגעי הוא שלשה שמכילה את המידע הרלוונטי לחישוב הנוכחי של האוטומט - המצב בו הוא נמצא, הקלט שעוד נותר לו לקרוא, ותוכן המחסנית. בצורה פורמלית, מגדירים תיאור רגעי בתור השלשה <math>\ \left(q,w,\gamma\right)</math> כך ש-<math>\ q\in Q</math> הוא המצב הנוכחי, <math>\ w\in\Sigma^*</math> היא מילת הקלט שטרם נקראה, ו-<math>\ \gamma\in\Gamma^*</math> הוא תוכנה הנוכחי של המחסנית.

גרסה מ־00:13, 10 ביוני 2015

ייצוג גרפי של אוטומט מחסנית, באמצעות גרף מכוון. האוטומט מורכב מ-4 מצבים: 2 מצבים מקבלים (מסומנים בעיגול כפול) ו-2 מצבים שאינם מקבלים (מסומנים בעיגול בודד).

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

תיאור לא פורמלי

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

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

ביצוע חישוב

בכל צעד חישוב שלו, אוטומט המחסנית מחליט על דרך הפעולה שלו, בהתבסס על שלושה נתונים:

  • האות שהוא קורא מהקלט (אם כי הוא אינו מחויב לקרוא אות מהקלט בכל צעד).
  • האות שנמצאת בראש המחסנית.
  • המצב הפנימי שלו (שם המצב + מצב המחסנית).

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

  • הוצאת אות אחת בלבד מראש המחסנית (באנגלית, פעולת Pop).
  • אי-ביצוע כל שינוי במחסנית (לא הכנסה ולא הוצאה של אותיות; משמע, רק "הצצנו"/הסתכלנו על האות שבראש המחסנית).
  • דחיפת (הכנסת) לתוכה במקומה אותיות אחרות (באנגלית, פעולת Push).

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

תיאור פורמלי

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

תיאור מתמטי פורמלי של אוטומט מחסנית הוא באמצעות השביעייה הסדורה הבאה:

כאשר:

  • היא קבוצת מצבי האוטומט. כל מצב בקבוצה זו הוא, בהכרח, אחד מהשניים: "מצב מקבל" או "מצב לא מקבל".
  • היא (קבוצת) א"ב הקלט. כל איבר בקבוצה זו מכונה "אות".
  • היא (קבוצת) א"ב של המחסנית. כל איבר בקבוצה זו מכונה "אות".
  • היא פונקציית המעברים (הערה: ).
  • הוא המצב ההתחלתי (ממנו מתחיל החישוב) .
  • היא האות ההתחלתית שבמחסנית - תמיד! זוהי אות שמורה מיוחדת, שמשמעותה בפועל היא שהמחסנית ריקה, כי למחסנית ריקה באמת יש משמעות מעשית אחרת באוטומט מחסנית.
  • היא קבוצת המצבים המקבלים, . מצב מקבל הוא מצב שמסמן שהאוטומט מחזיר תשובה חיובית. כלומר: אם בסוף הקלט האוטומט נמצא במצב מקבל, זה אומר שהקלט הוא מילה בשפה שהאוטומט מזהה.

משמעותה של פונקציית המעברים היא זו – בהינתן:

  • המצב הנוכחי של האוטומט (שם המצב),
  • האות שמופיעה בראש המחסנית,
  • האות הבאה שהוא קורא מהקלט (או המילה הריקה , אם רוצים לתאר מעבר, שאינו כולל קריאת מילה מהקלט),

פעולת האוטומט תהיה לעבור למצב אחר (או להישאר במצב שבו הוא נמצא), ולשנות את תוכן המחסנית על ידי הסרת האות שנמצאת בראש המחסנית והכנסת אות או מילה חדשה במקומה למחסנית (ייתכן, אפילו, להכניס את אותה האות שהוצאה, על-מנת לא לשנות את מצב המחסנית).

מכיוון שהאוטומט אי-דטרמיניסטי, לכל שלשה סדורה של: מצב + אות קלט + אות מראש המחסנית, מותאמת קבוצה של זוגות סדורים אפשריים, שכל אחד מהם מורכב מ: המצב שאליו עוברים + האות שמוכנסת לראש המחסנית (יכולה להיות גם האות/המילה הריקה ; דהינו, לא להכניס אף אות למחסנית). לכן, טווח פונקציית המעברים הוא קבוצת החזקה של כל הזוגות האפשריים של מצב + מצב ראש המחסנית. עם זאת, מניחים כי רק תת-הקבוצות הסופיות של זוגות שכאלו יכולים להתקבל באמצעות פונקציית המעברים (כלומר, מספר דרכי הפעולה השונות של האוטומט, בהינתן מצב, אות קלט ואות מראש המחסנית הוא סופי).

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

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

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

תיאור חישוב

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

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

כדי לתאר מעבר מהמצב הרגעי למצב הרגעי . מעבר כזה הוא אפשרי אם ורק אם (כאן ייתכן ש- או ).

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

הגדרת קבלה

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

בצורה פורמלית, השפה שמתקבלת על ידי הגעה למצב מקבל מוגדרת בתור:

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

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

לקריאה נוספת

קישורים חיצוניים


  • שגיאות פרמטריות בתבנית:לא מדויק

    פרמטרי חובה [ 2 ] חסרים
    גדי אלכסנדרוביץ', {{{2}}}, באתר "לא מדויק", 22 במרץ 2015