Как я могу доказать, что этот язык является регулярным?

Я пытаюсь доказать, если этот язык:

L = {w = {0,1} * | #0(w)% 3 = 0} (число 0 делится на 3)

регулярно пользуется леммой прокачки, но я не могу найти способ сделать это. Все остальные примеры, которые я получил, имеют простую форму или, скажем, более определенную форму, такую ​​как w = ax by cz и т. Д.

3 ответа

Любая строка на этом языке, содержащая не менее трех символов, имеет это свойство: либо строка имеет " 1"в нем или их три" 0 подряд.

Если строка содержит 1 , затем вы можете разделить его, как в лемме прокачки и установить у, равный некоторому 1 в строке. Тогда очевидно, что строки xyz, xyyz, xyyyz и т. Д. Находятся в языке, потому что все эти строки имеют одинаковое количество нулей.

Если строка не содержит 1 , он содержит три 0 подряд. Установка Y для этих трех 0 s, должно быть очевидно, что xyz, xyyz, xyyyz и т. д. все в языке, потому что вы добавляете три 0 символы каждый раз, так что у вас всегда есть ряд 0 делится на 3.

@justhalf в комментариях совершенно правильно; Лемму накачки можно использовать для доказательства того, что можно качать обычный язык или что язык, который нельзя накачать, не является регулярным, но вы не можете использовать лемму накачки, чтобы доказать, что язык в первую очередь является регулярным. Моя вина.

Вместо этого, вот доказательство того, что данный язык является регулярным на основе теоремы Майхилла-Нерода:

Рассмотрим множество всех строк 0 с и 1 s. Разделите эти строки на три набора:

E 0, все строки такие, что число 0 s кратно трем,

E 1, все строки такие, что число 0 s больше, чем кратно трем,

Е 2, все строки такие, что количество 0 s на два больше, чем кратно трем.

Очевидно, что каждая строка 0 с и 1 s находится в одном из этих трех наборов.

Кроме того, если x и z обе строки 0 с и 1 s, то рассмотрим, что это значит, если конкатенация xz находится в L:

  1. Если x находится в E 0, то xz находится в L тогда и только тогда, когда z находится в E 0

  2. Если x находится в E 1, то xz находится в L тогда и только тогда, когда z находится в E 2

  3. Если x находится в E 2, то xz находится в L тогда и только тогда, когда z находится в E 1

Следовательно, на языке теоремы нет различающего расширения для любых двух строк в одном из наших трех наборов E i, и, следовательно, существует не более трех классов эквивалентности. Конечное число классов эквивалентности означает, что язык регулярен.

(на самом деле, существует ровно три класса эквивалентности, но это не нужно)

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

1 * (01 * 01 * 01 *) *

(доказательство: регулярное выражение явно не принимает ни одну строку, у которой число 0 не делится на 3, поэтому нам просто нужно доказать, что все возможные строки, у которых число 0 делится на 3, принимаются этим регулярным выражением, которое это можно сделать, подтвердив, что для строк, содержащих 3n 0, регулярное выражение соответствует ему, поскольку 1n001n101n201n3... 01n3n-201n3n-101n3n имеет то же самое число 0 и nk можно заменить так, чтобы оно совпадало со строкой и чтобы этот формат был четко принят регулярным выражением)

Насосная лемма не может быть использована для доказательства правильности языка, потому что мы не можем установить y как в ответе Даниэля Мартина. Вот контрпример в том же формате, что и его ответ (пожалуйста, исправьте меня, если я делаю что-то принципиально отличное от его ответа):

Докажем, что язык L = {w = 0n1p | n ∈ N, n> 0, p простое число} регулярно с использованием леммы прокачки следующим образом: обратите внимание, что есть хотя бы одно вхождение 0, поэтому мы принимаем y в качестве 0 и имеем xyk z = 0n + k- 11р, которые все еще удовлетворяют определению языка. Следовательно, L регулярно.

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

  • Язык является регулярным тогда и только тогда, когда его распознает какой-то недетерминированный конечный автомат.
  • Автомат - это конечный автомат.

Мы должны построить автомат, который восстанавливает L.
Для каждого государства мыслить так:

  • "Где я?"
  • "Куда я могу пойти, с какой-то данной записью?"

Итак, для L = { w={0,1}* | #0(w) % 3 = 0 }
Возможные варианты (состояния): Остаток (остаток от деления) равен 0, 1 или 2. Это означает, что нам нужно три состояния. Пусть q0, q1 и q2 - состояния, представляющие оставшиеся деления 0,1 и 2 соответственно.

q0 - начальное и конечное состояние.
Теперь для записей "0" выполните математику # 0 (w)% 3 и перейдите в соответствующее состояние.
Переходные функции:
f (q0, 0) = q1
f (q1, 0) = q2
f (q2, 0) = q0

Для записей "1" он просто зацикливается, где бы он ни находился, потому что он не меняет состояние машины.
f (qx, 1) = qx


Лемма прокачки доказывает, что какой-то язык не является регулярным.
Вот хорошая книга по теории вычислений: Введение в теорию вычислений, 3-е издание, Майкл Сипсер.

Другие вопросы по тегам