Симулация на недетерминиран автомат
Ако имаме недетерминиран автомат и искаме да разберем дали приема дадена дума, можем да преобразуваме автомата в детерминиран, можем да го опитаме по някакъв начин или можем да използваме алгоритъм, който ще симулира работата на НКА.
Принцип на алгоритъма
Принципа ще покажем нагледно на подходящ пример. Нека имаме този автомат:
Това е недетерминиран краен автомат, който приема някакъв език. В момента изобщо не е нужно да се интересуваме какъв. Ще покажем как може да изглежда изчислението на такъв автомат за входната дума 11001. Идеята е такава: обработваме символ от думата и гледаме къде можем да отидем благодарение на няколкото прехода за един и същ символ. Запомняме всички тези състояния и в следващата стъпка вече приемаме, че сме „във всички тези състояния едновременно“, и ни интересува накъде можем да продължим от тези състояния.
Така ще помним множество от състояния, в които можем да се намираме, и непрочетената част от думата. В началото следователно имаме двойката ⟨{q0}, 11001⟩. Започваме в състоянието q0 (начално състояние) и на входа е думата 11001. Автоматът изглежда така, в червено и с удебелен шрифт е откроено състоянието, в което се намираме:
Първият символ е 1, от състоянието q0 има само един преход за символа 1, така че стигаме до състоянието q1. Запомняме двойката ⟨{q1}, 1001⟩. Автоматът изглежда така:
Продължаваме нататък. Непрочетената част от думата е 1001, така че отново търсим преходи за 1. Те вече са два — обратно към състоянието q0 и към състоянието q3. Сега ще тръгнем към двете състояния едновременно. Запомняме двойката ⟨{q0, q3}, 001⟩.
Каква е логиката на това? Знаем, че съществува път, по който от началното състояние с думата 11 можем да стигнем както до състоянието q3, така и до състоянието q0. Все още не знаем кой клон ще ни влезе в работа, затова просто запомняме и двата. Продължаваме нататък. На входа имаме символа 0. Сега трябва да гледаме както преходите от q0, така и преходите от q3. От състоянието q0 водят преходи към състоянията q1 и q2, от състоянието q3 води преход обратно към q1. Отчитаме всички тези състояния, с което получаваме двойката ⟨{q1, q2}, 01⟩:
В тази стъпка обаче още не сме свършили. Виждаме, че от състоянието q2 води ε-преход към състоянието q4. Знаем, че по ε-преход можем да „минем по всяко време“, без да четем следващ знак. С други думи — без да прочетем следващия символ от входната дума, можем още да преминем в състоянието q4. Добавяме следователно състоянието q4 към състоянията, в които можем да се намираме: ⟨{q1, q2, q4}, 01⟩. Автоматът бихме оцветили така:
Нататък на входа е 0. Гледаме накъде можем да преминем от трите състояния, в които сме. От q1 не можем да преминем никъде, защото липсва преход за 0. Изчислението в този клон свършва. От състоянието q4 също не стигаме никъде. От състоянието q2 стигаме обратно до състоянието q2. Но тъй като от състоянието q2 отново води ε-преход към състоянието q4, можем да стигнем и до състоянието q4. От множеството състояния {q1, q2, q4} за символа 0 следователно можем да стигнем до множеството състояния {q2, q4}, получаваме двойката ⟨{q2, q4}, 1⟩:
Накрая на входа е символът 1. От състоянието q2 не стигаме никъде, изчислението в този клон свършва. От състоянието q4 обаче стигаме до състоянията q3 и q5. Получаваме двойката ⟨{q3, q5}, ε⟩:
Автоматът вече е прочел цялата дума и „се намира“ в две състояния: q3, q5. Тъй като поне едно от тях е крайно състояние, автоматът приема думата 11001.
Алгоритъм
Първо ни трябва функция, която приема като параметър множество от състояния и пресмята до кои състояния можем да стигнем още с помощта на ε-преходи. Входът следователно е автоматът ⟨Q, Σ, δ, q0, F⟩ и множеството от състояния States, а изходът е надмножество на тези състояния, до което се стига с помощта на ε-преходи. Тази операция ще наричаме ε-затваряне на множеството States.
Тази функция ще използваме във функция, която ще симулира работата на недетерминирания автомат. Входът е автоматът, входната дума w = w1w2… wn и множеството от състояния, в които автоматът се намира в момента. Изходът е отговор Да или Не, според това дали автоматът приема, или не приема дадената дума.
Ако искаме да проверим дали автоматът приема думата w, извикваме функцията така: ComputeNFA(⟨Q, Σ, δ, q0, F⟩, w, EpsilonClosure(⟨Q, Σ, δ, q0, F⟩, {q0})).
Източници
Глави: Краен автомат, Тотален автомат, Недетерминиран краен автомат, Симулация на недетерминиран автомат, Преобразуване на НКА в ДКА