گرامر نمایه‌سازی‌شده

**گرامر [[نمایه‌سازی]] شده** تعمیم گرامر مستقل از متن است که غیرپایانه‌ها با لیستی از پرچم‌ها مجهز شده‌است. زبانی که به وسیلهٔ گرامر نمایه سازی شده تولید می‌شود زبان ایندکس شده نامیده می‌شود.

## تعریف
### تعریف جدید از Hopcroft و Ullman
گرامر نمایه سازی شده به‌طور رسمی یک ۵تایی *G* = ⟨*N*,*T*,*F*,*P*,*S* تعریف می‌شود به طوریکه:
* *N* مجموعه‌ای از متغیرها یا نمادهای غیرترمینال
* *T* مجموعه الفبای نمادهای ترمینال
* *F* مجموعه نمادهای ایندکس
* *S* ∈ *N* نماد شروع
* *P* مجموعه متناهی از تولیدات

در تولیدات مانند اشتقاق در گرامر نمایه سازی شده، رشتهٔ σ از نمادهای ایندکس به همهٔ نمادهای غیرترمینال *A* ∈ *N* متصل می‌شوند که توسط (A*)σ* مشخص می‌شود. نمادهای ترمینال ممکن است با ایندکس پشته دنبال نشوند. برای نماد پشته
σ ∈ *F** و رشتهٔ α ∈ (*N* ∪ *T*)* از نمادهای غیرترمینال و ترمینال، (α)σ نتیجهٔ اتصال (σ) به همهٔ غیرترمینال‌ها در α را مشخص می‌کند. برای مثال اگر α برابر  باشد به طوریکه *a*,*d* ∈ *T* ترمینال، و *B*,*D*,*E* ∈ *N* نمادهای غیرترمینال، آنگاه
 را مشخص می‌کند. با استفاده از این نشانه‌گذاری، هر تولید در *P* به این فرم می‌باشد:
# [A[σ] → α[σ،
# [A[σ] → B[fσ، یا
# [A[fσ] → α[σ

که  A, B ∈ N نمادهای غیرترمینال، f ∈ F ایندکس،  σ ∈F  رشته از نمادهای ایندکس و  (α ∈ (N ∪ T   رشته از نمادهای ترمینال و غیرترمینال. بعضی نویسنده‌ها به جای "σ" ".."  را برای نماد پشته در قوانین تولید می‌نویسند. قوانین نوع۱٬۲ و۳ به ترتیب به صورت  A[..]→α[..], A[..]→B[f..] A[f..]→α[..], خوانده می‌شود.

اشتقاق‌ها مانند اشتقاق در گرامر مستقل از متن می‌باشند جز نماد پشته که به هر نماد غیرترمینال متصل شده‌است. وقتی قاعده تولیدی مانند [A[σ] → B[σ]C[σ به کار رود، نماد پشته *A* در جفت *B* و *C*  کپی می‌شود. علاوه براین، قانون ممکن است یک نماد ایندکس را روی پشته بگذارد یا بردارد.

به‌طور رسمی رابطه ⇒ ("اشتقاق مستقیم") روی مجموعه*]∪*T*)**) از فرم‌های ضروری اینگونه تعریف می‌شود:
# اگر [A[σ] → α[σ از تولید نوع ۱ باشد، آنگاه  β *A*[φ] γ ⇒ β α[φ] γ با استفاده از تعریف بالا. قوانین سمت چپ ایندکس پشته φ به هرکدام از غیرترمینال‌های سمت راست کپی شده است.
# اگر  [A[σ] → B[fσ از تولید نوع ۲ باشد، آنگاه  β *A*[φ] γ ⇒ β *B*[*f*φ] γ که سمت راست ایندکس پشته از سمت چپ پشته φ با وارد کردن *f* داخلش به دست می‌آید.
# اگر  [A[fσ] → α[σ از تولید نوع ۳ باشد، آنگاه β *A*[*f*φ] γ ⇒ β α[φ] γ، با استفادهٔ دوباره از تعریف  [α[σ که اولین ایندکس *f* از سمت چپ پشته خارج می‌شود که به غیرترمینال‌های سمت راست توزیع شده است.

به طور معمول اشتقاق  ⇒[[reflexive transitive closure|<sup>*</sup>]] بستار متعدی انعکاسی اشتقاق مستقیم ⇒ تعریف شده است. زبان *L*(*G*) = { w ∈ *T*<sup>*</sup>: *S* ⇒<sup>*</sup> w } مجموعه تمام رشته‌های نمادهای ترمینال اشتقاق شده از نماد شروع می‌باشد.

=== تعریف اصلی توسط Aho ===
از نظر تاریخی، گرامر ایندکس شده توسط Aho (در ۱۹۶۸) با استفاده از یک فرمالیسم متفاوت معرفی شد. Aho یک گرامر ایندکس شده را یک ۵-تایی (*N*,*T*,*F*,*P*,*S*) تعریف کرد به طوریکه:
# *N* الفبایی از متغیرها یا نمادهای غیرترمینال
# *T* یک الفبای متناهی از نمادهای غیرترمینال
# *F* ⊆ [[power set|2]]<sup>*N* × (*N* ∪ *T*)[[ستاره کلین|<sup>*</sup>]]</sup> یک مجموعهٔ متناهی که به طور معمول *پرچم‌ها* خوانده می‌شود (هر پرچم مجموعه‌ای از *حاصل‌ضرب‌های ایندکس شده* است)
# *P* ⊆ *N* × (*NF*<sup>*</sup> ∪ *T*)<sup>*</sup> مجموعهٔ حاصل‌ضرب‌هاست.
# *S* ∈ *N* نماد شروعی

== گرامر نمایه سازی شدهٔ خطی ==
Gerald Gazdar کلاس دیگری به نام گرامرهای نمایه سازی شدهٔ خطی (LIG) تعریف کرد با این شرط که حداکثر یک غیرترمینال در هر حاصل‌ضرب مخصوص دریافت استک باشد. در حالی که در گرامرهای ایندکس شدهٔ معمولی، تمام غیرترمینال‌ها نسخه‌هایی از استک را دریافت می‌کنند.
به صورت رسمی، گرامر ایندکس شدهٔ خطی به طور مشابه با یک گرامر ایندکس شدهٔ معمولی تعریف می‌شود، اما شرط‌های فرم حاصل‌ضرب به صورت زیر اصلاح شده‌اند:
# *A*[σ] → α[] *B*[σ] β[],
# *A*[σ] → α[] *B*[*f*σ] β[],
# *A*[*f*σ] → α[] *B*[σ] β[],
که *A*, *B*, *f*, σ, α به صورت [[#تعریف جدید توسط هاپکرافت و اولمن|فوق]] استفاده شده‌اند و β ∈ (*N* ∪ *T*)<sup>*</sup> رشته‌ای از نمادهای ترمینال و غیرترمینال مانند α است. همچنین، رابطهٔ یک‌طرفهٔ ⇒ به صورتی مشابه فوق تعریف شده‌اند. این کلاس جدید از گرامرها یک کلاس اکیداً کوچکتر از زبان‌ها را تعریف می‌کند، که به کلاس‌های با وابستگی کم به متن متعلق هستند.

زبان { *www*: *w* ∈ {*a*,*b*}<sup>*</sup> } توسط یک گرامر ایندکس شده قابل تولید است، ولی توسط یک گرامر نمایه سازی شدهٔ خطی قابل تولید نیست. در حالی که { *a*<sup>*n*</sup> *b*<sup>*n*</sup> *c*<sup>*n*</sup>: n ≥ ۱ } توسط یک گرامر نمایه سازی شدهٔ خطی قابل تولید است.

اگر هم قانون اصلی و هم قانون اصلی حاصل‌ضرب قابل قبول باشند، کلاس زبان به صورت زبان نمایه سازی شده باقی می‌ماند.

=== مثال ===
فرض کنید σ نشان‌دهندهٔ مجموعهٔ دلخواهی از نمادهای استک باشد. می‌توانیم گرامری برای زبان *L* = {*a*<sup>*n*</sup> *b*<sup>*n*</sup> *c*<sup>*n*</sup> | *n* ≥ ۱ } تعریف کنیم به طوری که:



برای به دست آوردن رشتهٔ *abc* مراحل *S*[] ⇒ *aS*[*f*]*c* ⇒ *aT*[*f*]*c* ⇒ *aT*[]*bc* ⇒ *abc* را طی می‌کنیم.
به صورت مشابه: *S*[] ⇒ *aS*[*f*]*c* ⇒ *aaS*[*ff*]*cc* ⇒ *aaT*[*ff*]*cc* ⇒ *aaT*[*f*]*bcc* ⇒ *aaT*[]*bbcc* ⇒ *aabbcc*.

=== قدرت محاسباتی ===
زبان‌های ایندکس شدهٔ خطی زیرمجموعه‌ای از زبان‌های نمایه سازی شده هستند، بنابراین می‌توانیم تمام LIGها را به صورت IG تعریف کرده و با این کار LIGها را اکیداً کم‌قدرت‌تر از IGها کنیم. تبدیلی از یک LIG به یک IG نسبتاً ساده است. قوانین LIG در حالت کلی، مثل قسمت گذاشتن/برداشتن (Push/Pop) در یک قانون بازنویسی، به صورت <math>X[\sigma] \to \alpha Y[\sigma] \beta</math> هستند. نمادهای <math>\alpha</math> و <math>\beta</math> نشان‌دهندهٔ رشته‌هایی از نمادهای ترمینال و/یا غیرترمینال هستند و به خاطر تعریف LIG، هر نماد غیرترمینالی باید یک استک خالی داشته باشد. البته این برعکس تعریف IGهاست: در یک IG، غیرترمینال‌هایی که در استک‌هایشان چیزی گذاشته نمی‌شود یا از آن‌ها چیزی برداشته نمی‌شود، باید دقیقاهمان استک غیرترمینال بازنویسی‌شده باشد؛ بنابراین به نحوی، به غیرترمینال‌هایی در <math>\alpha</math> و <math>\beta</math> احتیاج داریم که علی‌رغم داشتن پشته‌های غیر خالی، طوری از خود رفتار نشان دهند که گویا پشته‌های خالی دارند.

بیایید قانون <math>X[\sigma] \to Y[] Z[\sigma f]</math> را به عنوان یک مورد مثال فرض کنیم. در تبدیل آن به یک IG، جایگزین <math>Y[]</math> باید چیزی مثل <math>Y^{\prime}[\sigma]</math> که بدون توجه به مقدار <math>\sigma</math>، دقیقاً مشابه <math>Y[]</math> عمل کند. برای رسیدن به این هدف، می‌توانیم یک زوج قانون داشته باشیم که هر <math>Y^{\prime}[\sigma]</math> را که <math>\sigma</math> تهی نیست می‌گیرد و از پشته نمادها را برمی‌دارد. سپس، وقتی پشته خالی شد، می‌تواند به صورت <math>Y[]</math> بازنویسی شود.

<math>Y^{\prime}[\sigma f] \to Y^{\prime}[\sigma]</math>

<math>Y^{\prime}[] \to Y[]</math>

می‌توانیم به صورت کلی این قاعده را به کار ببندیم تا از یک LIG، یک IG را به دست آوریم؛ بنابراین به طور مثال اگر LIG برای زبان <math>\{a^n b^n c^n d^m | n \geq 1, m \geq 1\}</math> به صورت زیر باشد:

<math>S[\sigma] \to T[\sigma]V[]</math>

<math>V[] \to d ~|~ dV[]</math>

<math>T[\sigma] \to aT[\sigma f]c ~|~ U[\sigma]</math>

<math>U[\sigma f] \to bU[\sigma]</math>

<math>U[] \to \epsilon</math>

قانون ضروری در اینجا یک قانون IG نیست، اما با استفاده از الگوریتم تبدیل بالا، می‌توانیم قوانین جدیدی برای <math>V^{\prime}</math> تعریف کنیم که گرامر را به صورت زیر تغییر می‌دهند:

<math>S[\sigma] \to T[\sigma]V^{\prime}[\sigma]</math>

<math>V^{\prime}[\sigma f] \to V^{\prime}[\sigma]</math>

<math>V^{\prime}[] \to V[]</math>

<math>V[] \to d ~|~ dV[]</math>

<math>T[\sigma] \to aT[\sigma f]c ~|~ U[\sigma]</math>

<math>U[\sigma f] \to bU[\sigma]</math>

<math>U[] \to \epsilon</math>

همه قوانین اکنون با تعریف یک IG به این صورت: در آن تمام غیرترمینال‌های در سمت راست یک قانون بازنویسی، نسخه‌ای از نماد بازنویسی شده در پشته را دریافت می‌کنند، مطابقت دارد؛ بنابراین گرامرهای ایندکس شده قادرند تمام زبان‌هایی را که گرامرهای ایندکس شدهٔ خطی وصف می‌کنند را وصف کنند.

=== ارتباط با روش‌های دیگر ===
Vijay-Shanker و Weir (در ۱۹۹۴) نشان دادند که گرامرهای نمایه سازی شدهٔ خطی، گرامرهای ترکیبی دسته‌ای، گرامرهای درخت الحاقی، و گرامرهای سر، همه کلاس یکسانی از زبان‌های رشته‌ای را تعریف می‌کنند. تعریف رسمی آن‌ها از گرامرهای ایندکس شدهٔ خطی با تعریف [[#گرامرهای ایندکس شدهٔ خطی|فوقتفاوت]] دارد.

LIGها (و هم‌ارزهای ضعیف آن‌ها) اکیداً ارزانتر (یعنی زیرمجموعهٔ مناسبی را تولید می‌کنند) از زبان‌هایی است که توسط یک خانواده از هم‌ارزهای ضعیف فرمالیسم شامل:LCFRS, MCTAG, MCFG و گرامرهای مینیمالیست (MGها) تولید می‌شوند. خانوادهٔ آخر را می‌توان همچنین به زمان چندجمله‌ای تجزیه کرد.

== گرامرهای نمایه سازی شدهٔ توزیعی ==
شکل دیگری از گرامرهای نمایه سازی شده که در ۱۹۹۳ توسط Staudacher معرفی شدند، کلاس گرامرهای نمایه سازی شدهٔ توزیعی (DIها) است. آنچه DIGها را از گرامرهای نمایه سازی شدهٔ Aho متمایز می‌سازد، انتشار ایندکس‌هاست. برخلاف IGهای Aho، که همهٔ پشتهٔ نماد را روی تمام غیرترمینال‌ها در مدت زمان یک عملیات بازنویسی توزیع می‌کند، DIGها پشته را به چند زیرپشته تقسیم می‌کند و زیرپشته‌ها را روی غیرترمینال‌های انتخابی توزیع می‌کند.

طرح کلی برای یک قانون توزیع دودویی از DIG به صورت

*X*[*f*<sub>1</sub>...*f*<sub>*i*</sub>*f*<sub>*i*+1</sub>...*f*<sub>*n*</sub>] → α *Y*[f<sub>1</sub>...*f*<sub>*i*</sub>] β *Z*[*f*<sub>*i*+1</sub>...*f*<sub>*n*</sub>] γ

که α و β و γ رشته‌های ترمینالی دلخواهی هستند. برای یک توزیع رشتهٔ سه‌تایی:

*X*[*f*<sub>1</sub>...*f*<sub>*i*</sub>*f*<sub>*i*+1</sub>...*f*<sub>*j*</sub>*f*<sub>*j*+1</sub>...*f*<sub>*n*</sub>] → α *Y*[f<sub>1</sub>...*f*<sub>*i*</sub>] β *Z*[*f*<sub>*i*+1</sub>...*f*<sub>*j*</sub>] γ *W*[*f*<sub>*j*+1</sub>...*f*<sub>*n''] η

و ترتیب برای تعداد بیشتری از غیرترمینال‌ها در دست راست قانون بازنویسی به همین صورت است. به‌طور کلی، اگر m غیرترمینال در سمت راست یک قانون بازنویسی وجود داشته باشد، پشته به m راه تقسیم شده و روی غیرترمینال‌های جدید توزیع می‌شود. توجه کنید که یک مورد خاص وجود دارد که قسمت خالی باشد، که به صورت مؤثر قانون را به یک قانون LIG تبدیل می‌کند؛ بنابراین زبان‌های نمایه سازی شدهٔ توزیعی یک اَبَرمجموعه از زبان‌های نمایه سازی شدهٔ خطی است.

## جستارهای وابسته
## منابع

رده:چارچوب‌های دستور زبانی
رده:زبان‌های صوری
رده:ویکی‌سازی رباتیک