Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






  • Сервис онлайн-записи на собственном Telegram-боте
    Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое расписание, но и напоминать клиентам о визитах тоже. Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.
    Для новых пользователей первый месяц бесплатно.
    Чат-бот для мастеров и специалистов, который упрощает ведение записей:
    Сам записывает клиентов и напоминает им о визите;
    Персонализирует скидки, чаевые, кэшбэк и предоплаты;
    Увеличивает доходимость и помогает больше зарабатывать;
    Начать пользоваться сервисом
  • Порождающие грамматики






    Классическая теория формальных языков изучает синтаксис (словосочетания) языка.

    Вводится математическая модель синтаксиса, которая описывает механизмы порождения и распознавания «правильно построенных» слов языка.

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

    Классическим способом определения языков является определение их с помощью порождающих грамматик (грамматик Холмского).

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

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

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

    Терминал (терминальный символ) — объект, непосредственно присутствующий в словах языка, и имеющий конкретное, неизменяемое значение (обобщение понятия «буквы»).

    В формальных языках, используемых на компьютере, в качестве терминалов обычно берут все или часть стандартных символов ASCII — латинские буквы, цифры и спец. символы.

    Нетерминал (нетерминальный символ) — объект, обозначающий какую-либо сущность языка (например: формула, арифметическое выражение, команда) и не имеющий конкретного символьного значения.

    Словами языка, заданного грамматикой, являются все последовательности терминалов, выводимые (порождаемые) из начального нетерминала по правилам вывода.

    Чтобы задать грамматику, требуется:

    ¾ задать алфавиты терминалов и нетерминалов,

    ¾ набор правил вывода,

    ¾ выделить в множестве нетерминалов начальный.

    Порождающая грамматика задается упорядоченным набором из четырех компонент:

    G =(T, N, P, S,), где

    · T — алфавит, содержащий множество терминалов;

    · N — алфавит, содержащий множество нетерминалов, причем NT;

    · S — стартовый (начальный) символ из набора нетерминалов S Î N. Он называется аксиомой.

    · P — конечное множество правил выводаили продукций. Каждое правило вывода имеет вид:

    «левая часть» ®«правая часть»,

    «Левая часть» продукции — это непустая последовательность терминальных инетерминальных символов, содержащая хотя бы один нетерминал.

    «Правая часть» — это любая (в том числе и пустая) последовательность терминальных и нетерминальных символов.

    Для записи правил вывода с одинаковыми левыми частями

    a ® b 1 a ® b 2... a ® b n

    будем пользоваться сокращенной записью

    a ® b 1| b 2|...| b n.

    Каждое b i, i = 1, 2,..., n, будем называть альтернативой правила вывода из цепочки a.

    Алфавит называется объединенным алфавитом грамматики.

    P ⊂ (Т∪ N)+ × (Т∪ N)

    Будем обозначать:

    элементы множества T строчными буквами из начала латинского алфавита,

    элементы множества N — заглавными латинскими буквами.

    Пример. Пусть даны множества

    T = {a, b, c}, N = {S},

    P = {S → acSbcS, cS → ε }.

    Тогда ( T, N, P, S) является порождающей грамматикой.

    Пример. Пусть даны множества

    T = {0, 1 }, N = {А, S},

    P = {S → 0А1, 0А → 00А1, А → ε }.

    Тогда G1 = ( T, N, Р, S) является порождающей грамматикой., а слово (цепочка) непосредственно выводимо из в грамматике G1, так как существует соответствующее правило в Р.

     

    Цепочка b Î (TÈ N)* выводима из цепочки a Î (TÈ N)+в грамматике G = ( T, N, Р, S), если существуют цепочки g0, g1,..., gn (n> =0), такие, что

    a = g0® g1®... ® g n = b.

    Обозначаем:

    Последовательность g0, g1,..., gn называется выводом длины n.

     

    В последнем примере

    т.к. существует вывод

    S ® 0A1 ® 00A11 ® 000A111.

    (S → 0А1, 0А → 00А1)

    Длина вывода равна 3.

    Пример. Пусть

    G = ({a, b, c}, {S}, {S → acSbcS, cS → ε }, S).

    Тогда .

    Языком, порождаемым грамматикой G = ( T, N, Р, S)

    называется множество L (G) = { a Î T * | }.

    Другими словами, L (G) - это все цепочки в алфавите T, которые выводимы из S с помощью P.

    Например, L(G1) = {0n1n | n> 0}.

    Пример. Пусть G = á { a, b }, { S }, { S a bb, S a aSa }, S ñ. Последовательно применяем правила вывода и находим слова языка в терминальном алфавите:

    S a bb,

    S a aSa a abba,

    S a aSa a aaSaa a aabbaa,

    S a aSa a aaSaa ….a anbban

    Язык, порождаемый этой грамматикой, имеет вид

    L (G)={ anbban | n ³ 0}.

     

    Грамматики G1 и G2 называются эквивалентными, если L (G1) = L (G2).

    Пример.

    G1 = ({0, 1}, {A, S}, P1, S) и G2 = ({0, 1}, {S}, P2, S)

    P1: S ® 0A1 P2: S ® 0S1 | 01

    0A ® 00A1

    A ®e

    эквивалентны, т.к. обе порождают язык L(G1) = L(G2) = {0n1n | n> 0}.

     

    Грамматики G1 и G2 почти эквивалентны, если

    L (G1) È {e} = L (G2) È {e}.

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

    Пример.

    G1 = ({0, 1}, {A, S}, P1, S) и G2 = ({0, 1}, {S}, P2, S)

    P1: S ® 0A1 P2: S ® 0S1 | e

    0A ®00A1

    A ®e

    почти эквивалентны, т.к.

    L(G1)={0n1n | n> 0}, а L(G2)={0n1n | n> =0},

    т.е. L(G2) состоит из всех цепочек языка L(G1) и пустой цепочки, которая в L(G1) не входит.

     

    Наиболее распространенным способом задания (и распознавания) языка является использование автоматов.






    © 2023 :: MyLektsii.ru :: Мои Лекции
    Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
    Копирование текстов разрешено только с указанием индексируемой ссылки на источник.