Feb 15, 2010 14:47
Вчера возник такой занятный вопрос.
Существует ли алгоритм, который за конечное время по двум регекспам определяет, является ли множество строк, матчимых одним подмножеством строк, матчимых другим?
А для perl-овских регекспов?
P.S.
Думать и гуглить не пробовал.
geek,
question
Leave a comment
Comments 19
Reply
Reply
Интуиция обоснована следующим: если не является, то можно попробовать построить строку, которая матчится одним автоматом, и не матчится другим, идя по переходам, где автоматы не одинаковы.
Reply
(The comment has been removed)
Пусть мы хотим проверить, правда ли, что второй регексп мэтчит подмножество первого. Строим два DFA так, чтобы у них было по одному принимающему состоянию (f_1 и f_2 соответственно). Теперь по ним строим граф, в вершинах которого стоят пары (s_1, s_2) --- пары состояний, s_1 --- первого автомата, s_2 --- второго. Ребро между вершиной (s_1, s_2) и (s'_1, s'_2) проводим, если есть символ, по которому первый автомат переходит из s_1 в s'_1, а второй из s_2 в s'_2. Запускаем какой-нибудь обход (DFS, BFS) из вершины, соответствующей паре начальных состояний. Ну и наконец проверяем, что все вершины, соответствующие паре (x, f_2), где x не равно f_1 недостижимы. Это равносильно тому, что второй регексп мэтчит подмножество первого.
Reply
(The comment has been removed)
Последнее предложение следует понимать так: второй регэксп мэтчит подмножество первого тогда и только тогда, когда состояния вида (x, f_2), где x не равно f_1, недостижимы. Если какое-то такое состояние достижимо, то мы легко построим строку, котороая мэтчится s_2 и не мэтчится s_1, пройдясь по пути. В противном случае такой строки нет.
Reply
(The comment has been removed)
Долго думала над незнакомым словом. Следует читать как "совпадающих с одним подмножеством"?
Reply
1. Для регулярных языков можно проверить включение. Делается это так: берем один автомат (входной) и "запускаем" не нем другой: то, что один гененрирует, второй распознает. Запоминпем, в каких состояниях оказывается распознающий автомат, для каждого состояния входного. Считаем до неподвижной точки. Она есть, потому что состояний конечное число. Все.
2. Перловые регэкспы описывают нерегулярные языки и для них ничего нельзя.
Reply
Reply
Reply
Я опять плохо объяснил, но лучше (если коротко) пока не придумал.
Reply
Leave a comment