Вычислить, если два произвольных регулярных выражения имеют любые перекрывающиеся решения (если это возможно).
Например, можно показать, что эти два регулярных выражения не имеют пересечений с помощью грубой силы, потому что два набора решений вычисляются, потому что они конечны.
^1(11){0,1000}$ ∩ ^(11){0,1000}$ = {}
{1,111, ..., ..111} ∩ {11,1111, ..., ...11} = {}
{} = {}
Но заменяя {0,1000}
на *
, удалите возможность для решения грубой силы, поэтому должен быть создан более умный алгоритм.
^1(11)*$ ∩ ^(11)*$ = {}
{1,^1(11)*$} ∩ {^(11)*$} = {}
{1,^1(11)*$} ∩ {11,^11(11)*$} = {}
{1,111,^111(11)*$} ∩ {11,^(11)*$} = {}
.....
В другом подобном вопросе один ответ должен был рассчитать регулярное выражение пересечения. Можно ли это сделать? Если да, то как написать алгоритм, чтобы сделать такую вещь?
Я думаю, что эта проблема может быть доменом проблема с остановкой.
EDIT:
Я использовал принятое решение для создания DFA для примера проблемы. Довольно легко понять, как вы можете использовать BFS или DFS на графике состояний для M_3
, чтобы определить, доступно ли конечное состояние из M_3
.