2013-10-28 3 views
3

В настоящее время я изучаю компиляторы и имею некоторые проблемы с пониманием обычных наборов. Например, допустим, что у меня был набор двоичных строк (0, 1). Все ли целые числа, которые являются четными и положительными, считаются частью обычного набора? Допустим, у меня такой же набор, но вместо того, чтобы быть четным, они делятся на 5, будет ли он еще регулярным?Являются ли следующие наборы регулярными?

Я смотрел this helpful guide I found online, но я все еще смущен тем, что можно определить как обычный набор.

+1

Я знаю, как писать регулярные выражения, но я понятия не имею, о чем вы говорите. Возможно, вам стоит взглянуть на [CS.SE] (http://cs.stackexchange.com) и спросить об этом. – HamZa

+0

Да, это обычный, язык Как? Если вы разделите число на '5', то можете быть либо 0, 1, 2, 3, 4 (это похоже на то, что вам нужно пять статистических данных в DFA). Добавление бит к числу всегда перемещается только на один из возможных 5 этапов (нет другого возможный ход). Таким образом, любой экземпляр времени, в течение которого вы требовали только ограниченную информацию для запоминания, чтобы обрабатывать строку языка. Следовательно, это обычный язык. –

ответ

2

Все ли четные и положительные числа считаются частью обычного набора?

Да! Вы можете сгенерировать их с помощью этого регулярного выражения:

2 | 4 | 6 | 8 | (0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9) + (0 | 2 | 4 | 6 | 8)

Допустим, у меня такой же набор, но вместо того, чтобы быть ровным , они делятся на 5, будет ли он по-прежнему регулярным множеством?

Да! Репродукция:

5 | (0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9) + (0 | 5)

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

Надеюсь, это поможет!

+0

Почему вы не использовали классы символов? '[02468] | [0-9] + [02468]', который может быть упрощен до '[0-9] * [02468]'. '[05] | [0-9] + [05]' -> '[0-9] * [05]'. Не забывайте, что 0 делится на 2 и 5 :) – HamZa

+1

@ Hamza. Поскольку вопрос касался математических регулярных выражений, а не программных регулярных выражений, я не хотел использовать синтаксис, специфичный для инструментов. (Проверьте ссылку OP). Кроме того, в конкретном вопросе речь идет о * положительных * кратных значениях 2 и 5, поэтому я специально упустил 0. – templatetypedef

+0

Имеет смысл, спасибо – HamZa

Смежные вопросы