Недетерминированные конечные автоматы — различия между версиями
(дописано куча всего) |
(fix) |
||
| Строка 61: | Строка 61: | ||
* <tex> R(\alpha c) = \lbrace q | q \in \delta(p, c), p \in R(\alpha) \rbrace </tex>, | * <tex> R(\alpha c) = \lbrace q | q \in \delta(p, c), p \in R(\alpha) \rbrace </tex>, | ||
так как | так как | ||
| − | * <tex> \langle s, \alpha \rangle \vdash^* \langle p, \varepsilon \rangle \Rightarrow \langle s, \alpha c \rangle \vdash^* \langle p, c \rangle \vdash \langle q, \varepsilon \rangle \Rightarrow \langle s, \alpha c \rangle \vdash^* \langle q, \varepsilon \rangle </tex>, | + | * <tex> \langle s, \alpha \rangle \vdash^* \langle p, \varepsilon \rangle \Rightarrow \langle s, \alpha c \rangle \vdash^* \langle p, c \rangle \vdash \langle q, \varepsilon \rangle \Rightarrow \langle s, \alpha c \rangle \vdash^* \langle q, \varepsilon \rangle </tex>, <tex> \forall q \in \delta(p, c) </tex> |
Теперь, когда мы научились добавлять символ к строке, возьмем <tex> R(\varepsilon) </tex>, будем добавлять <tex> w_1, w_2 \ldots w_{|w|} </tex> и находить для каждого <tex> R(w_1\ldots w_k) </tex>. | Теперь, когда мы научились добавлять символ к строке, возьмем <tex> R(\varepsilon) </tex>, будем добавлять <tex> w_1, w_2 \ldots w_{|w|} </tex> и находить для каждого <tex> R(w_1\ldots w_k) </tex>. | ||
Версия 01:49, 14 ноября 2011
| Определение: |
| Недетерминированный конечный автомат (НКА) — это пятерка , где — алфавит, — множество состояний автомата, — начальное состояние автомата, — множество допускающих состояний автомата, — функция переходов. Таким образом единственное отличие НКА от ДКА — это существование нескольких переходов по одному символу из одного состояния. |
Содержание
Процесс допуска
| Определение: |
| Мгновенная кофигурация — это пара , , |
Определим некоторые операции для мгновенных конфигураций.
| Определение: |
Говорят, что выводится за один шаг из , если:
|
| Определение: |
| Говорят, что выводится за ноль и более шагов из , если :
|
| Определение: |
| НКА допускает слово , если . |
Менее формально это можно описать так: НКА допускает слово , если существует путь из начального состояния в какое-то терминальное, такое что буквы, выписанные с переходов на этом пути по порядку, образуют слово .
Язык автомата
| Определение: |
| Множество слов, допускаемых автоматом , называется языком НКА .
|
Язык НКА тоже является автоматным языком, так как можно построить из НКА эквивалентный ДКА, поэтому вычислительная мощность этих двух автоматов совпадает.
Пример
Автомат, допускающий слова над алфавитом из символов 0 и 1, допускающий слова оканчивающиеся на 0101.
(0|1)*0101
Алгоритм определяющий допустимость автоматом слова
По сравнению с ДКА, определять допускает ли НКА слово сложнее, так как из состояния теперь есть несколько переходов по букве и выбрать случайный переход нельзя. Поступим по-другому, определим множество всех достижимых состояний из стартового по слову .
Пусть нам нужно определить допускает ли НКА слово . Заметим, что если , то слово допускается, так как по определению . Алгоритм состоит в том, чтобы построить .
Очевидно, что . Пусть мы построили , как же получить , где . Заметим, что
- ,
так как
- ,
Теперь, когда мы научились добавлять символ к строке, возьмем , будем добавлять и находить для каждого .
Когда мы получим , проверим что в нем есть терминальное состояние.
Псевдокод:
for i = 1 to length(w) do for do accepts = False for do if () then accepts = True
