Тема 4: свойства контекстно-свободных и автоматных языков.
Теорема об общем виде цепочек КС-языков и слов из него.
Определение операций над языками.
Операции над автоматными языками.
Операции над КС-языками.
Операции над контекстными языками.
Выводы для практики.
Неоднозначность контекстно-свободных грамматик.
Теорема об общем виде цепочек КС-языков (теорема о разрастании).
Для любого КС-языка Lсуществует такое натуральное числоp>0 что для любой цепочки, принадлежащей языкуL, длина которой большеp, существует хотя бы один вариант разбиения этой цепочки на 5 частей такой что выполняется условие теоремы.
Доказательство: в качестве pрассмотрим максимальную длину цепочки, полученную бесповторным деревом вывода. Каждый нетерминал используется 1 раз.
Sαβ2jφ2µ € L, в общем виде:αβijφiµ € L
αAµ
βφ
y
Следствие 1: Для любого автоматного языкаLсуществует такое натуральное числоp, что для любой цепочки ψ €L, |ψ|>pсуществует хотя бы один вариант разбиения этой цепочки на три части такой что выполняется условие теоремы.
С учётом особенностей автоматных грамматик, положив часть цепочек ψ и µ, равные пустым цепочкам (см. теорему о КС-языках), получим доказательство следствия.
Следствие 2: язык цепочек видаxnynzw,n=(1,∞) нет ни одного варианта, удовлетворяющего условию теоремы.
При p=3, ψ =xxyyzz
x(1) = α,x(2) =β,y(1) =j,yz=φ,z= µ
или x(1) = α,x(2) =β,yy=j,z(1) =φ,z(2) = µ
xxxyyzyzz/€L
Максимальное число, которе можно получить из повторного дерева вывода: p=2.
xnyn,n>1ψxxyy
x(1) = α,xy=β,y(2) =j
или x(1) = α,x(2) =β,yy=j
xxyxyy/€L
Следствие 3: любой конечный язык является автоматным.
Доказательство: если в качестве самой длинной цепочки взять L, то ни одна из цепочек языка не удовлетворяет условию теорему, а значит теорема верна.
Следствие 4: язык арфметических выражений не является автоматным языком.
Доказательство аналогично предыдущему. Парное количество чего-то и вложенность циклов – это контекстно-свободный язык.
Следствие 5: языки программирования в общем случае не являются КС-языками (но являются контекстными).
Например, каждая процедура имеет одинаковое число параметров в каждом месте где она упоминается.
Язык, требующий описания идентификаторов, длина которых может быть произвольной до их использования, также не является контекстно-свободным.
На практике идентификатора обрабатываются на этапе лексического анализа, а контроль за их использованием выполняется в виде семантических процедур. Аналогично с описанием процедур.
Определение операций над языками.
Смысл: описываются маленькие языки, и, выполняя маленькие процедуры над этими языками, получают грамматики, которые порождают данные языки.
Операции, допустимые над множествами:
Объединение: L=L1⋃L2= { α | α €L1vα €L2}
Пересечение: L=L1⋂L2= { α | α €L1л α €L2}
Разность: L=L1\L2= { α | α €L1л α /€L2}
Дополнение: L=L1–L2= { α | α €L1vα €L2}
Конкатенация: L1®L2= { α =βj|β€L1,j€L2}
Итерация: L* = {φ* |φ€L}
Обращение: LR = {φR|φ€L}L= {abc,bm,aca}
Подстановка: L1aL2 – подстановка в первый язык вместо терминального символа «a» любой цепочки второго языка:
L1 = {cab, al}
L2 = {a, b}
LL21a = {cab, cbb, al, bl}
Задания к контрольной:
Составление автоматных грамматик.
Составление контекстно-свободных грамматик.
Программа-анализатор.
Конечные автоматы.
Операции над автоматными языками.
Класс называется замкнутым относительно некоторых операций, если в результате выполнения операций не происходит выхода за рамки класса.
Теорема: автоматные языки замкнуты относительно операций объединения, конкатенации, итерации, обращения, подстановки, пересечение, дополнения и разности.
Последние две операции рассматривать не будем. Все остальные рассматриваются на графе.
Операция объединения.
a
S1
S
S2
A2
C2
F2
D2
B2
b
A1
C1
D1
B1
F1
F
В операции объединения выполняется индексация нетерминалов обеих грамматик, добавляются вершины SиF. дуги, идущие изS1иS2дублируются и направляются из вершиныS. Аналогично дублируются дуги, идущие вF1иF2и направляются вF.F1иF2удаляются вместе с входящими в них дугами.S1иS2можно удалить, если отсутствуют петли и возвраты в эти вершины.
Операция конкатенации: после индексации нетерминалов обеих грамматик выполняется слияние вершин в вершину F1иS2.
S1
A1
C1
F1
D1
B1
S2
A2
C2
F2
D2
B2
S
A1
B1
C1
D1
F
Операция итерации: все дуги, идущие в F, дублируются и направляются вS.
Операция обращения: расщепляем SнаS’ иS’’ (если есть петли), получив вершину, в которую не будет ничего входить – будут только исходящие дуги. Стрелки ставим в обратном направлении.
S’
A1
B1
C1
D1
S
F
S
A1
B1
C1
D1
F
При наличии возвратов и петель для Sвыполняется операция расщепления исходной вершины на две.S’ дублирует дуги, исходящие изS’’. После этогоS’ становитсяF,FстановитсяSи меняется ориентация всех дуг на противоположные.
Операция обращения: берётся столько экземпляров автоматных грамматик, сколько символов, вместо которых происходит подстановка:
S1’’
A1
C1
F1
D1
B1
S0
S2’’
A2
C2
F2
D2
B2
S1’
S2’
F0
A0
C0
D0
B0
Грамматика, в которую выполняется подстановка, индексируется нулём. Каждый экземпляр, в который подставляется грамматика, индексируется от 1 до i, гдеi– число буквAвL1. Если подставляемая грамматика имеет циклы или возвраты в начальные вершины, для каждого экземпляра выполняется операция расщепления начальной вершины. После этого выполняется слияние вершиныSi’ с вершинами грамматикиG1, из которых исходят дуги, помеченныеA. АналогичноFiи вершины, в которые входят дуги, помеченныеA. После этого дуги, помеченныеAграмматикиG1, исключаются.
Операция пересечения выполняется не на графах, а на грамматике:
G1 = <VN1, VT1, S1, R = {A1 aB1}>
G2 = <VN2, VT2, S2, R = {A2 aB2}>
G1 ⋂ G2 = <VN1 ⋂ VN2, VT1 ⋂ VT2, S1 ⋂ S2, R1 ⋂ R2 = {A1 aB1 ⋂ A2 aB2}>
G1: S1 aB1 и B1 cF1 | αF1
G2: S2 aK2 | cK2 и K2 cF2
G1 ⋂ G2: <S1S2> a<B1K2> и <B1S2> c<F1K2> - тупик, можно убрать и <B1K2> c<F1F2>.
12 октября 2013 г.
Практика №3.
Задание 1: Опишите словами множество состояний автоматов:
\ |
A |
B |
C |
0 |
B |
B |
C |
1 |
A |
C |
C |
|
0 |
0 |
1 |
\ |
A |
B |
C |
0 |
B |
C |
C |
1 |
C |
B |
C |
|
0 |
1 |
0 |
\ |
A |
B |
C |
D |
0 |
B |
D |
C |
D |
1 |
C |
B |
D |
D |
|
0 |
1 |
1 |
0 |
\ |
A |
B |
C |
D |
0 |
B |
D |
C |
D |
1 |
A |
C |
D |
D |
|
0 |
0 |
1 |
0 |
Автоматы детерминированные, так как в каждом состоянии только один символ.
Решение…
Для 1 таблицы:
1n0n1 – произвольное число нулей и единиц, которых может не быть.
m=(0, ∞).
n=(0, ∞).
Для 2 таблицы:
01n– произвольное число нулей и единиц, которых может не быть.
n=(0, ∞).
Для 3 таблицы:
01n– произвольное число нулей и единиц, которых может не быть.
10m
m=(0, ∞).
n=(0, ∞).
Для 4 таблицы:
1n010m
m=(0, ∞).
n=(0, ∞).
Рассмотрим недетерминированные автоматы:
\ |
A |
B |
C |
0 |
A,B |
|
C |
1 |
|
B,C |
|
|
0 |
0 |
1 |
\ |
A |
B |
C |
0 |
B |
|
|
1 |
|
C,A |
|
|
0 |
0 |
1 |
\ |
A |
B |
C |
D |
0 |
B |
C,D |
B |
|
1 |
|
B |
|
|
|
0 |
0 |
0 |
1 |
Для 1 таблицы:
0n1m0k– произвольное число нулей и единиц, которых может не быть.
m=(1, ∞).
n=(1, ∞).
k=(0, ∞).
Для 2 таблицы:
0 n1n– произвольное число нулей и единиц, которых может не быть.
n=(1, ∞).
Для 3 таблицы:
Из нуля можем попасть в B(0), изB– вCиD(00), оттуда – вB(0 или 00).
0(1n(00)m)k0
n=(0, ∞).
m=(0, 1).
k=(1, ∞).
Задание 2: Построить конечный автомат с входным алфавитом (0,1), который допускает следующее множество цепочек:
Все возможные цепочки, включая пустую.
Все цепочки кроме пустой.
Ни одной входной цепочки (автомат будет работать и ничего не распознавать).
Одну входную цепочку: 1,0,1.
Две входные цепочки: 0,1 и 0,1,0,0.
Входные цепочки, начинающиеся с 0 и заканчивающиеся на 1.
Все цепочки, состоящие из нулей и не содержащие единиц.
Все цепочки, содержащие в точности 1,1,1. Нулей может быть сколько угодно.
Все цепочки, в которых перед и после каждой единицы стоит 0.
1.
\ |
A |
0 |
A |
1 |
A |
|
1 |
2. Aне допускает обрыв цепочки.
\ |
A |
B |
0 |
B |
B |
1 |
B |
B |
|
0 |
1 |
3. Распознаёт пустую цепочку.
\ |
A |
0 |
|
1 |
|
|
0 |
4.
\ |
A |
B |
C |
D |
0 |
|
C |
|
|
1 |
B |
|
D |
|
|
0 |
0 |
0 |
1 |
5.
\ |
A |
B |
C |
D |
E |
0 |
B |
|
D |
E |
|
1 |
|
C |
|
|
|
|
0 |
0 |
1 |
0 |
1 |
7.
\ |
A |
B |
C |
0 |
B |
B |
|
1 |
|
B,C |
|
|
0 |
0 |
1 |
8.
\ |
A |
B |
C |
D |
0 |
A |
B |
C |
D |
1 |
B |
C |
D |
|
|
0 |
0 |
0 |
1 |
9.
\ |
A |
B |
C |
D |
0 |
A,B |
|
D |
A |
1 |
|
C |
|
|
|
1 |
0 |
0 |
1 |
Задание 3:Построить детерминированный автомат, эквивалентный следующему недетерминированному.
\ |
1 |
2 |
3 |
a |
2,3 |
|
1 |
b |
2 |
1 |
3 |
|
0 |
0 |
1 |
В 1 столбец вставляется новое состояние, включающее все начальные состояния НДА (если на пересечении строк и столбцов имеется несколько состояний и у которого несколько начальных состояний).
\ |
{1} |
{2,3} |
{2} |
{1,3} |
{1,2,3} |
a |
{2,3} |
{1} |
|
{1,2,3} |
{1,2,3} |
b |
{2} |
{1,3} |
{1} |
{2,3} |
{1,2,3} |
|
0 |
1 |
0 |
1 |
1 |
0 - без обрыва цепочки, 1 - допускает обрыв цепочки.
Если в имени новых состояний хотя бы одно состояние допускало обрыв цепочки, то всё состояние допускает обрыв.
Заменяем:
{1} – 1, {2,3} – 2, {2} – 3, {1,3} – 4, {1,2,3} – 5
Самостоятельно привести недетерминированные в детерминированные.
______________________________
Несколько слов по построению анализатора:
if<условие>then<оператор 1> [ELSE<оператор 2>];
<условие> ::= {<идентификатор>|<константа>} <оператор отношения <,>,= и т.п.> {<идентификатор>|<константа>}
<оператор 1> ::= <идентификатор>:= {<идентификатор>|<константа>} <арифметическая операция> {<идентификатор>|<константа>}
Граф:
0 if0условие0then0оператор 10;0else0оператор 20;(F).
Борьба с пробелами:
0 _1 состояние_1 состояние (пока есть пробелы)условие…
0 идентификатор или константа0оператор отношения0идентификатор или константа⊥
26 октября 2013 г.
Практика №3.
SaA|aB|bB|bD
AaB|aS|bD
BcS|cB|bD|bF’
DdD|dB|bB|bA|aF’|cF’
F’ ⊥F
<S> a<AB>|b<BD>
<A> a<BS>|b<D>
<B> c<BS>|b<DF’>
<D> d<BD>|b<AB>|a<F’>|c<F’>
<F’> ⊥<F>
<AB> a<BS>|b<DF’>|c<BS>
<BD> c<BSF’>|b<DF’AB>|d<BD>|a<F’>
<BS> a<AB>|b<BDF’>|c<BS>
<DF’> a<AB>|b<BDF’>|c<BS>
<DF’> d<BD>|b<AB>|b<F’>|c<F’>|⊥<F>
<BSF’> a<AB>|b<BDF’>|c<BS>|⊥<F>
<DF’AB> a<BSF’>|b<DF’AB>|d<BD>|c<BSF’>|⊥<F>
<BDF’> c<BSF’>|b<DF’AB>|d<BD>|a<F’>|c<F’>|⊥<F>
<S> = S, <AB> = A, <BD> = B; <BS> = C; <DF> = D; <BSF’> = E; <DF’AB> = G; <BDF’> = H; <F’> = F’; <F> = F.
S aA|bB
A aC|bD|cC
B cE|bG|dB|aF’
C aA|bH|cC
D dB|bA|aF’|cF’|⊥F
E aA|bH|cC|⊥F
G aE|bG|dB|cE|⊥F
H cE|bG|dB|aF’|cF’|⊥F
Задача №2: устранить и исключить тупики из следующих правил…
S aBcD|kLMp
B cLpDq|pDc|f
D fDr|f
F a|b
L fM
M Lk|pMLc
K rF
Шаг 1.
X0 = VT
X1 = {B,D,F}
X2 = {B,D,F,S,K}
X3= {B,D,F,S,K}
L,M– циклический тупик внешнего типа, поскольку изLмы никуда не попадаем кромеLиMи также изM– только вLиM.
Шаг 2:
DfDr|f
Fa|b
KrF
Y0= {S} – множество нетерминаловS.
Y1= {S,B,D} – множество нетерминалов, в которые можно попасть не более чем за 1 шаг изS.
Y2= {S,B,D}
K,F– тупики внутреннего типа.
Задача №3.
SAB|BC|kL
BBS|AL
CQS|dC
MxN|yM|zS|h
A aA|bL|c
L cB|f
Q qQ|aC
N xC|a|bM
Шаг 1.
x0 = {VT}
x1= {M,A,L,N} – вMесть терминалh.
x2 = {M,A,L,N,S,B}
x3 = {M,A,L,N,S,B}
Q,C– циклический тупик внешнего цикла.
Шаг 2.
S AB|BC|kL
B BS|AL
A aA|bL|c
y0 = {S}
y1 = {S,A,B,L}
y2= {S,A,B,L}
M,N– циклический тупик внутреннего типа.
Задача №4: устранить аннулирующее правило из следующих грамматик:
S aCDe|Kp
C dSa|ε
D dD|DD|a|fK|ε
K a|b
Шаг 1.
x0 = ε;
x1 = {C,D}
x2 = {C,D}
S
€ x2
ε € L
S aCDe|aDe|aCe|ae|Kp
C dSa
D dD|d|DD|D|a|fK
Ka|b
Задача №5: устранить аннулирующее правило из следующих грамматик:
S aSbS|bSaS|ε
Шаг 1.
x0 = ε
x1 = {S}
S € x1
ε € α
S S1|ε
S1 aS1BS1|bS1aS1|abS1|aS1b|ab|baS1|bS1a|ba
Задача №6: устранить аннулирующее правило из следующих грамматик:
S ABC
B CC|a
A BB|ε
C AA|b
Шаг 1.
x0 = ε
x1 = {A}
x2 = {A,C}
x3 = {A,C,B}
x4 = {A,C,B,S}
Шаг 2.
Делается замена и добавляется правило SS1.
S1 ABC|AC|AB|BC|A|B|C
B CC|a|C
A BB|B
C AA|b|A
Задача №7: устранить цепные правила из грамматики.
S S+T|T
T T*F|F
F (S)|a
Шаг 1.
S S+T|T*F|(S)|a – ответ.
TT*F|(S)|a– подставляем вместоF: (S)|a
F(S)|a
Задача №8: найти приведённую грамматику, эквивалентную следующей…
S A|B
B D|E
A C|D
C S|a|ε
DS|b
ES|c|ε
Приведённой является грамматика, в которой нет тупиковых, обобщённых и цепных правил.
Шаг 1.
x0=VT
x1= {C,D,E} – там, где есть терминальные символы.
x2 = {C,D,E,B,A}
x3 = {C,D,E,B,A,S}
Нет тупиков внешнего типа. Изо всех правил можно перейти в другое.
Шаг 2.
y0= {S}
y1= {A,B} – куда попадаем изSне более чем за 1 шаг.
y2= {S,A,B,C,D,E}
Нет тупиков внутреннего типа аналогично.
Шаг 3.
x0=ε
x1= {C,E}
x2 = {C,E,A,B}
x3 = {C,E,A,B,S}
x4 = {C,E,A,B,S,D}
S € x4 ε € L.
S a|b|c| ε.
9 ноября 2013 г.
Практика №4.
Задание №1: устранить левую рекурсию.
S AB
A Aa|Ab|d|c
B qK|rB|Bf|Bg
K aS|b
S AB
A dA’|cA’
A’ aA’|bA’|ε
B qKB’|rBB’
B’ fB’|gB’|ε
k aS|b
Свойства языков.
Задание №2: доказать что язык автоматный.
{0n10n},n>= 1;
ψ=αβ¥,p= 3;
αβj¥ €α
ψ= 00100, 00 + 10 + 0
Размножаем: 00 (α) + 1010 (β2) + 0 (¥)
Или: 00 (α) + 11 (β2) + 00 (¥)
Значит не существует ни одного варианта, удовлетворяющего условию теоремы, и язык не автоматный.
Задание №3: {aibicj},i,j>= 1;j<=i; - доказать что цепочка не принадлежит КС-языку. Для КС-языка нужно разбить цепочку уже на 5 частей
Рассмотрим цепочку, у которой i=j:
αβ¥φµ:
ψ = aabbcc,a(α) +ab(β) +b(¥) +c(φ) +c(µ):
Размножаем:
a + abab + b + cc + c €
L
ψ = aabbcc, a (α) + a (β) + b (¥) + b (φ) + cc (µ):
aa
+ bb + b + cc + c €
L
Задание №4: выполнить все допустимые операции над следующими автоматными грамматиками:
G1: S aA|bB|c
A aS|a
S B
G2: S aA
A bA|bC
C aA|cS|d
Объединение
Конкатенация
Итерация для 1 грамматики
Обращение для 2 грамматики
Подстановка первой вместо второй
Пересечение
Первые пять выполняем как графы на страницах 21-25.
Шестая операция: ищем общие нетерминалы между каждыми группами:
<S1, S2> a <A1, A2> - тупик // из S1 или S2 попадаем в A1 A2.
<S1, A2> b <B1, A2> | b <B1, C2>
<S1, C2> a <A1, A2> | c <F1, s2>
<A1, S2> a <S1, A2> | a <F1, C2>
<A1, C2> a <S1, A2> | a <F1, A2>
<B1,A2>b<F1,A2> |b<F1,C2>
Ответ: G1в объединении сG2дают пустое множество.
Грамматики предшествования Вирта – к следующей
Лекция №5.
Контекстно-свободные языки замкнуты относительно операций объединения, конкатенации, итерации, обращения и подстановки, и не замкнуты относительно операций пересечения, дополнения и разности (автоматные языки замкнуты относительно всех операций).
Имеются языки L1(G1) и L2(G2).
G1 = (VT1, VN1, R1, S1)
G2 = (VT2, VN2, R2, S2)
Объединение: G1 v G2 = (VT1 v VT2, VN1 v VN2 v {S}, R1 v R2 v {S S1|S2}, S)
Конкатенация: G1 ® G2 = (VT1 v VT2, VN1 v VN2 v {S}, R1 v R2 v {S S1S2}, S)
Итерация: G1* = (VT1, VN1 v {S}, R1 v {S S1S|S2}, S)
S SS1|S1
S SS|S
Обращение: G1R= (VT1,VN1,R1R,S1), гдеR1R– правила с обращёнными правыми частями правил вывода.
R1 A α A abCAm|ba
R1R A αR A maCba|ab
G1G2a = ((VT1\{a}) v VT2, VN1 v VN2, (R1 \ {A αaβ}) v {A αS2β}, S1)
Если имеются L1= {ajbjci}L1⋂L2= {aibici}не КС-язык
Если множества не замкнуты относительно операции пересечения, то они не замкнуты относительно операции дополнения и разности.
Операции над контекстными языками:
7 декабря 2013 г.
Практика №7.
Грамматика предшествования по Флойду.
Выполнить разбор правильной и неправильной цепочек:
S |A.B|
A aA|a
B (B)|C
C 0|…|0|0C|…|9C
U L R
S | |
A a a
B (, 0|…|9 ), 0|…|9
C 0|…|9 0|…|9
S1/S2 | . a ( ) 0|…|9
| = <
. = < <
A > <
( < = <
) > >
0|…|9 > > <
- нетерминал, затем терминал