Неограниченная грамматика: { sss | s существует в {a,b}* }
Как можно построить неограниченную грамматику для sss? Я знаю, что для того, чтобы построить ss, вам нужно создать ss^r и затем перевернуть вторую строку, но как это сделать для sss?
1 ответ
В этом может быть несколько ошибок, но идея должна привести вас на правильный путь.
// section 1
S := LTR
T := ATWX | BTYZ | N
// section 2
WW' := W'W
WY' := Y'W
YW' := W'Y
YY' := Y'Y
// section 3
WX' := W'X'
WZ' := W'Z'
YX' := Y'X'
YZ' := Y'Z'
// section 4
XW' := W'X
XX' := X'X
XY' := Y'X
XZ' := Z'X
ZW' := W'Z
ZX' := X'Z
ZY' := Y'Z
ZZ' := Z'Z
// section 5
XR := X'R
ZR := Z'R
// section 6
NW' := W'N
NX' := X'N
NY' := Y'N
NZ' := Z'N
NR := Q
// section 7
AQ := Qa
W'Q := Qa
X'Q := Qa
BQ := Qb
Y'Q := Qb
Z'Q := Qb
LQ := e
В разделе 1 изложена основная схема. Мы собираемся отметить начало и конец нашего рабочего пространства L и R, чтобы быть совершенно явными. T - наше рабочее пространство, а L и R - левый и правый маркеры. Наше рабочее пространство может добавить либо три a
s (это то, что A, W и X станут позже) или добавить три b
s (это то, чем B, Y и Z станут позже), или он может выйти, генерируя специальный нетерминальный N. N будет тем, что превращает нашу цепочку нетерминалов в цепочку терминалов, как мы увидим позже.
Итак, нам нужно xxx
за x
в (a+b)*
, A
а также B
добавить в конец первого x
из-за того, как мы организовали производство. Работа раздела 2 состоит в том, чтобы убедиться, что W
а также Y
добавить в конец второго x
, К сожалению, наши постановки ставят W
а также Y
в начале второго x
так что без коррекции мы бы в итоге xx^R
, Раздел 2 исправляет эту проблему, "плавая" W
а также Y
вправо, пока они находятся слева от W
или же Y
это уже нашло свое место. W
с и Y
Они не могут обгонять друг друга, и это гарантирует, что они остановятся в правильной последовательности, как только музыка остановится.
Раздел 3 показывает, как символы во втором появлении x
найти их правильные позиции. По сути, они движутся вправо (на основании раздела 2), пока не найдут символы третьего x
которые находятся на своих местах. Так как символы второго x
имеют свое место перед символами третьего x
последний возможный прямо перед любым символом третьего x
(X
или же Z
) является правильной позицией для каждого символа второго x
, Таким образом, мы плывем прямо до конца второго x
,
Мы повторяем процесс для третьего x
в разделе 4, хотя мы должны позволить этим символам (X
а также Z
) проплыть мимо всех символов второго или третьего x
которые уже нашли свои места. Эти символы не могут проходить сами, поэтому по той же логике, что и в разделе 2, мы получим символы в правильной последовательности.
Раздел 5 говорит, когда нужно останавливать плавающие символы, которые составляют третий x
направо. Помните конец маркера рабочего пространства R
? Последний символ третьего x
происходит полностью справа, прямо перед R
, И вот тогда мы узнаем, что нашли правильное место для символа.
Раздел 6 начинает процесс завершения нашего деривации. У нас есть прекрасная цепочка нетерминалов, и мы хотим превратить их в терминалы. Первое, что мы делаем, это плавающие N
направо мимо удачно расположенных символов второго и третьего x
до конца строки маркера R
, Нам не нужны R
для чего угодно, поэтому мы преобразуем N
в Q
, Как мы увидим в следующем разделе Q
это то, что заставляет волшебство случиться.
Раздел 7 описывает, как Q
плавает влево через всю цепочку нетерминалов, которые нашли свое место вплоть до L
, изменяя нетерминалы на соответствующий терминал по пути. Как только он находит L
, он стирает оба нетерминала, оставляя за собой только строку конечных символов. Вывод завершен.
Чтобы проиллюстрировать процесс, давайте сгенерируем aabaabaab
,
S
-> LTR
-> LATWXR
-> LAATWXWXR
-> LAABTYZWXWXR
-> LAABNYZWXWXR
-> LAABNYZWXWX'R
-> LAABNYZWXW'X'R
-> LAABNYZWW'XX'R
-> LAABNYZWW'X'XR
-> LAABNYZWW'X'X'R
-> LAABNYZW'WX'X'R
-> LAABNYZW'W'X'X'R
-> LAABNYW'ZW'X'X'R
-> LAABNYW'W'ZX'X'R
-> LAABNYW'W'X'ZX'R
-> LAABNYW'W'X'X'ZR
-> LAABNYW'W'X'X'Z'R
-> LAABNW'YW'X'X'Z'R
-> LAABNW'W'YX'X'Z'R
-> LAABNW'W'Y'X'X'Z'R
-> LAABW'NW'Y'X'X'Z'R
-> LAABW'W'NY'X'X'Z'R
-> LAABW'W'Y'NX'X'Z'R
-> LAABW'W'Y'X'NX'Z'R
-> LAABW'W'Y'X'X'NZ'R
-> LAABW'W'Y'X'X'Z'NR
-> LAABW'W'Y'X'X'Z'Q
-> LAABW'W'Y'X'X'Qb
-> LAABW'W'Y'X'Qab
-> LAABW'W'Y'Qaab
-> LAABW'W'Qbaab
-> LAABW'Qabaab
-> LAABQaabaab
-> LAAQbaabaab
-> LAQabaabaab
-> LQaabaabaab
-> aabaabaab