a^n b^n
:
Рассмотрим CFG:
S ::= aSb | <empty string>
Генерирует все строки a^n b^n
с правильно совпадающими показателями. Причина, по которой это работает, заключается в том, что добавление a
с использованием этой грамматики также требует добавления дополнительного b
; Убедившись, что каждое производство сохраняет желаемое свойство (что число a
s совпадает с числом b
s), мы обеспечили (по индукции, так как свойство выполняется изначально, и каждое производство сохраняет это) что оно будет выполняться для каждого предложения, которое мы генерируем из грамматики.
a^n b^m c^(n+m)
:
Если мы хотим создать грамматику для генерации чуть более сложной a^n b^m c^(n+m)
, мы можем применить аналогичные рассуждения: мы кодируем в структуре грамматики, что добавление a
или b
требует добавления c
:
S ::= aSc | T | <empty string>
T ::= bTc | <empty string>
Опять же, поскольку каждое произведение сохраняет желаемое свойство (число c
s равно числу a
s плюс число b
s), оно будет сохраняться для любого предложения, которое мы генерируем в грамматике. .
Вы можете применить аналогичные рассуждения, чтобы вычислить грамматики, которые сохранят другие математические свойства, упомянутые вами в ОП.