Недетерминированные конечные автоматы — различия между версиями
(дописано куча всего) |
|||
Строка 8: | Строка 8: | ||
{{Определение | {{Определение | ||
|definition = | |definition = | ||
− | '''Мгновенная кофигурация''' {{---}}}} | + | '''Мгновенная кофигурация''' {{---}} это пара <tex> \langle p, q \rangle </tex>, <tex> p \in Q </tex>, <tex> q \in \Sigma^*</tex>}} |
− | + | ||
− | + | Определим некоторые операции для мгновенных конфигураций. | |
− | + | {{Определение | |
− | + | |definition = | |
− | + | Говорят, что <tex> \langle p, \beta \rangle</tex> '''выводится за один шаг''' из <tex>\langle q, \alpha \rangle </tex>, если: | |
+ | * <tex>\alpha = c\beta</tex> | ||
+ | * <tex>p \in \delta (q, c)</tex>. | ||
+ | Это также записывают так: <tex>\langle q, \alpha \rangle \vdash \langle p, \beta \rangle</tex> | ||
+ | }} | ||
+ | |||
+ | {{Определение | ||
+ | |definition = | ||
+ | Говорят, что <tex> \langle p, \beta \rangle</tex> '''выводится за ноль и более шагов''' из <tex>\langle q, \alpha \rangle </tex>, если <tex>\exists n</tex>: | ||
+ | * <tex>\langle q, c_1 c_2 c_3 ...c_n\beta \rangle \vdash \langle u_1, c_2 c_3 ...c_n\beta \rangle \vdash \langle u_2, c_3 ...c_n\beta \rangle ...\vdash \langle u_{n-1}, c_n\beta \rangle \vdash \langle p, \beta \rangle</tex> | ||
+ | Это также записывают так: <tex>\langle q, \alpha \rangle \vdash^* \langle p, \beta \rangle</tex> | ||
+ | }} | ||
+ | |||
+ | {{Определение | ||
+ | |definition = | ||
+ | НКА '''допускает''' слово <tex>\alpha</tex>, если <tex>\exists t \in T: \langle s, \alpha \rangle \vdash^* \langle t, \varepsilon \rangle</tex>. | ||
+ | }} | ||
+ | |||
+ | Менее формально это можно описать так: НКА допускает слово <tex> \alpha </tex>, если существует путь из начального состояния в какое-то терминальное, такое что буквы, выписанные с переходов на этом пути по порядку, образуют слово <tex> \alpha </tex>. | ||
− | |||
− | |||
== Язык автомата == | == Язык автомата == | ||
+ | {{Определение | ||
+ | |definition = | ||
+ | Множество слов, допускаемых автоматом <tex> \mathcal{A} </tex>, называется '''языком НКА''' <tex> \mathcal{A} </tex>. | ||
+ | * <tex> \mathcal{L}(\mathcal{A}) = \lbrace w | \exists t \in T : \langle s, w \rangle \vdash^* \langle t, \varepsilon \rangle \rbrace </tex> | ||
+ | }} | ||
+ | Язык НКА тоже является автоматным языком, так как можно [[Построение по НКА эквивалентного ДКА, алгоритм Томпсона|построить из НКА эквивалентный ДКА]], поэтому вычислительная мощность этих двух автоматов совпадает. | ||
== Пример == | == Пример == | ||
Строка 28: | Строка 50: | ||
[[Файл:NKA_1.jpg]] | [[Файл:NKA_1.jpg]] | ||
− | == | + | == Алгоритм определяющий допустимость автоматом слова == |
+ | |||
+ | По сравнению с ДКА, определять допускает ли НКА слово сложнее, так как из состояния теперь есть несколько переходов по букве и выбрать случайный переход нельзя. | ||
+ | Поступим по-другому, определим множество всех достижимых состояний из стартового по слову <tex> \alpha </tex>. | ||
+ | * <tex> R(\alpha) = \lbrace p | \langle s, \alpha \rangle \vdash^* \langle p, \varepsilon \rangle \rbrace </tex> | ||
− | + | Пусть нам нужно определить допускает ли НКА слово <tex> w </tex>. Заметим, что если <tex> \exists t \in T : t \in R(w) </tex>, то слово допускается, так как <tex> \langle s, w \rangle \vdash^* \langle t, \varepsilon \rangle </tex> по определению <tex> R(w) </tex>. Алгоритм состоит в том, чтобы построить <tex> R(w) </tex>. | |
+ | |||
+ | Очевидно, что <tex> R(\varepsilon) = \lbrace s \rbrace </tex>. Пусть мы построили <tex> R(\alpha) </tex>, как же получить <tex> R(\alpha c)</tex>, где <tex> c \in \Sigma </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> 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(w) </tex>, проверим что в нем есть терминальное состояние. | ||
+ | Псевдокод: | ||
+ | <font size = 3> | ||
+ | <tex> R_0 = \lbrace s \rbrace </tex> | ||
+ | for i = 1 to length(w) do | ||
+ | <tex> R_i = \varnothing </tex> | ||
+ | for <tex> p \in R_{i - 1} </tex> do | ||
+ | <tex> R_i = R_i \cup \delta(p, w_i) </tex> | ||
+ | accepts = False | ||
+ | for <tex> t \in T </tex> do | ||
+ | if (<tex> t \in R_{|w|} </tex>) then | ||
+ | accepts = True | ||
+ | </font> | ||
== См. также == | == См. также == | ||
* [[Детерминированные конечные автоматы]] | * [[Детерминированные конечные автоматы]] |
Версия 01:47, 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