Создайте CFG из {w элемента {a, b} *: 2 # a (w) = 3 # b (w)} - PullRequest
1 голос
/ 20 марта 2020

Если у меня есть следующий язык {x является элементом {a, b} *, где 2 # a (x) = 3 # b (x), то cfg этого языка:

S => SaSaSaSbSbS | SaSaSbSaSbS | SaSaSbSbSaS | SaSbSaSaSbS | SaSbSaSbSaS | SaSbSbSaSaS | SbSaSaSaSbS | SbSaSaSbSaS | SbSaSbSaSaS | SbSbSaSaSaS | эпсилон / лямбда

Это правильно? Если это не правильно / есть другая более простая форма, вы можете сказать это? Я не имею понятия о другой форме, кроме этой.

1 Ответ

0 голосов
/ 20 марта 2020

На первый взгляд кажется, что это, вероятно, работает:

  1. ваш базовый случай хорош; пустая строка на языке

  2. вы покрываете все ваши индуктивные дела: вы добавляете только 2 a и 3 b и покрываете все соглашения

Я не вижу принципиально более простого решения, чем это, хотя вы могли бы удалить либо ведущую, либо конечную букву S с правой стороны всех произведений; затем, выбрав производство, вы будете использовать этот первый или последний символ терминала, но я думаю, что это все еще работает Возможно, даже удаляя как ведущий, так и конечный S, так что вы берете на себя обязательство и первого, и последнего Любое другое упрощение выглядит так, как если бы оно увеличивало число продукций или количество нетерминалов, или и то и другое, что, возможно, сокращая общее количество символов, необходимых для кодирования грамматики, возможно, не делает грамматику более простой (на самом деле, больше нетерминалов) и производство, как правило, рассматривается как более сложное, а не менее). Если вы хотите поэкспериментировать с добавлением продукций или нетерминалов, рассмотрите, например, T => Sa и R => Sb, просто чтобы сократить повторение.

...