Двусторонний детерминированный конечный автомат — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Пример)
Строка 15: Строка 15:
 
== Описание ==
 
== Описание ==
 
Зафиксируем <tex>x \in \Sigma^*</tex>, где <tex>x = a_1 a_2 a_3 \dots a_n</tex>. Пусть <tex>a_0 = L</tex> и <tex>a_{n+1}=R</tex>. Тогда <tex>a_0 a_1 a_2 \dots a_n a_{n+1} = L x R</tex>.
 
Зафиксируем <tex>x \in \Sigma^*</tex>, где <tex>x = a_1 a_2 a_3 \dots a_n</tex>. Пусть <tex>a_0 = L</tex> и <tex>a_{n+1}=R</tex>. Тогда <tex>a_0 a_1 a_2 \dots a_n a_{n+1} = L x R</tex>.
 +
 +
Пусть дан 2ДКА <tex>A = \langle \Sigma , Q, L, R, s, t, r, \delta \rangle</tex> с <tex>n</tex> состояниями. Тогда можно построить ДКА, распознающий язык тот же язык, с <tex>O(e^n)</tex> состояниями.
 +
 +
Для доказательства приведем ход построения требуемого автомата <tex>B = \langle \Sigma , Q, s \in Q, T \subset Q, \delta : Q \times \Sigma \to Q \rangle</tex>.
 +
 +
== Регулярность языков ==
 +
Рассмотрим длинную входную строку <tex>w_1</tex> и разобьем на две подстроки <tex>w_1=xz</tex>. Так как у нас наш автомат может производить чтение в любом направлении, то граница <tex>x</tex> и <tex>z</tex> может быть пересечена несколько раз. Каждый раз, когда автомат пересекает границу справа налево (то есть из <tex>z</tex> в <tex>x</tex>), он выходит из состояния <tex>q</tex>. Когда пересечение происходит снова слева направо (если оно вообще происходит), то автомат выходит из состояния <tex>p</tex>. Теперь, если 2ДКА перейдет в <tex>x</tex> в состояние <tex>q</tex> заново, то он снова может появиться в состоянии <tex>p</tex>. Более того, состояние <tex>p</tex> зависит исключительно от <tex>q</tex> и <tex>x</tex>. Обозначим такое отношение через записать <tex>T_x(q) = p</tex>. Мы может записать все такие отношения в виде конечной таблицы <tex>T_x : Q \cup \{d\} \to Q \cup \{h\}</tex>, где <tex>Q</tex> {{---}} множество состояний 2ДКА, а <tex>d</tex> и <tex>h</tex> будут описаны ниже.
 +
 +
На входной строке <tex>xz</tex> 2ДКА начнет чтение с левого маркера конца строки. В процессе работы автомата позиция чтения будет меняться. В конце концов это позиция пересечет слева направо границу между <tex>x</tex> и <tex>z</tex>. В первый раз, когда это произойдет в каком-нибудь состоянии <tex>T_x(d)</tex> (для этого мы и выделили <tex>d</tex>). Так же автомат может никогда не выйти из <tex>x</tex>. В таком случае мы запишем <tex>T_x(d) = h</tex>. Состояние <tex>T_x(d)</tex> дает немного информации о <tex>x</tex>, но только конечное количество, поскольку существует только конечное количество вариантов для <tex>T_x(d)</tex>. Отметим, что <tex>T_x(d)</tex> зависит только от <tex>x</tex> и не зависит от <tex>z</tex>. Если на вход подавалась строка <tex>xw</tex> вместо <tex>xz</tex>, то в таком случае при пересечении границы из <tex>x</tex> в <tex>w</tex> автомат также был бы в состоянии <tex>T_x(d)</tex>, потому что его значение до того момента определялось только <tex>x</tex> и до тех пор не все, что находится справа от границы никак не влияет.
 +
 +
Если <tex>T_x(d) = h</tex>, то 2ДКА должен быть в бесконечном цикле внутри <tex>x</tex> и никогда не допустит или отвергнет входную строку.
 +
 +
Предположим, что 2ДКА переходит из <tex>x</tex> в <tex>z</tex> и спустя время перейти обратно в состояние <tex>q</tex>. Если это происходит, то потом:
 +
* либо снова произойдет переход из <tex>x</tex> в некоторое состояние <tex>p</tex>. В таком случае мы определим <tex>T_x(q)=p</tex>.
 +
* либо никогда не перейдет. В таком случае <tex>T_x(q) = h</tex>.
 +
 +
Ещё раз отметим, что <tex>T_x(q)</tex> зависит только от <tex>x</tex> и <tex>q</tex> и не зависит от <tex>z</tex>.
  
 
== Пример ==
 
== Пример ==

Версия 23:50, 9 января 2015

Определение:
Двусторонний детерминированный конечный автомат (2ДКА) (англ. Two-way deterministic finite automaton (2DFA)) — набор из восьми элементов [math]\langle \Sigma , Q, L, R, s, t, r, \delta \rangle[/math], где [math]\Sigma[/math] — алфавит (англ. alphabet), [math]Q[/math] — множество состояний (англ. finite set of states), [math]L \notin \Sigma[/math] — левый маркер конца строки, [math]R \notin \Sigma[/math] — правый маркер конца строки, [math]s \in Q[/math] — начальное (стартовое) состояние (англ. start state), [math]t \in Q[/math] — допускающее состояние (англ. accept state), [math]r \in Q[/math] — отвергающее состояние (англ. reject state), [math]\delta : Q \times \{\Sigma \cup \{L, R\}\} \to Q \times \{left, right\}[/math] — функция переходов (англ. transition function).

Также должны быть удовлетворены следующие условия:

[math]\forall q \in Q[/math]

  • [math]\delta(q, L) = (u, right)[/math] для некоторого [math]u \in Q[/math],
  • [math]\delta(q, R) = (v, left)[/math] для некоторого [math]v \in Q[/math],

и [math]\forall b \in \Sigma \cup \{L\}[/math]

  • [math]\delta(t, b) = (t, right)[/math],
  • [math]\delta(r, b) = (r, right)[/math],
  • [math]\delta(t, R) = (t, left)[/math],
  • [math]\delta(r, R) = (r, left)[/math].

Описание

Зафиксируем [math]x \in \Sigma^*[/math], где [math]x = a_1 a_2 a_3 \dots a_n[/math]. Пусть [math]a_0 = L[/math] и [math]a_{n+1}=R[/math]. Тогда [math]a_0 a_1 a_2 \dots a_n a_{n+1} = L x R[/math].

Пусть дан 2ДКА [math]A = \langle \Sigma , Q, L, R, s, t, r, \delta \rangle[/math] с [math]n[/math] состояниями. Тогда можно построить ДКА, распознающий язык тот же язык, с [math]O(e^n)[/math] состояниями.

Для доказательства приведем ход построения требуемого автомата [math]B = \langle \Sigma , Q, s \in Q, T \subset Q, \delta : Q \times \Sigma \to Q \rangle[/math].

Регулярность языков

Рассмотрим длинную входную строку [math]w_1[/math] и разобьем на две подстроки [math]w_1=xz[/math]. Так как у нас наш автомат может производить чтение в любом направлении, то граница [math]x[/math] и [math]z[/math] может быть пересечена несколько раз. Каждый раз, когда автомат пересекает границу справа налево (то есть из [math]z[/math] в [math]x[/math]), он выходит из состояния [math]q[/math]. Когда пересечение происходит снова слева направо (если оно вообще происходит), то автомат выходит из состояния [math]p[/math]. Теперь, если 2ДКА перейдет в [math]x[/math] в состояние [math]q[/math] заново, то он снова может появиться в состоянии [math]p[/math]. Более того, состояние [math]p[/math] зависит исключительно от [math]q[/math] и [math]x[/math]. Обозначим такое отношение через записать [math]T_x(q) = p[/math]. Мы может записать все такие отношения в виде конечной таблицы [math]T_x : Q \cup \{d\} \to Q \cup \{h\}[/math], где [math]Q[/math] — множество состояний 2ДКА, а [math]d[/math] и [math]h[/math] будут описаны ниже.

На входной строке [math]xz[/math] 2ДКА начнет чтение с левого маркера конца строки. В процессе работы автомата позиция чтения будет меняться. В конце концов это позиция пересечет слева направо границу между [math]x[/math] и [math]z[/math]. В первый раз, когда это произойдет в каком-нибудь состоянии [math]T_x(d)[/math] (для этого мы и выделили [math]d[/math]). Так же автомат может никогда не выйти из [math]x[/math]. В таком случае мы запишем [math]T_x(d) = h[/math]. Состояние [math]T_x(d)[/math] дает немного информации о [math]x[/math], но только конечное количество, поскольку существует только конечное количество вариантов для [math]T_x(d)[/math]. Отметим, что [math]T_x(d)[/math] зависит только от [math]x[/math] и не зависит от [math]z[/math]. Если на вход подавалась строка [math]xw[/math] вместо [math]xz[/math], то в таком случае при пересечении границы из [math]x[/math] в [math]w[/math] автомат также был бы в состоянии [math]T_x(d)[/math], потому что его значение до того момента определялось только [math]x[/math] и до тех пор не все, что находится справа от границы никак не влияет.

Если [math]T_x(d) = h[/math], то 2ДКА должен быть в бесконечном цикле внутри [math]x[/math] и никогда не допустит или отвергнет входную строку.

Предположим, что 2ДКА переходит из [math]x[/math] в [math]z[/math] и спустя время перейти обратно в состояние [math]q[/math]. Если это происходит, то потом:

  • либо снова произойдет переход из [math]x[/math] в некоторое состояние [math]p[/math]. В таком случае мы определим [math]T_x(q)=p[/math].
  • либо никогда не перейдет. В таком случае [math]T_x(q) = h[/math].

Ещё раз отметим, что [math]T_x(q)[/math] зависит только от [math]x[/math] и [math]q[/math] и не зависит от [math]z[/math].

Пример

Рассмотрим следующий язык [math]L_n = (a+b)^∗a(a+b)^{n-1}a(a+b)^∗[/math] при [math]\forall n \gt 0[/math].

Он может быть легко распознан с помощью следующего недетерменированного конечного автомата.

Теперь построим на его основе ДКА. Мы можем построить автомат [math]A_n[/math], который запоминает последние [math]n[/math] входных символов. Следовательно, когда мы находимся с состоянии, соответствующему подстроке [math]\sigma_1 \sigma_2 \dots \sigma_n[/math], и читаем очередной символ [math]\gamma[/math], то мы переходим в состояние, которому уже будет соответствовать подстрока [math]\sigma_2 \sigma_3 \dots \sigma_n \gamma[/math]. Однако, в случае [math]\sigma_1 = \gamma = a[/math] автомат переходит в допускающее состояние, где в цикле может переходить на любому символу. Следует отметить, что такая стратегия строит ДКА c [math]2^n + 1[/math] состояниями. Ниже представлен автомат [math]A_3[/math], который распознает язык [math]L_3[/math].

Покажем, что построенные таким образом автоматы будут минимальными.

  • Каждые две попарно различных строки [math]x[/math] и [math]y[/math] длины [math]n[/math] различимы. Чтобы доказать это, достаточно рассмотреть строку [math]b^{i-1}a[/math], где [math]i : 1 \leqslant i \leqslant n[/math] — самая левая позиция символа, в которой начинают различаться строки [math]x[/math] и [math]y[/math], и проверить, что ровно одна строка [math]xb^{i-1}a[/math] или [math]yb^{i-1}a[/math] принадлежит [math]L_n[/math].
  • Каждая строка длины [math]n[/math] не принадлежит [math]L_n[/math] и, следовательно, различима от строки [math]a^{n+1}[/math], которая принадлежит [math]L_n[/math].
  • Таким образом, [math]2^n + 1[/math] строк в [math]\Sigma^n \cup \{a^{n+1}\}[/math] являются попарно различимыми для [math]L_n[/math]. Как следствие, [math]2^n + 1[/math] — минимальное количество состояний для ДКА, который способен распознать язык [math]L_n[/math].

См. также

Источники информации