Пусть Σ = { a; b} Как я могу определить КПК в JFLAP, который распознает следующее?
L = {a^n b^k | 2n >= k}
Например: abb является элементом L, aabbb является элементом L, ε является элементом L, но babbb не является элементом L, abbb не является элементом L
1 ответ
Самая короткая строка в L
пустая строка, e
, Учитывая строку s
на языке действуют следующие правила:
as
вL
asb
вL
asbb
вL
Мы можем объединить эти наблюдения, чтобы получить грамматику без контекста:
S := aSbb | aSb | aS | e
По нашим наблюдениям, каждая строка, генерируемая этой грамматикой, должна быть в L
, Чтобы показать, что это грамматика для L
мы должны показать, что любая строка в L
может быть сгенерировано. Чтобы получить строку a^n b^k
мы можем сделать следующее:
- используйте правило № 1 выше
x
раз - используйте правило № 2 выше
y
раз - используйте правило № 3 выше
z
раз - обеспечивать
x + y + z = n
- обеспечивать
y + 2z = k
настройка y = k - 2z
и подставляя мы находим x + k - 2z + z = n
, Перегруппировка:
- если
k > n
, затемz
а такжеx
может быть выбран, однако желательно, покаk - n = z - x
, - если
k < n
, затемz
а такжеx
может быть выбран, однако желательно, покаn - k = x - z
, - Если
k = n
Заметьте, мы могли бы просто выбратьy = n
,
Обратите внимание, что мы всегда можем выбрать z
а также x
в нашем примере выше, так как 0 <= x, z <= n
а также 0 <= k <= 2n
,