Создание контекстно-свободных грамматик для языков

Я беру курс по конечным автоматам. Я готовлюсь к промежуточному экзамену, и у меня возникли проблемы с созданием грамматик для определенных языков. Я нахожу простые очень интуитивно понятными, но когда они становятся более сложными, я, кажется, не знаю, с чего начать. Например:

L = { w E { a,b,c}* : nb(w) != na(w) + nc(w) }

Ответ:

S→S1 | S2
S1→bS3 | S3b | S3bS3
S3→S0 | S1
S2→XS4 | S4X | S4XS4
S4→S | S2
S0→bS0XS0 | XS0bS0 | e
X→a | c

Если бы кто-нибудь мог дать мне небольшое руководство по задействованному мыслительному процессу, я был бы очень признателен.


person PhilT    schedule 08.11.2010    source источник


Ответы (1)


Указанный вами язык неясен. Я предполагаю, что w E {a,b,c}* означает w ε {a,b,c}*, а nb(w) != na(w) + nc(w) означает, что все строки в языке имеют количество b, не равное сумме количества a и количества c.

Если это так, вы должны подумать о характеристиках всех строк, которые будут на языке, и всех характеристиках, которые исключают строку из этого языка.

Этот язык принимает строки, в которых количество b = / = количество a + количество c. Мы можем переформулировать этот язык так, чтобы он принимал строки, которые:

число a + число c> число b ИЛИ число a + число c ‹число b

Это объясняет первое S -> S1 | S2

S1 гарантирует наличие как минимум 1 b (S3), а затем форсирует либо равное количество b, сколько a и c (S0), или больше b, чем a и c (S1). Конечный результат правила S1 - это строка с большим количеством b, чем a и c.

S2 гарантирует, что имеется больше a и / или c, чем b. Он делает это, выставляя a или c (X), а затем разрешая равное количество a / c (S0) или больше a / c, чем b (снова S2).

Это характерно для вашего примера, но вы можете увидеть, как мыслительный процесс входит в создание этой грамматики:

  1. Сформулируйте язык в виде конкретных случаев (a's / c's> или ‹b's)
  2. Для каждого из случаев начните с того, чтобы убедиться, что регистр будет сохраняться (принудительно установите # b's>, чем a / c, заставив хотя бы один b), затем разверните строку, чтобы включить все возможности равных a / c и b или меньше a / c, чем b.
  3. Симметрично обработайте другой случай.

Проблема в том, что вам необходимо убедиться, что создается каждая строка на языке, а все строки не на этом языке не создаются. (перечитайте это до тех пор, пока не уляжется смысл)

person prelic    schedule 16.11.2010
comment
Большое спасибо за помощь, очень признателен! - person PhilT; 17.11.2010