تعریف ماشین های حالت محدود ماشین های حالت محدود ماشین حالت محدود در الگوریتم کنترل

نظریه ماشین حالت محدود

نظریه اتوماتا زیربنای نظریه ساخت کامپایلر است. ماشین حالت محدود یکی از مفاهیم اساسی است. منظور ما از خودکار چیزی است که واقعا وجود ندارد. دستگاه فنی، اگرچه می توان چنین دستگاهی را ساخت و برخی از مدل های ریاضی که ویژگی ها و رفتار آن را می توان با استفاده از یک برنامه در رایانه تقلید کرد. یک اتومات محدود ساده ترین مدل تئوری اتوماتاست و به عنوان یک قاعده به عنوان یک دستگاه کنترل برای سایر انواع اتوماتا عمل می کند. ماشین حالت محدود تعدادی ویژگی دارد:

· یک ماشین حالت می تواند تعدادی از مشکلات کامپایل سبک وزن را حل کند. بلوک واژگانی تقریباً همیشه بر اساس یک ماشین حالت محدود ساخته می شود.

· عملکرد ماشین حالت محدود با عملکرد بالا مشخص می شود.

· مدل سازی ماشین حالت نیاز به مقدار ثابتی از حافظه دارد که مدیریت حافظه را ساده می کند.

· تعدادی قضیه و الگوریتم وجود دارد که به شما امکان می دهد ماشین های حالت محدود را بسازید و ساده کنید.

چندین تعریف مختلف از ماشین حالت محدود در ادبیات وجود دارد. با این حال، وجه مشترک آنها این است که ماشین حالت محدود یک دستگاه محاسباتی با مقدار ثابتی از حافظه را مدل می کند که دنباله هایی از نمادهای ورودی متعلق به مجموعه ورودی را می خواند. تفاوت های اساسی در تعاریف مربوط به کاری است که ماشین در خروجی انجام می دهد. خروجی ماشین می تواند نشانه ای از "قابل قبول" بودن یا نبودن یک زنجیره ورودی داده شده باشد. "قابل قبول" زنجیره ای است که به درستی ساخته شده یا از نظر نحوی صحیح است. به عنوان مثال، زنجیره ای که قرار است یک ثابت عددی را نشان دهد، اگر دارای دو اعشار باشد، اشتباه ساخته شده در نظر گرفته می شود.

تعریف:ماشین حالت محدود یک سیستم رسمی است که با استفاده از اشیاء زیر تعریف می شود:

· مجموعه محدودی از نمادهای ورودی.

· مجموعه متناهی از حالات.

یک تابع انتقال که به هر جفت (وضعیت فعلی، نماد ورودی) یک حالت جدید اختصاص می دهد.

· حالت اولیه؛

· زیرمجموعه ای از حالت ها که به عنوان مجاز یا نهایی شناسایی شده اند.

مثال. بیایید عملکرد کنترل‌کننده‌ای را تحلیل کنیم که زوج یا فرد بودن تعداد یک‌ها را در یک زنجیره دلخواه متشکل از صفر و یک بررسی می‌کند. اجازه دهید فرض کنیم که خودکار متناهی متناظر باید تمام زنجیره‌های حاوی تعداد فرد را «بپذیرد» و زنجیره‌های با عدد زوج را «رد» کند. بیایید این ماشین را "کنترل کننده برابری" بنامیم. ما معتقدیم که نمادهای غیر از 0 و 1 را نمی توان به ورودی دستگاه ارسال کرد. بنابراین، الفبای ورودی کنترلر مجموعه (0، 1) است. ما معتقدیم که در یک لحظه خاص از زمان، خودکار محدود تنها با یک نماد ورودی سر و کار دارد و اطلاعات مربوط به نمادهای قبلی زنجیره ورودی را با استفاده از مجموعه ای محدود از حالت ها ذخیره می کند. مجموعه (زوج، فرد) را به عنوان مجموعه ای از حالت ها در نظر می گیریم؛ یکی از این حالت ها باید به عنوان حالت اولیه انتخاب شود. بگذارید حالت (زوج) باشد، زیرا در مرحله اول تعداد یکهای خوانده شده صفر است و صفر یک عدد زوج است. هنگام خواندن نماد ورودی بعدی، وضعیت ماشین یا تغییر می کند یا ثابت می ماند و حالت جدید آن به نماد ورودی و وضعیت فعلی بستگی دارد. به این تغییر حالت، گذار می گویند.



عملکرد ماشین را می توان با یک تابع انتقال به شکل d(Scurrent, x) = Snew به صورت ریاضی توصیف کرد. در غیر این صورت می توان آن را به صورت زیر نوشت:

d( زوج، 0) = زوج. d( زوج، 1) = فرد.

d(فرد، 0) = فرد. d(فرد، 1) = زوج.

کنترل کننده دارای یک حالت پذیرنده واحد است، ODD، و EVEN یک حالت "رد" است. اجازه دهید توالی انتقال ماشین را زمانی که زنجیره 1101 به ورودی آن عرضه می شود منعکس کنیم.

EVEN ® ODD ® EVEN ® EVEN ® ODD

جدول انتقال چنین خودکاری به شکل زیر است:

زوج زوج فرد
فرد فرد زوج

تعریف.ماشین حالت محدود یک سیستم رسمی است

S = (A، Q، d، l، V)،

که اشیاء آن عبارتند از:

* A مجموعه محدودی از نمادهای ورودی است (مجموعه

پایانه ها)؛

* Q - مجموعه محدودی از حالات داخلی خودکار

(مجموعه غیر پایانه ها)؛

* V - مجموعه متناهی از نمادهای خروجی (الفبای خروجی).

* d - تابع انتقال، که با A 'Q ® Q مشخص می شود.

* l - تابع خروجی که نمایش نما را تعیین می کند.

در این مقاله، اصطلاح "ماشین حالت محدود" به الگوریتمی اطلاق می شود که می تواند در یکی از تعداد کمی از حالت ها باشد. "وضعیت" شرایط خاصی است که یک رابطه معین بین سیگنال های ورودی و خروجی و همچنین سیگنال های ورودی و حالت های بعدی را تعریف می کند. یک خواننده هوشمند بلافاصله متوجه خواهد شد که ماشین های حالت محدود که در این مقاله توضیح داده شده است ماشین های Mealy هستند. ماشین Mealy یک ماشین حالت محدود است که در آن خروجی ها توابعی از وضعیت فعلی و سیگنال ورودی هستند، برخلاف ماشین مور که در آن خروجی ها فقط توابع حالت هستند. در هر دو حالت، حالت بعدی تابعی از وضعیت فعلی و سیگنال ورودی است.

بیایید به مثالی از یک ماشین حالت محدود ساده نگاه کنیم. تصور کنید که در یک رشته متنی باید دنباله کاراکتر "//" را تشخیص دهید. شکل 1 نشان می دهد که چگونه این کار با استفاده از یک ماشین حالت انجام می شود. اولین ظاهر یک اسلش سیگنال خروجی تولید نمی کند، بلکه باعث می شود دستگاه به حالت دوم برود. اگر در حالت دوم دستگاه اسلش پیدا نکرد، به حالت اول برمی گردد، زیرا نیاز به وجود 2 اسلش پشت سر هم دارد. اگر اسلش دوم پیدا شود، دستگاه یک سیگنال "آماده" صادر می کند.

دریابید که مشتری به چه چیزی نیاز دارد.

یک نمودار انتقال حالت ایجاد کنید

رمزگذاری "اسکلت" یک ماشین حالت بدون جزئیات عملیات شاخه.

مطمئن شوید که انتقال ها به درستی کار می کنند.

در مورد جزئیات انتقال دقیق باشید.

امتحان بده

نمونه ماشین حالت

بیایید به مثال جالب‌تری از یک ماشین حالت نگاه کنیم - برنامه‌ای که عقب‌نشینی و گسترش ارابه فرود هواپیما را کنترل می‌کند. اگرچه اکثر هواپیماها این روش را با استفاده از مکانیزم کنترل الکتروهیدرولیک انجام می دهند (به سادگی به دلیل اینکه کامپیوتری در هواپیما وجود ندارد)، در برخی موارد، مانند هواپیماهای بدون سرنشین، ارزش استفاده از کنترل نرم افزاری را دارد.

ابتدا بیایید به تجهیزات نگاه کنیم. ارابه فرود هواپیما از یک دنده دماغه، یک ارابه فرود چپ اصلی و یک ارابه فرود سمت راست اصلی تشکیل شده است. آنها توسط یک مکانیسم هیدرولیک هدایت می شوند. یک پمپ هیدرولیک با هدایت الکتریکی فشار را به محرک برق می رساند. با کمک نرم افزارپمپ روشن یا خاموش می شود رایانه موقعیت سوپاپ جهت را - "پایین" یا "بالا" - تنظیم می کند تا فشار برای بالا بردن یا پایین آوردن ارابه فرود فراهم شود. هر یک از تکیه گاه های شاسی دارای یک سوئیچ محدود است: یکی از آنها در صورت بالا آمدن شاسی بسته می شود، دیگری - اگر در موقعیت پایین قفل شده باشد. برای تعیین اینکه آیا هواپیما روی زمین است یا خیر، زمانی که وزن هواپیما روی دنده دماغه باشد، یک سوئیچ محدود روی دنده دماغه بسته می شود. کنترل‌های خلبان شامل یک بازوی ارابه فرود بالا/پایین و سه چراغ (یکی برای هر پا) است که می‌تواند خاموش شود، سبز (موقعیت پایین) یا قرمز (موقعیت رفتن).

حالا بیایید به سمت توسعه یک ماشین حالت محدود برویم. اولین و سخت ترین مرحله درک انتظارات واقعی مشتری است. یکی از مزایای ماشین حالت محدود این است که برنامه نویس را مجبور می کند تا در تمام موارد ممکن فکر کند و در نتیجه تمام اطلاعات مورد نیاز را از مشتری دریافت کند. چرا این مرحله را سخت ترین مرحله می دانم؟ و چند بار به شما شرح وظایف مشابه این داده شده است: اگر هواپیما روی زمین است، ارابه فرود را جمع نکنید.

البته این مهم است، اما مشتری معتقد است که همه چیز به همین جا ختم می شود. بقیه موارد چطور؟ آیا جمع کردن ارابه فرود در لحظه بلند شدن هواپیما از زمین کافی است؟ اگر هواپیما روی دست انداز باند فرودگاه بپرد چه؟ اگر خلبان هنگام پارک کردن، چوب دنده را به سمت بالا حرکت دهد و در نتیجه شروع به بلند شدن کند، چه؟ آیا در این حالت باید ارابه فرود را بالا برد؟

یکی از مزیت‌های فکر کردن بر حسب ماشین حالت این است که می‌توانید به سرعت نمودار انتقال حالت را روی یک تابلوی طرح‌نما، درست در مقابل مشتری ترسیم کنید و کل فرآیند را با او طی کنید. تعیین زیر برای انتقال حالت پذیرفته شده است: "رویدادی که باعث انتقال شد" / "سیگنال خروجی در نتیجه انتقال". اگر ما فقط آنچه را که مشتری در ابتدا خواسته بود توسعه داده بودیم ("اگر هواپیما روی زمین است ارابه فرود را جمع نکنید")، ماشین نشان داده شده در شکل 2 را دریافت می کردیم.

هنگام ایجاد نمودار انتقال حالت (یا هر الگوریتم دیگری)، موارد زیر را در نظر داشته باشید:

کامپیوترها در مقایسه با تجهیزات مکانیکی بسیار سریع کار می کنند

مهندس مکانیکی که توضیح می دهد که چه کاری باید انجام شود، ممکن است به اندازه شما درباره کامپیوترها و الگوریتم ها اطلاعات نداشته باشد. و این هم نکته مثبت، در غیر این صورت، شما نیازی نخواهید داشت!

اگر یک قطعه مکانیکی یا الکتریکی خراب شود، برنامه شما چگونه عمل می کند؟

یک ماشین حالت بر اساس آنچه مشتری واقعاً نیاز دارد در شکل 3 نشان داده شده است. در اینجا می خواهیم از جمع شدن ارابه فرود هواپیما تا زمانی که قطعاً در هوا باشد جلوگیری کنیم. برای انجام این کار، پس از باز کردن سوئیچ فرود، دستگاه برای چند ثانیه منتظر می ماند. ما همچنین می‌خواهیم به لبه بالارونده اهرم خلبان پاسخ دهیم تا سطح، که اگر کسی اهرم را در حالی که هواپیما در پارک است حرکت دهد، از مشکل جلوگیری می‌کند. جمع کردن یا امتداد دادن ارابه فرود چند ثانیه طول می کشد و باید برای شرایطی آماده باشیم که خلبان در این عملیات نظر خود را تغییر دهد و اهرم را در جهت مخالف حرکت دهد. همچنین توجه داشته باشید که اگر زمانی که در حالت "در انتظار برخاستن" هستیم، هواپیما دوباره فرود بیاید، تایمر دوباره راه اندازی می شود و ارابه فرود تنها در صورتی جمع می شود که هواپیما به مدت 2 ثانیه در هوا باشد.

پیاده سازی یک ماشین حالت محدود

لیست 1 پیاده سازی من از ماشین حالت نشان داده شده در شکل 3 است. بیایید برخی از جزئیات کد را مورد بحث قرار دهیم.

/*فهرست 1*/

typedef enum(GEAR_DOWN = 0، WTG_FOR_TKOFF، RAISING_GEAR، GEAR_UP، LOWERING_GEAR) State_Type;

/*این آرایه حاوی اشاره گرهایی به توابع فراخوانی شده در حالت های خاص است*/

خالی(*state_table)() = (GearDown، WtgForTakeoff، RaisingGear، GearUp، LoweringGear);

State_Type curr_state;

InitializeLdgGearSM();

/*قلب ماشین این حلقه بی پایان است. تابع مربوطه

وضعیت فعلی، یک بار در هر تکرار فراخوانی می شود */

در حالی که (1) {

state_table();

DecrementTimer();

خالی InitializeLdgGearSM( خالی )

curr_state = GEAR_DOWN;

/*توقف تجهیزات، خاموش کردن چراغ ها و غیره*/

خالی GearDown( خالی )

/* اگر هواپیما به حالت انتظار بروید

روی زمین نبود و فرمان بلند کردن ارابه فرود را دریافت کرد*/

اگر((اهرم_دنده == بالا) && (اهرم_دنده_قبلی == پایین) && (سوئیچ_دنده == بالا)) (

curr_state = WTG_FOR_TKOFF;

prev_gear_lever = اهرم_دنده;

خالی RaisingGear( خالی )

اگر((nosegear_is_up == MADE) && (leftgear_is_up == MADE) && (rtgear_is_up == MADE)) (

curr_state = GEAR_UP;

/*اگر خلبان تصمیم خود را تغییر داد، به حالت "ارابه فرود پایین تر" بروید*/

اگر(اهرم_دنده == پایین) (

curr_state = LOWERING_GEAR;

خالی GearUp( خالی )

/*اگر خلبان اهرم را به موقعیت "پایین" برد،

به حالت «پایین‌آوردن ارابه فرود» می‌رویم*/

اگر(اهرم_دنده == پایین) (

curr_state = LOWERING_GEAR;

خالی WtgForTakeoff( خالی )

/* قبل از بالا بردن ارابه فرود صبر کنید.*/

اگر(تایمر<= 0.0) {

curr_state = RAISING_GEAR;

/*اگر دوباره لمس کردیم یا خلبان نظرش را تغییر داد، همه چیز را از نو شروع کنید*/

اگر((squat_switch == DOWN) || (اهرم_دنده == DOWN)) (

curr_state = GEAR_DOWN;

/* نمی خواهید از او بخواهید که اهرم را دوباره تغییر دهد

این فقط یک جهش بود.*/

prev_gear_lever = DOWN;

خالی Lowering Gear( خالی )

اگر(اهرم_دنده == بالا) (

curr_state = RAISING_GEAR;

اگر((nosegear_is_down == MADE) && (leftgear_is_down == MADE) &&(rtgear_is_down == MADE)) (

curr_state = GEAR_DOWN;

ابتدا، ممکن است متوجه شوید که عملکرد هر حالت توسط یک تابع C جداگانه پیاده سازی می شود. البته، می‌توان یک خودکار را با استفاده از یک دستور سوئیچ با یک مورد جداگانه برای هر حالت پیاده‌سازی کرد، اما این می‌تواند منجر به عملکرد بسیار طولانی شود (10-20 خط کد در هر حالت برای هر یک از 20-30 حالت) . اگر کد را در مراحل پایانی آزمایش تغییر دهید، ممکن است منجر به خطا شود. ممکن است هرگز یک عبارت break در پایان یک پرونده را فراموش نکرده باشید، اما چنین مواردی برای من اتفاق افتاده است. اگر برای هر حالت یک تابع جداگانه داشته باشید، کد یک حالت هرگز در کد دیگری ختم نمی شود.

برای جلوگیری از استفاده از دستور سوئیچ، من از آرایه ای از اشاره گرها برای بیان توابع استفاده می کنم و متغیر مورد استفاده به عنوان شاخص آرایه را از نوع enum اعلام می کنم.

برای سادگی، سخت‌افزار ورودی/خروجی مسئول خواندن وضعیت سوئیچ‌ها، روشن و خاموش کردن پمپ‌ها و غیره به صورت متغیرهای ساده نشان داده می‌شود. فرض می شود که این متغیرها "آدرس های جادویی" هستند که از طریق ابزارهای نامرئی با سخت افزار مرتبط هستند.

نکته واضح دیگر این است که کد در این مرحله واقعاً مهم نیست. او به سادگی از یک حالت به حالت دیگر حرکت می کند. این یک مرحله میانی مهم است و نباید نادیده گرفته شود. به هر حال، خوب است که دستورات چاپی را بین دستورالعمل های کامپایل شرطی (#ifdef DEBUG .. #endif) اضافه کنید که وضعیت فعلی و مقادیر سیگنال های ورودی را چاپ کند.

کلید موفقیت در کدی نهفته است که باعث انتقال حالت می شود، یعنی. تعیین می کند که ورود داده ها اتفاق افتاده است.

اگر کد از تمام حالت ها به درستی عبور کند، مرحله بعدی نوشتن "پر کردن" کد است، یعنی دقیقاً چه چیزی سیگنال خروجی را تولید می کند. به یاد داشته باشید که هر انتقال دارای یک سیگنال ورودی (رویدادی که باعث آن شد) و یک سیگنال خروجی (دستگاه ورودی/خروجی سخت افزاری، مانند مثال ما) دارد. اغلب مفید است که این را در قالب یک جدول انتقال حالت ثبت کنیم.

در جدول انتقال وضعیت، یک ردیف برای هر انتقال حالت وجود دارد.

هنگام کدنویسی یک ماشین حالت، سعی کنید قدرت آن را حفظ کنید - مطابقت واضحی بین نیازهای مشتری و کد. ممکن است لازم باشد جزئیات سخت افزاری را در یک لایه تابع دیگر پنهان کنید، برای مثال، کد ماشین حالت تا حد ممکن شبیه جدول انتقال حالت و نمودار انتقال حالت باشد. این تقارن به جلوگیری از خطاها کمک می کند و توضیح می دهد که چرا ماشین های حالت بخش مهمی از زرادخانه برنامه نویس سیستم های جاسازی شده هستند. البته، می‌توانید با چک‌باکس‌ها و تعداد بی‌نهایت عبارات تودرتو به همان اثر دست پیدا کنید، اما این کار ردیابی کد و مقایسه آن با خواسته‌های مشتری را بسیار دشوار می‌کند.

قطعه کد در لیست 2 تابع RaisingGear() را گسترش می دهد. توجه داشته باشید که کد تابع RaisingGear() با هدف منعکس کردن 2 ردیف جدول انتقال برای وضعیت Raising Gear است.

خالی RaisingGear( خالی )

/*بعد از بالا آمدن تمامی سوئیچ ها به حالت “شاسی بلند شده” می رویم*/

اگر((nosegear_is_up == MADE) && (leftgear_is_up == MADE) && (rtgear_is_up == MADE)) (

پمپ_موتور = خاموش;

چراغ های دنده = خاموش;

curr_state = GEAR_UP;

/*اگر خلبان نظر خود را تغییر داد، شروع به جمع کردن ارابه فرود کنید*/

اگر(اهرم_دنده == پایین) (

پمپ_جهت = DOWN;

curr_state = GEAR_LOWERING;

به یاد داشته باشید که از شرایط نهفته خودداری کنید. حالت پنهان زمانی رخ می دهد که به دلیل تنبلی، به جای اضافه کردن یک حالت خاص، سعی کنید یک حالت فرعی مشروط اضافه کنید. برای مثال، اگر کد شما سیگنال ورودی یکسان را به روش‌های متفاوتی پردازش می‌کند (یعنی انتقال حالت‌های متفاوتی را برحسب حالت ایجاد می‌کند)، در این صورت یک حالت پنهان است. در این مورد، من نمی خواهم بدانم که آیا این حالت باید به دو قسمت تقسیم شود؟ استفاده از حالت های پنهان، مزیت استفاده از ماشین حالت را نفی می کند.

به عنوان یک عمل، می‌توانید با اضافه کردن یک بازه زمانی به چرخه جمع‌کردن یا تمدید ارابه فرود، ماشین حالتی را که ما به آن نگاه کردیم، تمدید کنید، زیرا... مهندس مکانیک نمی خواهد پمپ هیدرولیک بیش از 60 ثانیه کار کند. اگر چرخه به پایان برسد، خلبان باید با تغییر چراغ سبز و قرمز هشدار داده شود و باید بتواند اهرم را دوباره حرکت دهد تا دوباره تلاش کند. همچنین ممکن است بخواهید از یک مهندس مکانیک فرضی بپرسید که تغییر جهت پمپ در حین کار کردن چه تاثیری بر پمپ دارد، زیرا در دو مورد زمانی اتفاق می افتد که خلبان نظر خود را تغییر دهد. البته مکانیک می گوید منفی است. سپس چگونه می توانید دستگاه حالت را تغییر دهید تا به سرعت پمپ را هنگام تغییر جهت متوقف کند؟

تست ماشین دولتی

زیبایی الگوریتم های کدنویسی به عنوان ماشین های حالت این است که طرح آزمایشی تقریباً به طور خودکار خودش را می نویسد. تنها کاری که شما باید انجام دهید این است که از طریق هر انتقال حالت عبور کنید. من معمولاً این کار را با یک نشانگر در دست انجام می‌دهم و فلش‌های روی نمودار انتقال حالت را هنگام گذراندن آزمون خط می‌کشم. این یک راه خوب برای جلوگیری از "حالت های پنهان" است - آنها در تست ها بیشتر از حالت های خاص نادیده گرفته می شوند.

این نیاز به صبر قابل توجه و قهوه زیاد دارد، زیرا حتی یک دستگاه حالت متوسط ​​​​می تواند تا 100 انتقال مختلف داشته باشد. به هر حال، تعداد انتقال ها یک راه عالی برای اندازه گیری پیچیدگی یک سیستم است. مورد دوم توسط نیازهای مشتری تعیین می شود و دستگاه دولتی دامنه آزمایش را آشکار می کند. با یک رویکرد کمتر سازماندهی شده، میزان آزمایش مورد نیاز ممکن است به همان اندازه چشمگیر باشد، اما شما به سادگی آن را نمی دانید.

استفاده از عبارات چاپی در کد شما بسیار راحت است که وضعیت فعلی و مقادیر سیگنال های ورودی و خروجی را نشان می دهد. این به شما امکان می‌دهد به راحتی آنچه را که قانون طلایی تست نرم‌افزار بیان می‌کند مشاهده کنید: بررسی کنید که برنامه کاری را که در نظر گرفته شده انجام می‌دهد، و همچنین اینکه هیچ کار غیرضروری انجام نمی‌دهد. به عبارت دیگر، آیا شما فقط خروجی هایی را که انتظار دارید دریافت می کنید و فراتر از آن چه اتفاقی می افتد؟ آیا انتقال حالت "دشوار" وجود دارد، به عنوان مثال. بیان می کند که به طور تصادفی تنها برای یک تکرار از حلقه عبور می کند؟ آیا زمانی که شما انتظار ندارید خروجی ها تغییر می کنند؟ در حالت ایده‌آل، خروجی پرینت‌اف‌های شما باید به‌طور محسوسی شبیه جدول انتقال حالت باشد.

در نهایت - و این در مورد هر نرم افزار تعبیه شده، نه فقط نرم افزار مبتنی بر ماشین دولتی - صدق می کند - اولین باری که نرم افزار را روی سخت افزار واقعی اجرا می کنید بسیار مراقب باشید. اشتباه گرفتن قطبیت سیگنال بسیار آسان است - "اوه، من فکر کردم 1 به معنای ارابه فرود بالا و 0 به معنای ارابه فرود پایین است." در بسیاری از موارد، دستیار سخت‌افزار من از یک "سوئیچ مرغ" موقت برای محافظت از اجزای ارزشمند استفاده می‌کند تا زمانی که مطمئن شود که نرم‌افزار من کارها را در جهت درست حرکت می‌دهد.

راه اندازی

وقتی تمام نیازهای مشتری برآورده شد، می توانم یک ماشین دولتی با پیچیدگی مشابه را در چند روز راه اندازی کنم. تقریباً همیشه ماشین ها کاری را که من می خواهم انجام می دهند. البته سخت ترین کار این است که بفهمیم مشتری دقیقا چه می خواهد و مطمئن شویم که مشتری خودش می داند چه می خواهد. دومی خیلی بیشتر طول می کشد!

مارتین گومز یک برنامه نویس در آزمایشگاه فیزیک کاربردی در دانشگاه جان هاپکینز است. درگیر توسعه نرم افزار برای پشتیبانی از پروازهای فضاپیماهای تحقیقاتی. 17 سال در زمینه توسعه سیستم های جاسازی شده کار کرد. مارتین دارای مدرک لیسانس علوم در مهندسی هوافضا و کارشناسی ارشد در مهندسی برق از دانشگاه کرنل است.

ماشین محدود: تئوری و پیاده سازی

ماشین حالت محدود مدلی انتزاعی است که شامل تعداد محدودی از حالات چیزی است. برای نمایش و کنترل جریان اجرای هر دستور استفاده می شود. ماشین حالت ایده آل برای پیاده سازی هوش مصنوعی در بازی ها، تولید یک راه حل منظم بدون نوشتن کدهای حجیم و پیچیده است. در این مقاله به تئوری نگاه خواهیم کرد و همچنین نحوه استفاده از یک ماشین حالت ساده و مبتنی بر پشته را یاد خواهیم گرفت.

ما قبلاً مجموعه ای از مقالات در زمینه نوشتن هوش مصنوعی با استفاده از ماشین حالت محدود منتشر کرده ایم. اگر هنوز این مجموعه را نخوانده اید، می توانید همین الان این کار را انجام دهید:

ماشین حالت محدود چیست؟

ماشین حالت محدود (یا به سادگی FSM - ماشین حالت محدود) یک مدل محاسباتی مبتنی بر ماشین حالت فرضی است. فقط یک ایالت می تواند در هر زمان فعال باشد. بنابراین، برای انجام هر عملی، ماشین باید حالت خود را تغییر دهد.

ماشین‌های حالت معمولاً برای سازماندهی و نمایش جریان اجرای چیزی استفاده می‌شوند. این به ویژه هنگام پیاده سازی هوش مصنوعی در بازی ها مفید است. به عنوان مثال، برای نوشتن "مغز" یک دشمن: هر دولت نشان دهنده نوعی عمل است (حمله، طفره رفتن، و غیره).

یک ماشین حالت محدود را می توان به عنوان یک نمودار نشان داد که رئوس آن حالت ها و یال ها انتقال بین آنها هستند. هر لبه دارای یک برچسب است که نشان می دهد چه زمانی انتقال باید رخ دهد. به عنوان مثال، در تصویر بالا می بینید که دستگاه حالت "سرگردان" را به حالت "حمله" تغییر می دهد، مشروط بر اینکه بازیکن در نزدیکی خود باشد.

دولت های برنامه ریزی و انتقال آنها

پیاده سازی یک ماشین حالت محدود با شناسایی حالات آن و انتقال بین آنها آغاز می شود. ماشین حالتی را تصور کنید که عملکرد مورچه ای را که برگ ها را به یک مورچه حمل می کند، توصیف می کند:

نقطه شروع حالت "برگ را پیدا کن" است که تا زمانی که مورچه برگ را پیدا کند فعال باقی می ماند. هنگامی که این اتفاق می افتد، وضعیت به "برو به خانه" تغییر می کند. همین حالت تا زمانی که مورچه ما به لانه مورچه نرسد فعال باقی خواهد ماند. پس از این، حالت دوباره به "یافتن برگ" تغییر می کند.

اگر حالت "پیدا کردن برگ" فعال باشد، اما نشانگر ماوس نزدیک مورچه باشد، وضعیت به "فرار کردن" تغییر می کند. هنگامی که مورچه در فاصله کافی ایمن از مکان نما ماوس قرار گرفت، وضعیت دوباره به "یافتن برگ" تغییر می کند.

لطفاً توجه داشته باشید که هنگام رفتن به خانه یا دور از خانه، مورچه از نشانگر ماوس نمی ترسد. چرا؟ اما به دلیل اینکه هیچ انتقال متناظری وجود ندارد.

پیاده سازی یک ماشین حالت محدود ساده

یک ماشین حالت محدود را می توان با استفاده از یک کلاس واحد پیاده سازی کرد. بیایید آن را FSM بنامیم. ایده این است که هر حالت را به عنوان یک روش یا تابع پیاده سازی کنیم. همچنین از ویژگی activeState برای تعیین وضعیت فعال استفاده خواهیم کرد.

کلاس عمومی FSM (var private activeState:function; // اشاره گر به وضعیت فعال عملکرد عمومی ماشین FSM() () تابع عمومی setState(state:function) :void (activState = state; ) به روز رسانی عملکرد عمومی() :void (اگر (activState!= null) (activState();))

هر حالت یک تابع است. علاوه بر این، به گونه ای که هر بار که فریم بازی به روز می شود، فراخوانی می شود. همانطور که قبلا ذکر شد، activeState یک اشاره گر به تابع حالت فعال ذخیره می کند.

متد update() کلاس FSM باید هر فریم بازی نامیده شود. و به نوبه خود عملکرد حالتی را که در حال حاضر فعال است فراخوانی می کند.

متد setState() وضعیت فعال جدید را تنظیم می کند. علاوه بر این، هر تابعی که حالتی از خودکار را تعریف می کند لزوماً به کلاس FSM تعلق ندارد - این باعث می شود کلاس ما جهانی تر شود.

با استفاده از ماشین دولتی

بیایید یک هوش مصنوعی مورچه ای را پیاده سازی کنیم. در بالا قبلاً مجموعه ای از حالات و انتقال بین آنها را نشان داده ایم. بیایید دوباره آنها را توضیح دهیم، اما این بار روی کد تمرکز می کنیم.

مورچه ما با کلاس Ant نشان داده می شود که دارای یک میدان مغزی است. این فقط یک نمونه از کلاس FSM است.

کلاس عمومی Ant (موقعیت var عمومی:Vector3D؛ سرعت var عمومی:Vector3D؛ مغز var عمومی:FSM؛ عملکرد عمومی Ant(posX:Number، posY:Number) ( position = new Vector3D(posX, posY); velocity = new Vector3D( -1، -1؛ brain = new FSM(); // با پیدا کردن یک برگ شروع کنید. brain.setState(findLeaf); ) /** * حالت "findLeaf". * مورچه را مجبور می کند به دنبال برگ بگردد. */ تابع عمومی findLeaf( ) :void ( ) /** * حالت "goHome". * باعث می شود مورچه به مورچه برود. */ تابع عمومی goHome() :void () /** * حالت "runAway". * نیروها مورچه از مکان‌نمای ماوس فرار می‌کند. * / تابع عمومی runAway() :void () تابع عمومی update():void ( // ماشین حالت را به‌روزرسانی کنید. این تابع تابع // حالت فعال را فراخوانی می‌کند: findLeaf() ، goHome() یا runAway(). brain.update(); // اعمال سرعت به حرکت مورچه. moveBasedOnVelocity(); ) (...) )

کلاس Ant همچنین دارای ویژگی های سرعت و موقعیت است. این متغیرها برای محاسبه حرکت با استفاده از روش اویلر استفاده خواهند شد. تابع update() هر بار که فریم بازی به روز می شود فراخوانی می شود.

در زیر پیاده‌سازی هر متد است که با findLeaf() شروع می‌شود - حالتی که مسئول یافتن برگ‌ها است.

تابع عمومی findLeaf() :void ( // مورچه را به برگ منتقل می کند. velocity = new Vector3D(Game.instance.leaf.x - position.x، Game.instance.leaf.y - position.y)؛ if (فاصله (بازی .instance.leaf، این)<= 10) { // Муравей только что подобрал листок, время // возвращаться домой! brain.setState(goHome); } if (distance(Game.mouse, this) <= MOUSE_THREAT_RADIUS) { // Курсор мыши находится рядом. Бежим! // Меняем состояние автомата на runAway() brain.setState(runAway); } }

وضعیت goHome() - برای وادار کردن مورچه به خانه استفاده می شود.

تابع عمومی goHome() :void ( // مورچه را به خانه منتقل می کند سرعت = new Vector3D(Game.instance.home.x - position.x، Game.instance.home.y - position.y)؛ if (distance( بازی. instance.home، این)<= 10) { // Муравей уже дома. Пора искать новый лист. brain.setState(findLeaf); } }

و در نهایت، حالت runAway () برای جاخالی دادن از مکان نما ماوس استفاده می شود.

تابع عمومی runAway() :void ( // مورچه را از سرعت مکان نما دور می کند = new Vector3D(position.x - Game.mouse.x, position.y - Game.mouse.y)؛ // آیا مکان نما هنوز نزدیک است ? if ( distance(Game.mouse, this) > MOUSE_THREAT_RADIUS) (// نه، از قبل دور است. وقت آن است که به جستجوی برگ برگردیم. brain.setState(findLeaf); ) )

بهبود FSM: خودکار مبتنی بر پشته

تصور کنید که مورچه ای در راه خانه باید از نشانگر ماوس فرار کند. حالت های FSM به این صورت است:

به نظر یک تغییر بی اهمیت است. خیر، این تغییر برای ما مشکل ایجاد می کند. تصور کنید که وضعیت فعلی "فرار" است. اگر نشانگر ماوس از مورچه دور شود، چه کاری باید انجام دهد: به خانه بروید یا به دنبال برگ بگردید؟

راه حل این مشکل یک ماشین حالت مبتنی بر پشته است. برخلاف FSM ساده ای که در بالا پیاده سازی کردیم، این نوع FSM از یک پشته برای مدیریت حالت ها استفاده می کند. در بالای پشته حالت فعال قرار دارد و زمانی که حالت ها از پشته اضافه یا حذف می شوند، انتقال رخ می دهد.

و در اینجا یک نمایش تصویری از عملکرد یک ماشین حالت مبتنی بر پشته است:


پیاده سازی FSM مبتنی بر پشته

چنین ماشین حالتی را می توان به همان روشی که یک ماشین ساده پیاده سازی کرد. تفاوت در استفاده از آرایه ای از اشاره گرها به حالت های مورد نیاز خواهد بود. ما دیگر به ویژگی activeState نیاز نداریم، زیرا بالای پشته قبلاً به حالت فعال اشاره می کند.

کلاس عمومی StackFSM ( var stack:Array؛ تابع عمومی StackFSM() ( this.stack = new Array() (currentStateFunction(); ) ) تابع عمومی popState() :function ( return stack.pop(); ) تابع عمومی pushState(state:function) :void ( if (getCurrentState() != حالت) (stack.push(state) ; ) ) تابع عمومی getCurrentState(): Function ( بازگشت stack.length > 0 ? stack : null; ) )

توجه داشته باشید که متد ()setState با pushState() (افزودن یک حالت جدید به بالای پشته) و popState() (حذف یک حالت در بالای پشته) جایگزین شده است.

استفاده از FSM مبتنی بر پشته

توجه به این نکته حائز اهمیت است که هنگام استفاده از یک ماشین حالت مبتنی بر پشته، هر حالت مسئول حذف شدن از پشته در زمانی که دیگر به آن نیاز نیست، می باشد. به عنوان مثال، اگر دشمن قبلاً نابود شده باشد، وضعیت ()attac باید خود را از پشته حذف کند.

کلاس عمومی Ant ( (...) public var brain:StackFSM؛ عملکرد عمومی Ant(posX:Number، posY:Number) ((...) brain = new StackFSM(); // با جستجوی مغز برگ شروع کنید. pushState( findLeaf); (...) ) /** * حالت "findLeaf". * مورچه را مجبور به جستجوی برگها می کند. */ تابع عمومی findLeaf() :void ( // مورچه را به برگ منتقل می کند. سرعت = جدید Vector3D(Game.instance. leaf.x - position.x، Game.instance.leaf.y - position.y); if (distance(Game.instance.leaf, this)<= 10) { //Муравей только что подобрал листок, время // возвращаться домой! brain.popState(); // removes "findLeaf" from the stack. brain.pushState(goHome); // push "goHome" state, making it the active state. } if (distance(Game.mouse, this) <= MOUSE_THREAT_RADIUS) { // Курсор мыши рядом. Надо бежать! // Состояние "runAway" добавляется перед "findLeaf", что означает, // что состояние "findLeaf" вновь будет активным при завершении состояния "runAway". brain.pushState(runAway); } } /** * Состояние "goHome". * Заставляет муравья идти в муравейник. */ public function goHome() :void { // Перемещает муравья к дому velocity = new Vector3D(Game.instance.home.x - position.x, Game.instance.home.y - position.y); if (distance(Game.instance.home, this) <= 10) { // Муравей уже дома. Пора искать новый лист. brain.popState(); // removes "goHome" from the stack. brain.pushState(findLeaf); // push "findLeaf" state, making it the active state } if (distance(Game.mouse, this) <= MOUSE_THREAT_RADIUS) { // Курсор мыши рядом. Надо бежать! // Состояние "runAway" добавляется перед "goHome", что означает, // что состояние "goHome" вновь будет активным при завершении состояния "runAway". brain.pushState(runAway); } } /** * Состояние "runAway". * Заставляет муравья убегать от курсора мыши. */ public function runAway() :void { // Перемещает муравья подальше от курсора velocity = new Vector3D(position.x - Game.mouse.x, position.y - Game.mouse.y); // Курсор все еще рядом? if (distance(Game.mouse, this) >MOUSE_THREAT_RADIUS) (// نه، از قبل دور است. وقت آن است که به جستجوی برگ ها برگردیم. brain.popState(); ) ) (...) )

نتیجه

ماشین های حالت مطمئنا برای پیاده سازی منطق هوش مصنوعی در بازی ها مفید هستند. آنها را می توان به راحتی به عنوان یک نمودار نشان داد و به توسعه دهنده اجازه می دهد تمام گزینه های ممکن را ببیند.

پیاده سازی یک ماشین حالت با توابع حالت یک تکنیک ساده و در عین حال قدرتمند است. حتی بافت های حالت پیچیده تری را می توان با استفاده از FSM پیاده سازی کرد.

نتیجه عملکرد دستگاه با وضعیت نهایی آن مشخص می شود.

گزینه های مختلفی برای تعیین یک ماشین حالت محدود وجود دارد. به عنوان مثال، یک ماشین حالت را می توان با استفاده از پنج پارامتر مشخص کرد: , جایی که:

ماشین در حالت q 0 شروع به کار می کند و هر بار یک کاراکتر را از رشته ورودی می خواند. نماد خواندن ماشین را مطابق با تابع انتقال از Q به حالت جدیدی منتقل می کند. اگر پس از اتمام خواندن کلمه ورودی (زنجیره ای از نمادها)، خودکار در یکی از حالت های پذیرنده باشد، آنگاه کلمه توسط خودکار "پذیرفته شده است". در این مورد، گفته می شود که متعلق به زبان خودکار داده شده است. در غیر این صورت کلمه "رد" است.

ماشین‌های حالت به طور گسترده در عمل مورد استفاده قرار می‌گیرند، مانند تجزیه‌کننده‌ها، تحلیلگرهای واژگانی و تست نرم‌افزار مبتنی بر مدل.

راه های دیگر توصیف

  1. نمودار حالت (یا گاهی اوقات نمودار انتقال) - نمایش گرافیکی مجموعه ای از حالت ها و توابع انتقال. این یک نمودار یک طرفه بارگذاری شده است که رئوس آن حالت های فضاپیما، یال ها انتقال از یک حالت به حالت دیگر و نمادهایی هستند که این انتقال در آنها رخ می دهد. اگر انتقال از حالت q1 به q2 را بتوان با ظاهر شدن یکی از آنها انجام داد چندیننمادها، سپس همه آنها باید در بالای قوس نمودار (شاخه نمودار) درج شوند.
  2. جدول انتقال- نمایش جدولی تابع δ. به طور معمول، در چنین جدولی، هر ردیف مربوط به یک حالت و هر ستون مربوط به یک نماد ورودی معتبر است. در سلولی که در محل تقاطع سطر و ستون قرار دارد، عملی که ماشین باید انجام دهد در صورتی نوشته می‌شود که در موقعیتی که در یک وضعیت معین قرار داشت، نمادی را در ورودی دریافت کند.

جبرگرایی

ماشین های محدود به دو دسته قطعی و غیر قطعی تقسیم می شوند.

ماشین حالت محدود قطعی

  • یک خودکار محدود قطعی (DFA) خودکاری است که در آن برای هر دنباله از نمادهای ورودی تنها یک حالت وجود دارد که خودکار می تواند از حالت فعلی به آن برود.
  • یک خودکار محدود غیر قطعی (NFA) تعمیم یک خودکار قطعی است. عدم قطعیت خودکارها از دو طریق حاصل می شود:
انتقال هایی وجود دارد که با یک زنجیره خالی ε مشخص شده اند چندین انتقال، که با یک نماد مشخص شده اند، از یک حالت ظاهر می شوند

اگر موردی را در نظر بگیریم که ماشین به صورت زیر مشخص شده است: ، جایی که:

سپس سومین علامت عدم قطعیت ظاهر می شود - وجود چندین حالت اولیه (شروع) خودکار.

قضیه ای وجود دارد که می گوید: "هر خودکار متناهی غیر قطعی را می توان به یک خودکار قطعی تبدیل کرد تا زبان آنها منطبق شوند" (این خودکارها معادل نامیده می شوند). با این حال، از آنجایی که تعداد حالت‌ها در یک DFA معادل در بدترین حالت به صورت تصاعدی با تعداد حالت‌های DFA اصلی افزایش می‌یابد، در عمل چنین تعیینی همیشه ممکن نیست. علاوه بر این، ماشین‌های حالت محدود با خروجی معمولاً قابل تعیین نیستند.

با توجه به دو نکته آخر، علیرغم پیچیدگی بیشتر خودکارهای متناهی غیر قطعی، NFA ها عمدتاً برای کارهای مربوط به پردازش متن استفاده می شوند.

خودکار و زبان های معمولی

برای یک خودکار، می توان یک زبان (مجموعه ای از کلمات) را با الفبای Σ تعریف کرد است- اینها نام کلمات هستند، وقتی وارد می شوند، ماشین از حالت اولیه به یکی از حالت های مجموعه F می رود.

زبان های برنامه نویسی تخصصی

  • زبان نمودار توابع متوالی (SFC) یک زبان برنامه نویسی گرافیکی است که به طور گسترده برای برنامه نویسی کنترل کننده های منطق صنعتی (PLC) استفاده می شود.

در SFC، یک برنامه به عنوان یک توالی شماتیک از مراحل به هم مرتبط با انتقال توصیف می شود.

توسعه مدل با استفاده از ماشین های حالت محدود

ماشین‌های محدود ساخت مدل‌هایی از سیستم‌های پردازش موازی را ممکن می‌سازند؛ اما برای تغییر تعداد فرآیندهای موازی در چنین مدلی، لازم است تغییرات قابل توجهی در خود مدل ایجاد شود. علاوه بر این، تلاش برای توسعه یک مدل پیچیده روی یک ماشین حالت محدود منجر به افزایش سریع تعداد حالت‌های ماشین می‌شود که در نهایت توسعه چنین مدلی را به یک کار بسیار خسته‌کننده تبدیل می‌کند. همانطور که در بالا ذکر شد، آخرین مشکل را می توان با استفاده از یک خودکار غیر قطعی حل کرد.

یادداشت

همچنین ببینید

  • منطق ترتیبی (منطق ترتیبی)

پیوندها

  • تئوری اتوماتا / E. A. Yakubaitis، V. O. Vasyukevich، A. Yu. Gobzemis، N. E. Zaznova، A. A. Kurmit، A. A. Lorenz، A. F. Petrenko، V. P. Chapenko // نظریه احتمال. آمار ریاضی سایبرنتیک نظری. - M.: VINITI، 1976. - T. 13. - P. 109-188. - URL http://www.mathnet.ru/php/getFT.phtml?jrnid=intv&paperid=28&what=fullt&option_lang=rus
  • استفاده از ماشین های حالت محدود برای حل مسائل اتوماسیون
  • نمونه ای از پیاده سازی ماشین حالت محدود در پایتون برای چارچوب جنگو

بنیاد ویکی مدیا 2010.

  • کینز، جان مینارد
  • نمودار حالت (نظریه خودکار)

ببینید «ماشین حالت محدود» در فرهنگ‌های دیگر چیست:

    ماشین حالت- مدل محاسباتی CA که یک خودکار را با تعداد محدودی از حالت ها توصیف می کند. CA به طور گسترده در برنامه نویسی استفاده می شود، به عنوان مثال، در تجزیه و تحلیل واژگانی کامپایلرها. مشخصات توالی ماشین حالت محدود... ...

    ماشین حالت- مدل ریاضی دستگاه با حافظه محدود. یک ماشین حالت، تعداد زیادی سیگنال ورودی گسسته را به تعداد زیادی سیگنال خروجی پردازش می کند. ماشین های حالت محدود همزمان و ناهمزمان وجود دارد. به انگلیسی: ماشین حالت محدود ببینید... فرهنگ لغت مالی

    ماشین حالت- baigtinis automatas statusas T sritis automatika atitikmenys: engl. خودکار محدود؛ ماشین حالت محدود vok. endlicher Automat, m; Finalautomat, m rus. ماشین حالت محدود، m pranc. نهایی خودکار، m; فینی خودکار، m; ترمینال خودکار، m;… … Automatikos Terminų žodynas

    ماشین حالت محدود- خودکاری که حالت های زیادی دارد و همچنین سیگنال های ورودی و خروجی زیادی دارد، متناهی هستند. K. a. ممکن است یک مدل فنی باشد. دستگاه ها (کامپیوتر، دستگاه رله) یا بیول. سیستم ها (سیستم عصبی ایده آل حیوانات). مهم... ... فرهنگ لغت بزرگ دایره المعارفی پلی تکنیک

    ماشین حالت مدولار- - [Ya.N.Luginsky، M.S.Fezi Zhilinskaya، Yu.S.Kabirov. فرهنگ لغت انگلیسی-روسی مهندسی برق و مهندسی قدرت، مسکو، 1999] موضوعات مهندسی برق، مفاهیم اساسی EN خودکار مدولار محدود ... راهنمای مترجم فنی

    دستگاه حالت در دسترس بودن- (ITU T Y.1711). موضوعات: ارتباطات راه دور، مفاهیم اساسی EN در دسترس بودن وضعیت ماشینASM... راهنمای مترجم فنی

    دستگاه حالت با حافظه- ماشین حالت محدود با حافظه یک مدل ریاضی از دستگاهی است که رفتار آن هم به شرایط ورودی و هم به حالت قبلی بستگی دارد. برای توصیف یک خودکار متناهی با حافظه، از زبان طرح های عملگر، معمولی... ... ویکی پدیا استفاده می شود.

    ماشین حالت محدود قطعی- - [Ya.N.Luginsky، M.S.Fezi Zhilinskaya، Yu.S.Kabirov. فرهنگ لغت انگلیسی-روسی مهندسی برق و مهندسی قدرت، مسکو، 1999] مباحث مهندسی برق، مفاهیم اساسی EN خودکار قطعی محدود ... راهنمای مترجم فنی

    دستگاه مور- (اتومات از نوع دوم) در تئوری محاسبات، یک خودکار متناهی، مقدار خروجی سیگنال که در آن فقط به وضعیت فعلی خودکار معین بستگی دارد و به طور مستقیم، بر خلاف خودکار Mealy، به مقادیر ورودی خودکار مور به نام ... ویکی پدیا

الفبا: برای i=1، ...، n. تعداد حروف این دنباله نامیده می شود طولکلمات و با |w| نشان داده می شود . یک کلمه "خالی" ویژه به طول 0 وجود دارد. ما آن را با کلمه نشان خواهیم داد، عملیات اختصاص یک کلمه پس از دیگری تعریف می شود که به آن الحاق می گویند: اگر کلمه w =w 1 ... w n و کلمه v =v 1 ... v m، سپس الحاق آنها کلمه w 1 ... w n v 1 ... v m به طول n+m است. معمولاً علامت الحاق را حذف می کنیم و به سادگی w v می نویسیم (بر اساس قیاس با علامت ضرب در جبر). کلمه خالی تنها کلمه ای است که برای هر کلمه ای برابر است. عمل الحاق تداعی کننده است: برای هر سه کلمه w، v و u، بدیهی است که برابری برقرار است: (w v)u = w(v u) . بنابراین هنگام نوشتن الحاق چند کلمه از پرانتز صرف نظر می کنیم. برای نشان دادن چند الحاق یک کلمه، از علامت اختصاری "power form" استفاده کنید: . به عنوان مثال، a 3 b 4 c 2 یک نسخه کوتاه از aaabbbbcc است.

یک زبان در یک الفبا مجموعه ای دلخواه از کلمات در این الفبا است. ما زبانی را که شامل تمام کلمات الفبا (از جمله کلمه خالی) می شود با .

ماشین های حالت محدود اغلب برای تعیین ویژگی های خاص کلمات استفاده می شوند، به عنوان مثال. برای تشخیص زبان: خودکاری که یک زبان خاص L را تشخیص می‌دهد، باید با دادن کلمه دلخواه w به سؤال «؟» پاسخ دهد. برای حل چنین مشکلی، عملکرد خروجی را می توان با بررسی وضعیت دستگاه پس از دریافت کلمه ورودی w - "پذیرش" یا "رد کردن" جایگزین کرد.

تعریف 4.3. خودکار محدود قطعی (DFA) - شناساگر - یک سیستم از فرم است

شامل اجزای زیر:

تابع فراخوانی می شود برنامهخودکار A و به عنوان لیستی از m n مشخص شده است تیم هانوع .

همچنین تعریف یک تابع با استفاده از جدول با اندازه n x m که در بالا توضیح داده شد، که ردیف‌های آن با حالت‌های Q و ستون‌ها به نمادها از Q مطابقت دارند، راحت است. الفبای ورودیو در آن در تقاطع سطر q i و ستون a j حالتی وجود دارد.

پسندیدن مبدل های اتوماتیک، خودکارهای شناسایی را می توان با استفاده از نمودارهای جهت دار برچسب دار به نام نمودار نشان داد.

تعریف 4.4. نمودار DKAیک گراف جهت دار (چند) D A =(Q, E) با لبه های برچسب دار است که در آن یک راس انتخاب شده است - حالت اولیه q 0 از هر راس یال هایی با نمادها وجود دارد، به طوری که برای هر نماد یک یال از q تا راس وجود دارد. با برچسب a.

فرض کنید مسیر p=e 1 e 2 ... e t که با دنباله ای از یال ها در نمودار نشان داده شده است حاوی کلمه w=w 1 w 2 ... w t است اگر w i برچسب لبه e i باشد (1 >= i >= t) . اگر q راس (وضعیت) اولیه این مسیر و q" راس نهایی آن باشد، خواهیم گفت که کلمه w q را به q ترجمه می کند.

کار تشخیص ماشین حالت محدودشامل خواندن کلمه ورودی و تغییر حالت بسته به نمادهای آن است.

تعریف 4.5. بیا تماس بگیریم پیکربندی DKAیک جفت دلخواه از شکل (q, w) که در آن و .

در مجموعه ای از تنظیمات، رابطه انتقال را در یک مرحله معرفی می کنیم:

اگر، سپس برای هر یک قرار دهید: .

بیایید انعکاسی و را نشان دهیم بسته شدن گذرا .

به این معنی که خودکار A در حالت q روی کلمه w=w 1 ... w l بعد از تعداد محدودی از مراحل 0 شروع به کار می کند.<= k <= l прочтет первые k символов слова w и перейдет в состояние q" , а w" =w k+1 ... w l - это непрочтенный остаток слова w .

تعریف 4.6. DFA A کلمه w را برای برخی تشخیص می دهد (می پذیرد، می پذیرد).

آن ها پس از پردازش کلمه w، دستگاه به حالت دریافت کننده می رود.

زبان L A, شناسایی (مجاز، پذیرفته شده) توسط یک ماشین خودکار A، شامل تمام کلمات شناخته شده توسط این دستگاه است.