W4. Полные и неполные FSA, операции над FSA (дополнение, пересечение, объединение, разность), FST, регулярные языки, свойства замкнутости
1. Краткое содержание
1.1 Представления конечных автоматов
На предыдущих лекциях мы изучили формальное определение конечного автомата (FSA). Теперь рассмотрим два важных варианта задания функции переходов: полные и неполные FSA.
1.1.1 Полные FSA
Полный FSA — это автомат, у которого функция переходов
То есть в каком бы состоянии ни находился автомат и какой бы символ он ни прочитал, всегда есть определённый переход в некоторое состояние (в том числе в то же самое через петлю).
Зачем нужна полнота? Полный FSA гарантирует, что любую строку над алфавитом можно обработать, не «застревая». У автомата всегда есть однозначное конечное состояние — принимающее или отвергающее.
Пример: FSA над алфавитом
- Из
: на входе 0 → остаёмся в , на входе 1 → переход в - Из
: на входе 0 → переход в , на входе 1 → остаёмся в
Это полный автомат: для каждой пары
1.1.2 Неполные FSA
Неполный FSA (также частичный FSA) — автомат, у которого функция
Что происходит при неопределённом переходе? Если при разборе строки FSA попадает в ситуацию, где
Пример: FSA над алфавитом
(старт) → наaпереход в ; наbпереход не определён (принимающее) → наbостаёмся в ; наaне определено
Этот FSA принимает строки вида «a», за которым следует ноль или больше символов b (b, или содержащая a после первой позиции, приводит к неопределённому переходу и отвергается.
Графическое представление: на диаграммах неполные FSA просто не рисуют стрелок для неопределённых переходов. У полных FSA показаны все переходы.
1.1.3 Превращение неполного FSA в полный
Любой неполный FSA можно преобразовать в эквивалентный полный, добавив состояние-ловушку (ошибочное состояние, сток). Процедура:
- Добавить новое непринимающее состояние
(или — от «error») - Для каждого неопределённого
задать переход в ловушку: - Петли в ловушке по всем символам:
для всех
Свойство ловушки: войдя в неё, автомат уже не выйдет. Так как она непринимающая, любая строка, приводящая в неё, отвергается.
Пример: дополнение неполного FSA выше:
- Добавить
(непринимающее) наb→ наa→ наa→ наb→
Теперь для каждой пары «состояние — символ» переход определён: FSA полон, а распознаваемый язык тот же.
1.2 Регулярные языки
Регулярный язык — любой язык, который может быть распознан (принят) конечным автоматом. Это базовое понятие теоретической информатики.
Формальное определение: язык
То есть
Важные свойства регулярных языков:
- Разрешимость: для любого регулярного
и любой строки алгоритмически можно проверить, принадлежит ли , моделируя FSA - Конечность описания: регулярные языки задаются FSA с конечным числом состояний
- Свойства замкнутости: регулярные языки замкнуты относительно многих операций (объединение, пересечение, дополнение, конкатенация, звезда Клини)
Примеры регулярных языков:
(регулярный)с о д е р ж и т ч ё т н о е ч и с л о е д и н и ц (регулярный)н а ч и н а е т с я с (не регулярный — нужен «счёт», недоступный FSA)
1.3 Операции над конечными автоматами
Одно из сильных свойств регулярных языков — их замкнутость относительно ряда операций: если применить такую операцию к регулярным языкам, результат снова регулярный. Для результирующих языков можно систематически построить FSA.
1.3.1 Дополнение
Задача: дан FSA
Идея: чтобы принимать «противоположный» язык, инвертируем множество принимающих состояний (раньше принималось — теперь Reject, и наоборот).
Построение для полных FSA:
Для полного FSA
где
Все прочие компоненты автомата не меняются — обновляется только множество принимающих состояний.
Пример: FSA над
: , (нечётная длина) : те же переходы, но (чётная длина, включая )
Почему это верно? В полном FSA каждая строка заканчивается в некотором состоянии. Если оно было принимающим в
Критично: полнота
Простой приём «поменять принимающие состояния» работает только для полных FSA. Почему?
В неполном FSA часть строк обрывается на неопределённом переходе и тем самым неявно отвергается. Поменяв только принимающие состояния, мы меняем судьбу лишь строк, которые полностью обработаны. Строки, отвергнутые из‑за неопределённости, этим приёмом не учитываются.
Построение для неполных FSA:
- Сначала сделать FSA полным, добавив ловушку для всех неопределённых переходов
- Затем поменять принимающие состояния:
Пример: неполный FSA:
Шаг 1: добавить ловушку
наb→ наa→ наa,b→
Шаг 2: дополнение. Было
Автомат дополнения принимает все строки, кроме тех, что начинаются с a и дальше содержат только b.
1.3.2 Пересечение
Задача: даны FSA
Идея: запускаем оба FSA параллельно на одной входной строке. Принимаем только если приняли бы оба автомата по отдельности.
Построение (прямое произведение):
Пусть
Тогда автомат пересечения:
где:
(декартово произведение: пары состояний) (одновременный переход в обоих) (принимают оба)
Интуиция: состояние
Пример:
- Состояния:
- Переходы:
,
- Состояния:
- Переходы:
Произведение
- Состояния:
- Переходы:
, ( и )
Принимаются строки нечётной длины (как у
Размер: при
1.3.3 Объединение
Задача: даны
Построение:
Почти то же, что пересечение, но другое множество принимающих:
где:
(хотя бы одна компонента принимающая)
Отличие от пересечения только в условии принятия: логическое ИЛИ (
Пример: те же
(так как , обе пары подходят)- Начальное
принимающее — принимается даже - Принимаются все строки (как у
)
Альтернатива через законы де Моргана:
то есть «НЕ (НЕ
1.3.4 Разность
Задача: построить FSA для
Построение:
Снова прямое произведение:
где:
( принимает и не принимает)
Интуиция: принимаем, когда «
Пример:
(в , но не во «всём» — пусто) (нет с , так как и везде )
Обратный пример:
( , )- Принимаются строки чётной длины (включая
)
1.4 Конечные преобразователи (FST)
Finite State Transducer (FST) обобщает FSA, добавляя выход: FSA лишь принимает или отвергает строки, FST преобразует входную строку в выходную.
1.4.1 Формальное определение
FST — кортеж:
где:
— обычный FSA («компонента распознавания») — выходной алфавит — выходная функция: на каждом переходе выдаётся строка выходных символов (возможно пустая)
Важно:
- Преобразование только для принятых строк: если базовый FSA строку не принимает, выхода нет (или преобразователь «падает»)
- На каждом переходе может быть выход: из
по входу выдаётся - Выход может быть пустым (
)
На диаграммах: переходы подписываются как
1.4.2 Пример: удаление нечётных вхождений 0 и удвоение 1
Задача: FST над
- принимает строки с чётным числом нулей
- на выходе:
- каждое нечётное по счёту 0 удаляет (выход
) - каждое чётное 0 оставляет (выход
0) - каждую 1 удваивает (выход
11)
- каждое нечётное по счёту 0 удаляет (выход
Примеры:
- Вход:
010010→ Выход:110110 - Вход:
00→ Выход:0 - Вход:
000100011→ Выход:011001111
Построение FST:
- Состояния:
(принимающее): «видели чётное число нулей» : «видели нечётное число нулей»
- Переходы и выходы:
- Принимающие:
Как работает: чётность числа нулей кодируется состоянием; для 1 выход всегда 11; для 0 — 0 в зависимости от нечётного/чётного вхождения.
1.4.3 Применения FST
- Текст: поиск-замена, орфография
- Обработка естественного языка: морфология (например
walked→walk) - Компиляторы: шаблоны исходного кода → целевой код
- Сжатие: кодирование/декодирование
- Замена по регулярным выражениям: в духе
s/pattern/replacement/g
1.5 Свойства замкнутости регулярных языков
Семейство языков
Смысл замкнутости (closure): как у «замкнутой системы» — выполняя разрешённые операции, мы не выходим из класса. Для regular languages ряд операций снова даёт регулярный язык.
Регулярные языки замкнуты относительно:
- Объединения:
(прямое произведение) - Пересечения:
(прямое произведение) - Дополнения:
(смена принимающих в полном FSA) - Разности:
(прямое произведение) - Конкатенации:
- Звезды Клини:
Зачем это нужно:
- Композиция: собираем сложные регулярные языки из простых
- Доказательство регулярности: зная, что
, регулярны, сразу знаем, что регулярен, не строя FSA - Компиляторы: комбинирование шаблонов для лексики
Пример:
регулярени м е е т ч ё т н о е ч и с л о н у л е й регулярени м е е т н е ч ё т н о е ч и с л о е д и н и ц по замкнутости относительно объединения
1.6 Практика: упрощение FSA
При построении FSA операциями пересечения/объединения часто появляются недостижимые состояния — те, в которые нельзя попасть из начального. Их можно удалить без смены языка.
Пример: при
Алгоритм упрощения:
- Пометить начальное состояние как достижимое
- Итеративно помечать состояния, достижимые из уже помеченных по любому переходу
- Удалить все непомеченные состояния и связанные с ними переходы
Это снижает размер автомата в реализациях.
2. Определения
- Полный FSA: конечный автомат, у которого
всюду определена: для всех , значение задано. - Неполный FSA (частичный FSA): автомат с частичной
; строки, доходящие до неопределённого перехода, автоматически отвергаются. - Состояние-ловушка (ошибочное, сток): непринимающее состояние, добавляемое для дополнения неполного FSA; все бывшие «дыры» ведут в ловушку, в ловушке — петли по всем символам; войдя, не выходим; строки в ловушке отвергаются.
- Регулярный язык:
, распознаваемый некоторым FSA; эквивалентно: существует FSA с . - Дополнение языка: для
над дополнение (или ) — все строки над , не входящие в : . - Пересечение языков:
(общий алфавит). - Объединение языков:
. - Разность языков:
. - Прямое произведение автоматов: объединение
и в один FSA с состояниями-парами , , ; параллельная симуляция на одном входе. - Декартово произведение множеств:
. - Finite State Transducer (FST): расширение FSA выходной строкой; формально
, — выходной алфавит, — выходная функция. - Выходная функция (
): в FST задаёт выходную строку (возможно ) при переходе из состояния по входному символу. - Свойство замкнутости: семейство
замкнуто относительно операции, если из результат операции снова в . Регулярные языки замкнуты относительно объединения, пересечения, дополнения, разности, конкатенации и звезды Клини. - Недостижимое состояние: состояние, в которое нельзя попасть из начального ни по какой цепочке переходов; удаление не меняет распознаваемый язык.
3. Формулы
- Дополнение FSA (полный): для полного
имеем , - Пересечение FSA (прямое произведение): для
и автомат , где: - Объединение FSA (прямое произведение): как пересечение, но
- Разность FSA (прямое произведение): как пересечение, но
- Законы де Моргана для языков:
и
4. Примеры
4.1. Построение FST: прошедшее время → настоящее (Лаба 4, Задание 1)
Постройте полный FST над алфавитом
- принимает только глаголы
walkedилиtalked - переводит глагол в форму настоящего времени (убирает окончание
ed)
Показать решение
Ключевая идея: FST читает посимвольно и выдаёт нужный выход. Для walked → walk выводим каждую букву, кроме финальных ed.
- Состояния:
(старт): ещё ничего не прочитано : прочитаноwилиt :waилиta :walилиtal :walkилиtalk :walkeилиtalke (принимающее): полностьюwalkedилиtalked : ошибка для неверного ввода
- Переходы и выходы:
- Из
:w→ выходw, в ;t→ выходt, в ; иначе в ловушку - Из
:a→a, в ; иначе ловушка - Из
:l→l, в ; иначе ловушка - Из
:k→k, в ; иначе ловушка - Из
:e→ , в (не выводимe) - Из
:d→ , в (не выводимd) — принимающее (непринимающее): любой «неверный» символ ведёт в ловушку с выходом ; из ловушки по каждому символу алфавита — петля в ловушку с выходом
- Из
Проверка:
- Вход:
walked→ Выход:walk✓ - Вход:
talked→ Выход:talk✓
Ответ: FST с состояниями e и d.
4.2. Построение FST: стирание каждой второй a (Лаба 4, Задание 2)
Постройте полный FST над
- принимает только строки, оканчивающиеся на
b - на выходе стирает каждое второе вхождение символа
a
Показать решение
Ключевая идея: отслеживать чётность числа уже прочитанных a. На нечётных вхождениях выводить a, на чётных — b всегда выводить.
- Состояния:
(старт): чётное числоa, последний символ неb : нечётное числоa, последний неb (принимающее): чётное числоa, строка оканчивается наb (принимающее): нечётное числоa, оканчивается наb
- Переходы и выходы:
- Из
:a→ выходa, в ;b→b, в - Из
:a→ , в ;b→b, в - Из
:a→a, в ;b→b, остаёмся в - Из
:a→ , в ;b→b, остаёмся в
- Из
- Принимающие:
Проверка:
aaab→aab✓aabb→abb✓
Ответ: четыре состояния, чётность a и факт окончания на b, выходы как выше.
4.3. FSA для чётного числа единиц и нечётного числа нулей (Лаба 4, Задание 3)
Пусть
Задача 1: полный FSA
Задача 2: полный FSA
Показать решение
Ключевая идея: двумя состояниями кодировать чётность счёта; чтение отслеживаемого символа переключает состояние.
(a) FSA для чётного числа единиц (
- Состояния:
(старт, принимающее) — чётное число единиц; — нечётное - Переходы: из
:0— петля,1— в ; из :0— петля,1— в
Проверка: "" → 11 ✓; 101 ✓; 1 ✗
(b) FSA для нечётного числа нулей (
- Состояния:
(старт) — чётное число нулей; (принимающее) — нечётное - Переходы: из
:1— петля,0— в ; из :1— петля,0— в
Ответ:
4.4. Комбинирование FSA: объединение, пересечение, разность (Лаба 4, Задание 4)
Используя
Задача 3: полный FSA для случая, когда принимает
Задача 4: полный FSA, когда принимают оба (пересечение).
Задача 5: полный FSA, когда
Задача 6: дополнение для
Показать решение
Ключевая идея: для объединения, пересечения и разности — прямое произведение; для дополнения — смена принимающих состояний у полного
(Задача 3) Объединение:
- Прямое произведение:
- Начальное:
- Переходы:
- Принимающие (хотя бы одна компонента принимающая):
Ответ: FSA объединения имеет 4 состояния и 3 принимающих:
(Задача 4) Пересечение:
- То же произведение
- Принимающие (обе компоненты принимающие):
Ответ: FSA пересечения — 4 состояния, одно принимающее:
(Задача 5) Разность:
- То же произведение
- Принимающие (
принимает, отвергает):
Ответ: FSA разности — 4 состояния, одно принимающее:
(Задача 6) Дополнение:
уже полон (есть переходы по всем входам)- Смена принимающих состояний: Исходно
Дополнение
Ответ: у
4.5. Дополнение неполного FSA (Лаба 4, Задание 5)
Постройте дополнение для неполного FSA над
(старт, принимающее): петля на1, по0в : по0в ; переход по1не определён
Показать решение
Ключевая идея: сначала дополнить ловушкой, затем поменять принимающие.
- Ловушка
: на1→ ; петли на0,1 - Полный FSA:
принимающее, нет (до дополнения) - Дополнение: было
,
Ответ: принимающие
4.6. FSA для делимости на 2 и на 3 (Лаба 4, Задание 6)
Задача 1: полный FSA
Задача 2: полный FSA
Показать решение
Ключевая идея: в двоичной записи делимость на 2 — по последней цифре; на 3 — по остатку при чтении слева направо.
(a) Делимость на 2: число чётно тогда и только тогда, когда последняя цифра 0 (или пустая строка как 0).
(старт, принимающее): последняя цифра 0 или ещё не было цифр : последняя цифра 1- Переходы: из
на0— в , на1— в ; из на0— в , на1— петля
Проверка: 10 (=2) ✓; 11 (=3) ✗
(b) Делимость на 3: отслеживаем остаток при делении на 3. Читая двоичные цифры слева направо, обновляем остаток так:
Состояния (остаток mod 3):
(старт, принимающее): остаток 0 (делится на 3) : остаток 1 : остаток 2
Переходы: из состояния
при чтении цифры новое состояние .Явно:
- Из
:0→ ( );1→ ( ) - Из
:0→ ( );1→ ( ) - Из
:0→ ( );1→ ( )
- Из
Принимающие:
Проверка: 11 (=3) ✓; 110 (=6) ✓; 10 (=2) ✗
Ответ:
4.7. Комбинирование FSA делимости (Лаба 4, Задание 7)
По
Задача 3: полный FSA для пересечения (делится на 2 и на 3, т.е. на 6).
Задача 4: полный FSA для объединения (делится на 2 или на 3).
Задача 5: полный FSA:
Показать решение
Ключевая идея: прямое произведение с нужным условием на принимающие пары.
(Задача 3) Делимость на 6:
- Состояния-пары:
— 6 состояний. Начальное: - Принимающие (делятся на 2 и на 3):
Ответ: FSA для делимости на 6 имеет 6 состояний и одно принимающее:
(Задача 4) Делимость на 2 или 3:
- То же множество пар состояний
- Принимающие (делится на 2 ИЛИ на 3):
Ответ: 6 состояний, 4 принимающих.
(Задача 5) Делится на 2, но не на 3:
- То же произведение
- Принимающие (на 2 да и на 3 нет):
Ответ: 6 состояний, два принимающих:
4.8. Сложное прямое произведение (Лаба 4, Задание 8)
Пусть
- Состояния:
(старт), , (принимающее) - Переходы:
— петля наb, поaв ; — петля наa, поbв ; поbв
- Состояния:
(старт), , (принимающее) - Переходы:
— петля наa, поbв ; поaв , поbв ; — петли наaиb
Нарисуйте полные FSA, принимающие:
(i)
(ii)
(iii)
Показать решение
Ключевая идея: прямое произведение; принимающие состояния задаются по смыслу операции.
(i) Объединение:
Пары состояний:
— 9 состояний. Начальное:Принимающие (хотя бы одна компонента принимающая):
Явно:
Переходы:
для всех пар и символов
Ответ: FSA из 9 состояний, 5 принимающих (все пары, где
(ii) Пересечение:
- То же произведение
- Принимающие (обе компоненты принимающие):
Ответ: 9 состояний, одно принимающее:
(iii) Разность:
- То же произведение
- Принимающие (
принимает, отвергает):
Ответ: 9 состояний, два принимающих:
4.9. От диаграммы состояний к таблице переходов (Туториал 4, Пример 1)
Дан FSA в виде диаграммы переходов; постройте таблицу переходов.
Три состояния:
, , ,
Показать решение
Ключевая идея: таблица переходов — другой способ задать FSA: строки — состояния, столбцы — символы алфавита, в ячейках — состояние назначения.
- Структура таблицы:
- Строки: по одной на каждое состояние (
) - Столбцы: по одному на каждый символ (
) - Начальное состояние помечают
, принимающие —
- Строки: по одной на каждое состояние (
- Заполнение по диаграмме:
- Из
:a→ ,b→ - Из
:a→ ,b→ - Из
:a→ ,b→
- Из
Таблица переходов:
| a | b | |
|---|---|---|
Ответ: заполненная таблица приведена выше.
4.10. Дополнение неполного FSA до полного (Туториал 4, Пример 2)
Неполный FSA над
(старт) (принимающее) (принимающее) (петля)
Переходы
Показать решение
Ключевая идея: добавить состояние-ловушку и направить в неё все ранее неопределённые переходы.
- Неопределённые переходы:
, - Добавить ловушку
(непринимающее) - Доопределить:
- Петли ловушки:
,
Полный FSA:
- Состояния:
(старт), (принимающее), (ловушка, непринимающее) - Переходы:
, , ,
Ответ: полный FSA с ловушкой
4.11. Дополнение полного FSA (Туториал 4, Пример 3)
Полный FSA
Он принимает строки с нечётным числом символов a. Постройте
Показать решение
Ключевая идея: у полного FSA дополнение — смена принимающих и непринимающих состояний.
- Исходные принимающие:
- Дополнение:
Переходы те же; меняется только
Проверка:
принимает:a,aaa,aaaaa, … (нечётная длина) принимает: ,aa,aaaa, … (чётная длина, включая ноль)
Ответ: a.
4.12. Дополнение неполного FSA (Туториал 4, Пример 4)
Неполный FSA над
(старт) (принимающее) (петля)
Постройте автомат для дополнения.
Показать решение
Ключевая идея: сначала сделать автомат полным, затем взять дополнение.
- Ловушка
: , , петли на , - Полный FSA: состояния
; принимающие до дополнения - Дополнение:
Автомат дополнения:
- Состояния:
(старт, принимающее), (непринимающее), (принимающее) - Переходы как у дополненного автомата
- Принимающие:
Ответ: дополнение принимает все строки, кроме вида
4.13. Пересечение двух FSA (Туториал 4, Пример 5)
Дано:
, где , (нечётная длина) , где (все строки)
Постройте
Показать решение
Ключевая идея: прямое произведение; принимающие — пары, в которых обе компоненты принимающие.
- Начальное:
- Переходы
:
Произведение:
Ответ: пересечение принимает строки нечётной длины (как
4.14. Пересечение более сложных FSA (Туториал 4, Пример 6)
Два FSA над
- Состояния:
(старт), , (принимающее), - Переходы:
, ; , ; — петли на ; — петли на
- Состояния:
(старт), , (принимающее) - Переходы:
, ; , ; — петли на
Постройте
Показать решение
Ключевая идея: полное произведение, затем выделение достижимых состояний.
Полное произведение:
— состояний. Начало . Принимающие:Примеры переходов:
- Из
поa: - Из
поb: - Из
поa: — достижение принимающего состояния
- Из
Достижимость из
: чтобы попасть в в , нужна цепочка ; в в — (далее петлит по всем символам)Путь для строки
aaba: ✓После удаления недостижимых остаётся упрощённый автомат пересечения.
Ответ: упрощённое пересечение принимает строки, которые одновременно доводят aaba.
4.15. Объединение двух FSA (Туториал 4, Пример 7)
Используя те же
Показать решение
Ключевая идея: то же произведение; принимающие — пары, где хотя бы одна компонента принимающая.
Состояния и переходы как у пересечения:
- Начало
,
. Так как и во всех достижимых парах , условие выполняется всегда.Следовательно
— оба состояния принимающие; начальное принимающее, значит принимается . Фактически принимаются все строки.
Ответ:
4.16. Разность двух FSA (Туториал 4, Пример 8)
Найдите
Показать решение
Ключевая идея: принимающие — пары, где первая компонента принимающая, а вторая нет.
- Произведение:
, начало . Здесь , .- Для
: , но — не подходит - Для
: — не подходит - Итог:
- Для
Ответ:
4.17. Разность двух FSA (Туториал 4, Пример 9)
Найдите
Показать решение
: нужно и . : ✓, ✓ — принимающее : ✗ — не принимающее- Итог:
Ответ: