Как мне построить этот конечный автомат?

Я учусь на тест дискретной математики, и я нашел это упражнение, которое я не могу понять.

"Построить базовый конечный автомат (DFA,NFA,NFA-лямбда) для языка в алфавите Sigma = {0,1,2}, где сумма элементов в строке четная И эта сумма больше 3"

Я попытался использовать теорему Клини, объединяющую два языка, например, объединяющую язык, связанный с этим регулярным выражением:

(00 U 11 U 22 U 02 U 20)* - четные элементы

с этим

(22 U 1111 U 222 U 2222)* - те, чья сумма больше 3

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

4 ответа

Решение

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

  • Я предполагаю, что * означает "0 или более раз". Однако одна из строк с суммой>= 3 должна появиться. Это говорит, что вам нужен + ("1 или более раз").
  • 112 и 211 отсутствуют в списке строк с суммой>= 3.
  • 222 и 2222 в этом списке излишни.
  • Все эти строки могут произвольно чередоваться с нулями.
  • Сумма 00 не больше, чем сумма 0.

Изменить: как насчет этого (акк является единственным принимающим государством, точка-источник):

http://student.science.uva.nl/~sschroev/so/885411.png

В состояниях a и c сумма строк всегда нечетна. В начале состояний b и acc сумма всегда четна. Кроме того, в начале сумма равна 0, в точке b она равна 2, а в точке d она равна>= 4. Это легко доказать. Следовательно, принимающее государство соответствует всем критериям.

Изменить 2: Я бы сказал, что это регулярное выражение, которое принимает запрошенный язык:

0*(2|(1(0|2)*1))(0*(2|(1(0|2)*1))+

Не уверен, что это ответ на ваш вопрос, но: вам нужно отправить регулярное выражение? или будет делать FSM?

В любом случае, может быть полезно сначала нарисовать FSM, и я думаю, что это правильный DFA:

http://img254.imageshack.us/img254/5324/fsm.png

Если это так, то при создании вашего регулярного выражения (которое, помните, имеет другой синтаксис, чем программирование "regex"):

0* указать "0 столько раз, сколько вы хотите". Это имеет смысл, так как 0 в вашей строке не меняет состояние машины. (Смотрите, в FSM 0 просто возвращается к себе)

Вам нужно будет учитывать различные комбинации "112" или "22" и т. Д., Пока вы не наберете по крайней мере 4 в своей сумме.

Если ваша сумма больше 3 и даже, тогда (0|2)* будет держать вас в конечном состоянии. В противном случае (сумма> 3 и нечетное) вам понадобится что-то вроде 1(0|2)*, чтобы вы могли принять вас.

(не знаю, помогает ли это, или если это правильно - но это может быть началом!)

Мне проще просто думать в терминах состояний. Используйте пять состояний: 0, 1, 2, ДАЖЕ, ODD

Переходы:

State, Input -> New State

(0, 0) -> 0
(0, 1) -> 1
(0, 2) -> 2

(1, 0) -> 1
(1, 1) -> 2
(1, 2) -> ODD

(2, 0) -> 2
(2, 1) -> ODD
(2, 2) -> EVEN

(ODD, 0) -> ODD
(ODD, 1) -> EVEN
(ODD, 2) -> ODD

(EVEN, 0) -> EVEN
(EVEN, 1) -> ODD
(EVEN, 2) -> EVEN

Только ДАЖЕ является принимающим государством.

Каждое выражение, руководствуясь Стефаном, может быть:

(0 * U 2 * U 11) * - четные суммы

с этим

(22 U 11 U 222 U 112 U 211 U 121)+ - те, чья сумма больше 3

Я не знаю, можно ли было бы упростить это больше, это помогло бы разработать автомат.

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