Серия «Что такое язык программирования?»

5

Автомат с магазинной памятью (стог-памятью) и КС-языки

Предыдущая статья: Ещё раз об однозначности грамматики, о дереве вывода, а так же о главном признаке КС-грамматики в vk.com

Статья для повторения:Задача разбора, для чего она нужна? Или что такое parsing? в vk.com

Вспомним о характере разбора цепочки. Стоит ли кость на своём месте при её постановке? Если постоянно да, то наш алгоритм предопределённый, в противном случае нам следует делать возвраты и пробовать подставить иную кость. Возможно узнать принадлежность цепочки заданной длинны, хотя бы из тех соображений, что можно построить все предложения (сентенции) грамматики совпадающие по длине с этой цепочкой.

Такой алгоритм работает по принципу полного перебора, для организации перебора используют стэк (англ. stack - рус. стог) - структуру данных по принципу «последним вошёл, первым ушёл». Полный перебор крайне неэффективен и на практике, как правило, не применяется.

Но! Есть широкий подкласс КС-грамматик, для которых накладывается ряд ограничений, что позволяет нам обходится без полного перебора и использовать эффективные алгоритмы распознавания, которые мы будем рассматривать в следующих уроках.

Если для автоматных грамматик в качестве распознавателя используется конечный автомат, то для КС-грамматик используется автомат с магазинной памятью.

Здесь нужно остановится на понятии «магазинная память», которое использовано крайне не удачно. По идее у вас должна быть выстроена ассоциация с магазином АК-47 (или другого оружия), где пуля заряженная последней, выстреливается первой. Но дело в том, что само слово магазин обозначает просто склад и он не обязательно должен выстроен по вышеуказанному принципу, лично я вовсе подумал о продуктовом. Поэтому используем термин стог-память или просто стог, так как если из стога вытащить что-то не сверху он превратится в кучу.

Перед тем как дать формальное описание, мы сперва построим простой стог-автомат. Отобразим общее представление об автомате:

Автомат с магазинной памятью (стог-памятью) и КС-языки Программирование, Урок, Автомат, Парсинг, ВКонтакте (ссылка), Длиннопост

Общее представление стог-автомата.

Мы видим, что автомат обращается за чтением цепочки и за чтением из стог-памяти, в стог вложен отдельный символом п обозначающий под или дно. Внутреннее устройство автомата можно представить в виде направленного графа как и конечный автомат (далее КА), только для перехода из состояния в новое состояние направленное ребро помечается по мимо принимающего символа, верхней цепочкой символов стога, которая будет заменена на новую цепочку символов в обратном порядке по очереди («первым вошёл, первым ушёл»), также входит в метку:

Автомат с магазинной памятью (стог-памятью) и КС-языки Программирование, Урок, Автомат, Парсинг, ВКонтакте (ссылка), Длиннопост

Переходы и стог.

Выше приведены примеры переходов с отображением операций над стогом. Первых три примера прозрачны, считали символ и поменяли цепочки. В 4 и 5 используется пустая цепочка ε и здесь нужно пояснение. Между любыми двумя символами всегда лежит пустая цепочка , что является причинной почему КА с ε-переходами недетерминирован. Проверьте, зайдите https://regex101.com/, введите любой текст и регуляр (), вы получите кучу совпадений. В стог-автомате ε используется в целях внутренней работы без считывания символа принимаемой цепочки, выталкивания и помещения символов из/в стог(-а), ведь пустота означает, что нечего брать или класть.

Изобразим граф стог-автомата принимающего язык:
Я = {аⁿбⁿ | n >= 0}, где в цепочках символы а и б повторяются в равном количестве, примеры { аб, аабб, аааббб, …}.

Автомат с магазинной памятью (стог-памятью) и КС-языки Программирование, Урок, Автомат, Парсинг, ВКонтакте (ссылка), Длиннопост

Стог-автомат.

Так же как в КА конечное состояние автомата обозначаем узлом с двойным кружком, а начальное просто стрелкой. Для того, чтобы не изображать лишних рёбер правила переходов записывают друг над другом. Формально данный стог-автомат записывается так:
М = ({С0, С1, С2},{а,б}, {А. п}, δ, С0, п, {C2})

Теперь мы готовы к общему формальному описанию, приступим:
M = {Q, Σ, Γ, δ, q0, Ζ, F}
F
- множество конечных (принимающих) состояний автомата, наше {C2}.
Ζ - символ конца стога, наш п - символ под.
q0 - начальное состояние автомата, наше С0.
δ
- функция переходов автомата δ: ( Q × (Σ ∪ {ε}) × Γ) → (Q × Γ*).
Γ
- алфавит стога, наше {А, п}.
Σ
- входной алфавит, наше {а,б}.
Q
- множество состояний автомата, наше {С0, С1, С2}.

Остановимся на функции переходов δ: ( Q × (Σ ∪ {ε}) × Γ) → (Q × Γ*), она нам говорит о том, что переход зависит от текущего состояния Q, от принимаемого символа Σ с возможностью его оставить в покое ε и от верха стога Γ, в замен мы получаем новое состояние Q и новое содержимое стога Γ*. Γ* - звездочка обозначает, что наше множество разрастаемое, то есть стог заполняется символами.

Для дальнейшего объяснения предоставляю работу автомата того же языка, но построенный по его грамматике:
G: S → aSб | ε

Поехали!! Листай!

На рисунке отображено, ещё не рассмотренное нами понятие конфигурации. Конфигурация представляет из себя набор (q, ω, γ), где q - текущее состояние, ω - цепочка ещё не рассмотренных символов, γ - содержимое стога. Символом обозначают такт автомата, то есть переход из одной конфигурации в другую. Обозначим символом ⊢* последовательность ноль и более тактов, теперь мы можем описать условие принятия цепочки или допускаемый язык автомата:
L(M) = {ω ∈ Σ* и (q0, ω, Z) ⊢* (q, ε, Z), где q ∈ F} - то, есть когда наш стог опустошился до пода, завершился в конечном состоянии, а так же вся входная цепочка прочитана полностью. Лично у меня остался вопрос, почему везде записывают принятие по пустому стогу так:
L(M) = {ω ∈ Σ* и (q0, ω, Z) ⊢* (q, ε, ε,) где q ∈ F} - ведь никто не извлекает Z?

Так же существует соглашение условия принятия:
L(M) = {ω ∈ Σ* и (q0, ω, Z) ⊢* (q, ε, γ), где q ∈ F, γ ∈ Γ*} - то, есть когда наша цепочка полностью прочитана и мы достигли конечного состояния, а в стоге остались символы. Если мы уберём состояние С3, а С2 сделаем конечным, то становится понятно почему, такое соглашение есть.

Так же автомат можно описать таблицей, вот наш случай:

Автомат с магазинной памятью (стог-памятью) и КС-языки Программирование, Урок, Автомат, Парсинг, ВКонтакте (ссылка), Длиннопост

Таблица автомата.

В заключении следует сказать:
Для произвольной КС-грамматики можно построить недетерминированный автомат с магазинной памятью (стог-памятью), принимающий язык, порождаемый этой грамматикой.

Возможно построить и детерминированный, как отмечалось раньше, для этого грамматикам накладываются некоторые ограничения, о которых будет рассказано в других уроках.

Постскриптум: Очень сильно надеюсь, что изложил тему доступным языком. Будьте мне здоровы, подписывайтесь.

UPD:

Читать далее...

Показать полностью 20
4

Ещё раз об однозначности грамматики, о дереве вывода, а так же о главном признаке КС-грамматики

Предыдущая статья: Регулярки - применение. Итог темы об автоматных языках в vk.com

Статья для повторения:Эквивалентность и однозначность грамматики или почему иногда 2+2*2=8?

При разборе автоматных языков мы ведь не строили никаких деревьев? Нет ли здесь противоречия? Нет. Из-за свойства автоматной грамматики её правила вида A → a и A → ε всегда приводят к конечным символам, а правило вида A → aB всегда задаёт однозначную последовательность для ДКА, и все деревья автоматных грамматик приобретают вид:

Ещё раз об однозначности грамматики, о дереве вывода, а так же о главном признаке КС-грамматики Программирование, Урок, Грамматика, Языки программирования

Дерево вывода автоматных грамматик.

Поэтому нам будет полезно ввести определение однозначности не прибегая к дереву. Для этого рассмотрим две грамматики мат.выражений:

G1: E → E + E | E – E | E * E | E / E | x | ( E )

G2:
E → T | E + T | E – T
T → M|T * M| T / M
M → x | (E)

Попробуем построить выражение x + x * x более чем одним левосторонним выводом, для G1:

E => E * E => E + E * E => x + E * E => x + x * E => x + x * x

E => E + E => x + E => x + E * E => x + x * E => x + x * x

Теперь для G2:

E =>E + T=>T + T =>M + T=>x + T=>x + T * M=>x + M * M =>x + x * M => x + x * x

А вот второй вывод для G2 мы не можем построить, так как по правилам грамматики, мы не можем подставить * или операнд (x) раньше, чем + . Если мы построим деревья, то мы увидим, что в G1 они будут выглядеть по разному, ну а в G2 у нас всегда только одно дерево. Таким образом:

КС-грамматика называется однозначной, если для каждого предложения языка, порождаемого этой грамматикой, существует единственный левосторонний вывод или единственный правосторонний вывод.

Теперь о главном признаке: Если для некоторого неконечного символа А в грамматике, при выводе цепочки мы заново приходим к разложению А, а слева и справа от символа у нас уже имеются непустые цепочки конечных и неконечных символов, говорят, что такая грамматика имеет самовложение. К примеру наша грамматика G2, такой и является:
E => T => M => ( E )

Самовложение характерный признак КС-грамматики в противном случае:
КС-грамматика, не содержащая самовложения, эквивалентна автоматной грамматике.

Итак, на этом урок окночен.

З.Ы. Если вы в своей задаче встречаетесь с самвложением, отложите Regex, выпейте чаю, освободите себя от дурных мыслей, Regex-ы вам не нужны. Подписывайтесь.

UPD:

Читать далее...

Показать полностью 1
3

Регулярки - применение. Итог темы об автоматных языках

Предыдущая статья: Регулярные выражения и регулярные множества - ещё один способ задания автоматного языка в vk.com

Чем выгодно отличаются регулярные выражения от рисунка порядка и записи грамматики, так это то, что они представляют из себя строки. Что даёт нам возможность легко обрабатывать их программно и автоматизированно создавать распознаватели автоматных языков. Реализация которых может быть представлена в виде таких схем:

Регулярки - применение. Итог темы об автоматных языках Урок, Регулярные выражения, Длиннопост, Программирование, Язык

Схемы

В предыдущей статье, показана таблица соответствий регулярных выражение с участками рисунка порядка, а в предпредстатье создание распознавателя не прибегая к таблицам переходов.

Регулярные выражения (далее РВ) по своей сути являются языком из алфавита { |, (, ), *, a}, где а - множество различных символов алфавита задаваемого языка. Можно ли с помощью РВ задать язык РВ? Ответ: нет, так как язык РВ не является автоматным, из-за самовложения он является КС-языком. Ниже представлена его грамматика с учётом приоритетов операций:

R → T | R ′′|′′ T
T → M | RM
M → a | M* | ( R ) | ε

Запись ′′|′′ представляет знак | используемый в регулярных выражениях.

При реализации РВ, человеческая лень с одной стороны упростила запись РВ , с другой усложнило понимание и чтение их, но это спорное утверждение. Была расширена нотация языка с помощью сокращений, для кол-ва повторений:

a? = (a|)
a+ = (aa*)
a{2,4} = (aa|aaa|aaaa)

Сокращение для «или»:
[abcd] = (a|b|c|d) - нужно отметить ещё, что символы между [ и ] не нужно экранировать.

Сокращения часто встречающихся множеств, один пример:
\d = (0|1|2|3|4|5|6|7|8|9)

А то и вовсе добавлены управляющие символы движка распознавателя, для указания где в строке нужно искать совпадение в ^ начале или в $ конце? В любом случае вам придётся открывать руководство конкретно-используемого инструмента, так как на долго в голове всё это удержать не возможно.

С помощью всего этого запись: (+|-|)(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)* превратилась в [+-]?\d+ , но вам никто не запрещает писать по «старинке».

В этой же статье я хотел вам показать взаимосвязь регулярных выражений с автоматными языками и распознавателями.

Итог: С помощью автоматных грамматик и регулярных выражений определяется синтаксис простейших конструкций языков программирования, таких как идентификаторы, различные литералы цифр, знаки операций.

Путеводитель по пройденным статьям:
1. Что такое язык программирования? Не спешим отвечать, знакомимся с определением формальных языков
2. Грамматика языка и порождающие грамматики. Сказ о «правильных» скобочках
3. Хомски и его иерархия грамматик
4. Дерево вывода предложения (сентенции) грамматики. Синтаксическое дерево
5. Задача разбора, для чего она нужна? Или что такое parsing?
6. Эквивалентность и однозначность грамматики или почему иногда 2+2*2=8?
7. Графы автоматных грамматик. Что же, начинаем знакомится с конечными автоматами?
8. Конечные автоматы, что там внутри?
9. Обещанная реализация КА и попытка создать таблицу переходов не детерминированному автомату
10. Преобразование НКА в ДКА, один из алгоритмов
11. Синтаксические диаграммы автоматных языков - рисунок порядка автоматных языков
12. Регулярные выражения и регулярные множества - ещё один способ задания автоматного языка

Ну как-то так, друзья. Дальше в лес КС-грамматик, присоединяйтесь.

UPD:

Читать далее...

Показать полностью 1
8

Регулярные выражения и регулярные множества - ещё один способ задания автоматного языка

Регулярные выражения и регулярные множества - ещё один способ задания автоматного языка.

Предыдущая статья: Синтаксические диаграммы автоматных языков - рисунок порядка автоматных языков. в vk.com

Ещё одним способом задать язык является регулярное выражение. Регулярным выражением обозначают множество цепочек, которое называют регулярное множество. Чтобы задать регулярное выражение для некого алфавита Σ следуют учитывать 6 правил:

  1. Отдельный символ из алфавита Σ есть регулярное выражение. Например символ а ∈ Σ (символ из алфавита Σ) задаёт множество {а}.

  2. Пустая цепочка ε есть регулярное выражение, задаёт множество {ε}

  3. Если R и Q - регулярные выражения, то запись RQ тоже регулярное выражение, которое обозначает сцеплённое множество, где первая цепочка пары образуется выражением R, а вторая выражением Q. Сцепление ещё называют конкатенацией.

  4. Если R и Q - регулярные выражения, то запись R | Q тоже регулярное выражение, которое обозначает объединение множеств цепочек заданных выражениями R и Q. | - знак читается как «или».

  5. Если R регулярное выражение, то запись R* тоже регулярное выражение, которое обозначает множество, которое получается путём повторения цепочек множества заданное R. Повторение ещё называют итерация.

  6. Если R регулярное выражение, то запись (R) тоже регулярное выражение и обозначает тоже самое множество, что и R.

Предполагаем приоритет операции, высший имеет «*» - повторение, затем сцепление и низший «|» («или»). Скобки используются для изменения порядка операций.

Зачастую при записи регулярного выражения запись ε опускают и вводится дополнительный оператор «один раз и более» обозначенный символом «⁺», что значит R⁺=RR*. Вот так это выглядит на примере языка целых чисел со знаком:

(+ | – | ) (0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 )⁺

Теорема Клини гласит: Автоматные языки являются регулярными множествами. Регулярные множества являются автоматными языками.

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

И чтобы вам было проще понять правила сделаем таблицу соответствия правил с участками рисунка порядка (синтаксической диаграммы) языка.

Регулярные выражения и регулярные множества - ещё один способ задания автоматного языка Урок, Программирование, Регулярные выражения, Теория, Обучение, ВКонтакте (ссылка)

Таблица соответствия

На этом урок окончен. В следующем мы обсудим регулярные выражения на практике и подытожим тему автоматных языков. Новоиспечённые подписываемся, с нами интересно. Дайте пятюню.

UPD:

Читать далее...

Показать полностью 1
8

Синтаксические диаграммы автоматных языков - рисунок порядка автоматных языков

Предыдущая статья: Преобразование НКА в ДКА, один из алгоритмов в vk.com

Давайте опишем язык целых чисел со знаками: 30 12 +1922 -100

Выделяем 3 основные категории символов языка — цифра, знак минус и знак плюс и запишем грамматику:
S → +A | -A | цB
A → цB
B → цB | ε

Отобразим граф данной грамматики:

Синтаксические диаграммы автоматных языков - рисунок порядка автоматных языков Урок, Программирование, Теория, Длиннопост

Граф КА распознавателя языка целых чисел со знаком

Условимся что, автомат принимает вместо пустой цепочки ε, конечный символ ⊥, который будет означать конец принимаемой цепочки. Подобным образом обрабатываются строки в языке C, в нём используется так называемый нуль-терминал или по-русски нуль-концевик.

Теперь возьмём и заменим вспомогательные символы в графе на точки, а символы основного алфавита наоборот выделим в круги.

Синтаксические диаграммы автоматных языков - рисунок порядка автоматных языков Урок, Программирование, Теория, Длиннопост

Рисунок порядка языка целых чисел со знаком

Теперь мы можем наблюдать два столпа программирования ветвление и цикл, а так же последовательность их выполнения. На рисунке порядка они отчётливо отображены, что позволяет легко описать в коде алгоритм:

Синтаксические диаграммы автоматных языков - рисунок порядка автоматных языков Урок, Программирование, Теория, Длиннопост

Псевдокот

Определённо вы заметили, что этот код можно упростить, а это намекает нам и на то, что можно упростить и рисунок порядка. Что же займёмся этим:

Синтаксические диаграммы автоматных языков - рисунок порядка автоматных языков Урок, Программирование, Теория, Длиннопост

Упрощённый рисунок порядка

Синтаксические диаграммы автоматных языков - рисунок порядка автоматных языков Урок, Программирование, Теория, Длиннопост

Псевдокот

В рисунке порядка, у нас есть центральная линия последовательности и конечные символы + и - отходят от неё и заново возвращаются, что следует расценивать как не обязательные части порождаемой (принимаемой) цепочки. Такая же ситуация и с циклом, мы не всегда в него попадаем.

Синтаксические диаграммы автоматных языков - рисунок порядка автоматных языков Урок, Программирование, Теория, Длиннопост

Пример описания необязательной части цепочки

На этом тема закрыта, но! Должен отметить тема синтаксических диаграмм, пока-что до конца не описана, мы её коснёмся ещё раз, но уже при рассмотрении КС-грамматик.

З.Ы, Подписывайтесь рофлов ради, али кринжов. Ну или из любопытства. Хорошего настроения.

UPD:

Читать далее...

Показать полностью 5
12

Преобразование НКА в ДКА, один из алгоритмов

Предыдущая статья: Обещанная реализация КА и попытка создать таблицу переходов не детерминированному автомату. в vk.com

Что же давайте, ещё раз обратимся к нашему НКА и всё таки составим таблицу, в которую будем вписывать не к какому состоянию требуется перейти, а в какое состояние мы можем перейти, будем заполнять множеством состояний. Предоставляю граф и таблицу:

Преобразование НКА в ДКА, один из алгоритмов Программирование, IT, Образование, Урок, Длиннопост
Преобразование НКА в ДКА, один из алгоритмов Программирование, IT, Образование, Урок, Длиннопост

Символ Ø обозначает, что наш автомат завершил работу и более не принимает символов. Если мы продолжаем читать из потока, тогда нам следует перезапустить автомат для обработки уже следующей цепочки.

Приступим к алгоритму. Построим новый автомат на базе состояний нашего НКА. Состояния нового автомата будут иметь названия составляющие все возможные сочетания из множества состояний НКА по k, где k у нас будет меняться от 1 до максимального кол-ва. То есть в нашем случае до 3 из множество {S, B, K } это S, B, K, SB, SK, BK, SBK.

Состояния нового автомата в чьи имена попали, обозначения конечного состояния НКА, тоже становятся конечными: K, SK, BK, SBK. А начальное состояние не меняется S.

Теперь нам остаётся задать переходы по каждому символу, соблюдая следующее: Из каждого состояния N нового автомата направим не более чем один переход, помеченный данным символом, в такое состояние, которое соответствует множеству состояний НКА, в которые есть переходы по этому символу хотя бы из одного состояния НКА, образующего N.

Вот так:

Преобразование НКА в ДКА, один из алгоритмов Программирование, IT, Образование, Урок, Длиннопост

Давайте построим для него граф:

Преобразование НКА в ДКА, один из алгоритмов Программирование, IT, Образование, Урок, Длиннопост

У нас получился ДКА, только в нём есть состояния в которые мы никогда не попадём. Поэтому данный ДКА следует минимизировать, алгоритма минимизации возможно коснусь в последующих статьях. Но можно выделить две вещи, когда следует минимизировать ДКА, когда у нас «мертвые» состояния и когда состояния повторяют одно и то же действие. Вот так будет выглядеть результат минимизация получившегося ДКА:

Преобразование НКА в ДКА, один из алгоритмов Программирование, IT, Образование, Урок, Длиннопост

Переименуйте BK в B и узнаете уже рассмотренный нами ДКА.
З. Ы. Для построения графов в этот раз использовал эти инструменты https://www.graphviz.org/download/ и можно web-версию использовать http://www.webgraphviz.com/. Следующая статья будет посвящена синтаксическим диаграммам автоматного языка. Не забывайте подписываться, если вам это интересно.=)

UPD:

Читать далеее...

Показать полностью 4
6

Обещанная реализация КА и попытка создать таблицу переходов не детерминированному автомату

Предыдущая статья: Конечные автоматы, что там внутри? в vk.com

Как-то никто не голосует, поэтому решил выпустить раньше, язык реализации выбрал на своё усмотрение, посмотреть можно здесь. Пример основан на автомате из прошлой статьи.

Давайте попробуем создать таблицу переходов для этого автомата:

Обещанная реализация КА и попытка создать таблицу переходов не детерминированному автомату IT, Программирование, Образование, Полезное, Урок

Как-то не особо получается верно? Нам не совсем-то понятно когда переходить в состояние K, мы как-будто застряли в неопределенности. Когда приняли символ a оставаться в состоянии B или переходить уже к другому? Данные типы автоматов называются не детерминированные конечные автоматы или просто НКА, они обладают особой приметой, то что на один и тот же принятый символ в одном состоянии есть более одного варианта перехода. И всё таки мы можем написать для него функцию перехода, добавив какие нибудь условия, например проверять не последний ли это символ. Что же получается я слукавил в прошлый раз? И да и нет, жертва для более наглядного, постепенного объяснения. Да - потому-что функцию перехода можно реализовать разными способами. Нет - потому-что это частный случай реализации детерминированных конечных автоматов или просто ДКА, когда каждый его переход однозначен. ДКА - гораздо эффективнее НКА и у меня хорошие новости:
Теорема Клини. Для каждого НКА можно построить ДКА, допускающий тот же язык.

В следующей статье мы рассмотрим алгоритм преобразования НКА в ДКА, не забывайте подписываться. Все здоровья и удачи.

UPD:

Читать далее...

Рабочая ссылка с реализацией.

Показать полностью
12

Конечные автоматы, что там внутри?

Предыдущая статья: Графы автоматных грамматик. Что же, начинаем знакомиться с конечными автоматами? в vk.com

Если вы ознакомились со всеми прошлыми статьями, тогда вы готовы воспринять следующую информацию, я старался максимально кратко со всей ясностью подготовить вас, так-что попрошу вас заново перечитать. Приступаем, знакомимся с формулой конечного автомата:
A = (N, T, P, S, F)

Напоминает уже знакомую вам формулу грамматик? Давайте по порядку:
N - конечное множество состояний автомата, тот самый вспомогательный алфавит, плюс два или одно дополнительных состояния K и E, где E состояние ошибки и K дополнительное конечное состояние, если оно требуется.
Т - алфавит который принимает конечный автомат или тот самый основном алфавит грамматики.
P - функция переходов состояния автомата, принимает в себя текущее состояние автомата и подающий символ на рассмотрение, строится на основе правил вывода грамматики, ниже мы остановимся подробнее.
S - начальное состояние автомата.
F - множество конечных состояний автомата.

Ещё вы можете найти следующую формулу:
A = (N, T, O, δ, λ, F)
Где δ - функция переходов состояния автомата и записывают её так
δ : N × T → N означает что берется пара значений, одно из множества N, а другое из множества T и возвращает значение из множества N.
И λ - функция выходов, записывается λ : N × T → O , собственно O - означает выходной алфавит, или грубо говоря переводной. Например, сочтём за символы два слова, английское Hello из принимаемого алфавита и русское Привет из выходного алфавита, и во время работы автомата при некотором состоянии («контексте предложения»), принимает Hello и переводит его в Привет, ведь вполне может что в другом состоянии («контексте предложения») он может перевести его в Здравствуйте! =) Дальше повествование будет, только о автомате распознавателе, то есть без функции выходов, который описан выше, просто общий принцип функции переходов и выходов сильно не отличается.

Возьмем грамматику, я надеюсь уже любимого, языка идентификаторов:
G: S → aB
B → aB | bB | ε
И построим её граф.

Конечные автоматы, что там внутри? Программирование, Образование, Программист, IT, ВКонтакте (ссылка)

Все верно, граф грамматики это же и отображение конечного автомата, который принимает язык порождаемый грамматикой. Теперь остановимся по подробней на функции перехода на примере этого автомата, для этого создадим таблицу переходов.

Конечные автоматы, что там внутри? Программирование, Образование, Программист, IT, ВКонтакте (ссылка)

В таблице, жирным курсивом, отмечено состояние B, так как оно входит во множество конечных состояний и если автомат закончил принимать символы в одном из таких состояний, говорят что он принял данную цепочку. Так же вы видите состояние E, обычно его не отображают на графе, по одной просто причине, все пути веду в Рим к ошибке, когда подается символ не подходящий к состоянию или не входящий в алфавит который принимает автомат. Собственно наша функция обращается к этой таблице и переводит автомат, в то состояние которое получила из таблицы. Как-будто играет в морской бой, только с ответами ошибка, не ошибка.

Наверное вы заметили, что граф конечного автомата в прошлой статье и описанный в этой отличаются, хотя они принимают один и тот же язык? Об этом я расскажу в следующий раз, но перед этим я бы хотел показать вам программную реализацию КА на одном из языке программирования, на каком бы вы предпочли? Решение будет по результатам 3-его дня, после публикации статьи.

Опрос в vk.com у пикабушки нету =(
З. Ы. Подписывайтесь! =)

UPD:

Читать далее...

Показать полностью 2
Отличная работа, все прочитано!