Конечные автоматы, как реализовать минимальные и максимальные попадания

Я пытаюсь реализовать fsm, и все идет нормально. Я могу вводить строки и смотреть, действительны ли они, и все такое прочее.

Однако регулярные выражения (которые являются fsms) имеют эту функцию, где вы можете указать, сколько раз может встречаться определенный символ, например, {2,4} будет принимать «аа» и «ааа», но не «ааааа» и «а».

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

Кто-нибудь знает способ реализовать эту функцию? он также должен работать с действительно большими числами, такими как {1,99999999999}


person Paul Boon    schedule 01.04.2016    source источник
comment
Хотите объяснить, какова связь между конечными автоматами и регулярными выражениями, и показать нам код?   -  person Andrea Casaccia    schedule 01.04.2016
comment
Регулярные выражения @andrea - это конечные автоматы   -  person Paul Boon    schedule 01.04.2016
comment
О, теперь все ясно... Я понимаю, что могу быть не экспертом в этом вопросе, но если вы хотите более четко объяснить проблему, вы можете помочь другим понять предмет и привлечь внимание и помощь большего числа людей.   -  person Andrea Casaccia    schedule 01.04.2016
comment
Разве aaa?a? не эквивалентно?   -  person Erick G. Hagstrom    schedule 01.04.2016
comment
Для конечных {n,m} вы можете уйти, взорвав FSM: просто сложите его на себя. опять и опять. Для бесконечных FSM вам понадобится стек для запоминания предполагаемых состояний.   -  person joop    schedule 01.04.2016
comment
@ Эрик регулярное выражение aaa?a? означает, что у вас может быть 3a, и вы можете добавить еще один, и нет, он заблокирует определенные строки, которые a{2,4} разрешит, как aa   -  person Paul Boon    schedule 01.04.2016
comment
@joop, может быть, ты что-то понял, но я не понимаю   -  person Paul Boon    schedule 01.04.2016
comment
@PaulBoon нет, aaa?a? соответствует как минимум двум a, за которыми могут следовать один или два других. Он соответствует аа, ааа и аааа и больше ничему.   -  person Erick G. Hagstrom    schedule 01.04.2016
comment
вы правы, я думал, что первые 3а были сгруппированы, но это не так. однако это не решает проблему, когда числа становятся действительно большими, например {1,9999999}, это также потребует такого количества состояний, и это не может быть хорошим решением.   -  person Paul Boon    schedule 01.04.2016
comment
Дело в том, что если вы реализуете aaa?a?, вы реализуете a{2,4}. Последнее обозначение является просто синтаксическим сахаром.   -  person Erick G. Hagstrom    schedule 01.04.2016
comment
@ErickG.Hagstrom, ты прав, но это не решение. с большими числами это потребовало бы многих состояний   -  person Paul Boon    schedule 01.04.2016
comment
На самом деле это единственное решение, если вы хотите реализовать его только с конечными автоматами.   -  person HenryLee    schedule 01.04.2016
comment
@HenryLee, как вы реализуете это, используя другие вещи?   -  person Paul Boon    schedule 01.04.2016
comment
Другие вещи включают машины Тьюринга, разве это не должно быть очень легко реализовать даже на языке C?   -  person HenryLee    schedule 01.04.2016
comment
Я хотел сказать, что если вы хотите использовать только конечный автомат для регулярного выражения, включающего {1, 100}, то вам нужно создать для него сотню состояний. В остальном все просто.   -  person HenryLee    schedule 01.04.2016


Ответы (1)


Насколько я понимаю, такое ограничение не может быть реализовано динамически в конечном автомате; части FSM должны быть статически расширены. В вашем примере для a{2,3} необходимо будет построить три разных отдельных FSM: один, принимающий aa, второй, принимающий aaa, и третий, принимающий aaaa; затем их нужно было бы сделать альтернативными в конечном автомате с помощью некоторых пустых переходов. Причина этого в том, что сам автомат не хранит путь, по которому было достигнуто его текущее состояние, а значит, пареметризированную форму шаблона a{i,j} нельзя проверить.

person Codor    schedule 01.04.2016
comment
означает ли это, что если я составлю регулярное выражение типа {1,999999999}, будет создано столько fsms? звучит маловероятно для меня - person Paul Boon; 01.04.2016
comment
Я разделяю здесь ваш скептицизм; Однако я не уверен, что реализации механизмов регулярных выражений используют только FSM. Если я не ошибаюсь, понятие регулярных выражений, обычно представленное во вводных курсах информатики, не точно соответствует регулярным выражениям, которые обычно реализуется. - person Codor; 01.04.2016
comment
я чувствую, что есть более элегантное решение, чем просто сделать кучу fsms - person Paul Boon; 01.04.2016
comment
Может быть, но, возможно, не с FSM. Вы знакомы с так называемой леммой о накачке для конечных автоматов? - person Codor; 01.04.2016
comment
да, я думаю, вы правы, но остается вопрос, как это делается? энди не слышал о насосной лемме - person Paul Boon; 01.04.2016
comment
Я не знаю, как это делается. Мне жаль, что понятия не совсем совпадают. По сути, лемма о накачке утверждает следующее: если автомат принимает слово длиннее, чем количество его состояний, то в автомате должен быть цикл на пути, который принимает ввод. Следовательно, должны быть приняты и другие слова, а именно те, где цикл произвольно повторяется или полностью удаляется. Более подробное описание можно найти здесь - person Codor; 01.04.2016