Число «а» в два раза больше числа «б».
Точная грамматика:
S = (a|b)* where N_a(S)=2*N_b(S)
N_a (X) означает количество 'a в X. и т. Д.
В любой момент времени в стеке могут быть все «а» или все «б». Зачем? потому что нет переходов a / xxbxx или b / xxaxx.
Случай 1: стек - это все "а".
Вы можете увидеть цикл будет иметь вид:
a (a * b) +, если в последний раз мы возьмем переход L, a / L в (2-> 1)
a (a * b) + a, если в последний раз мы возьмем переход a, Z0 / Z0 в (2-> 1). и последнее 'a' ничего не вытолкнет из стека.
в каждом цикле, число 'a' - два. и номер цикла совпадает с номером «b» (кроме случаев, когда a, Z0 / Z0 произошли в последний раз)
мы возьмем последний переход L, a / L, если число 'a' еще до последнего 'b'
мы возьмем последний переход a, Z0 / Z0, если число «a» будет нечетным перед последним «b». a, Z0 / Z0 принимает еще один 'a'
Таким образом,
A1=a(a*b)+a where N_a(A1)=2*N_b(A1), N_a(A1) is even
A2=a(a*b)+ where N_a(A2)=2*N_b(A2), N_a(A2) is even
Это уменьшит до:
A=a(a|b)+ where N_a(A)=2*N_b(A), N_a(A) is even
(мы будем в состоянии 1, а стек пуст)
Случай 2: стек - все "b".
Точно так же вы можете видеть, что каждый цикл будет иметь форму: b * ab * a.
и в каждом цикле будет выталкиваться ровно один «b».
Всякий раз, когда принимается «b», a «b» помещается в стек.
Таким образом, когда стек пуст, и мы вернулись в состояние 1, число циклов будет взято равным числу 'b', которые мы приняли / поместили в стек. Таким образом,
B=b(b*ab*a)^n where N_b(B)=n
Но вы можете видеть, n = N_a (B) / 2. Таким образом,
B=b(b*ab*a)+ where N_a(B)=2*N_b(B)
Это уменьшит до:
B=b(b|a)+ where N_a(B)=2*N_b(B)
И так как существует только два возможных пути (A или B), и цикл может быть взят 0 или 1 раз,
Таким образом,
S=(A|B)*
A=a(a|b)+ where N_a(A)=2*N_b(A)
B=b(b|a)+ where N_a(B)=2*N_b(B)
Это уменьшит до:
S=((a|b)+)* where N_a(S)=2*N_b(S)
, который уменьшится до:
S=(a|b)* where N_a(S)=2*N_b(S)
1064 * что и требовалось доказать *