Учитывая две строки x и y, я хочу создать DFA минимального размера, который принимает x и отклоняет y. Один из способов сделать это - перебор. Вы перечисляете DFA, начиная с самого маленького. Вы пробуете каждый DFA, пока не найдете тот, который принимает x и отклоняет y.
Я хочу знать, есть ли другой известный способ найти или создать DFA минимального размера, который принимает x и отклоняет y. Другими словами, можем ли мы победить перебор?
Подробнее:
(1) Я действительно хочу, чтобы алгоритм нашел DFA минимального размера, а не DFA минимального размера.
(2) Я не просто хочу знать, насколько большой или маленький минимальный DFA.
(3) Здесь я сосредоточен только на том случае, если у вас есть две строки x и y.
Редактировать :
Дополнительная информация для заинтересованного читателя:
Предположим, что и y - двоичные строки длиной не более n . Известно, что существует DFA, который принимает x и отклоняет y не более √ государств. Обратите внимание, что есть околоn √ DFA с бинарным алфавитом и не более√ государств. Следовательно, подход грубой силы не потребует от нас перечислять более чемn √ DFA. Отсюда следует, что метод грубой силы не может занять намного больше, чемn √ раз.
Слайды, которые я нашел полезными: https://cs.uwaterloo.ca/~shallit/Talks/sep2.pdf
источник
Ответы:
Если бы мне пришлось делать это на практике, я бы использовал SAT-решатель.
Вопрос о том, существует ли DFA с состояниями, который принимает x и отклоняет y, можно легко выразить как экземпляр SAT. Например, один способ состоит в том, чтобы иметь 2 k 2 булевых переменных: z s , b , tk x y 2k2 zs,b,t истинно, если DFA переходит из состояния в состояние t на входном бите b . Затем добавьте несколько предложений, чтобы убедиться, что это DFA, а некоторые переменные и предложения, чтобы убедиться, что он принимает x и отклоняет y .s t b x y
Теперь используйте бинарный поиск по чтобы найти наименьшее k такое, что существует DFA такого типа. Исходя из того, что я прочитал в статьях по связанной проблеме, я ожидал, что это может быть достаточно эффективным на практике.k k
Возможны другие кодировки этого как SAT. Например, мы можем использовать кодировку трассировки:
Если имеет длину m , вы можете добавить m lg k булевых переменных: пусть s 0 , s 1 , … , s m - последовательность состояний, пройденных на входе x , и представлять каждое s i с помощью булевых переменных ⌈ lg k ⌉ .x m mlgk s0,s1,…,sm x si ⌈lgk⌉
Теперь для каждого такого, что x i = x j , у вас есть ограничение, что s i - 1 = s j - 1i,j xi=xj .si−1=sj−1⟹si=sj
Затем расширим это, чтобы обработать : пусть t 0 , … , t n будет последовательностью состояний, пройденных на входе y , и представит каждое t j, используя логические переменные lg k . Для каждого i , j такого, что y i = y j , добавьте ограничение, что t i - 1 = t j - 1y t0,…,tn y tj lgk i,j yi=yj .ti−1=tj−1⟹ti=tj
Аналогично, для каждого такого, что x i = y j , добавьте ограничение, котороеi,j xi=yj .si−1=tj−1⟹si=tj
Обе трассы должны начинаться с одной и той же начальной точки, поэтому добавьте требование, что (WLOG вы можете требоватьs0=t0 ).s0=t0=0
Чтобы гарантировать, что DFA использует только состояний, требуется, чтобы 0 ≤ s i < k и 0 ≤ tК 0 ≤ ся< к для всех i , j .0 ≤ тJ< к я , дж
Наконец, чтобы закодировать требование, что принят и уИкс Y отклонено, требуется, чтобы .sм≠ тN
Все эти требования могут быть закодированы как пункты SAT.
Как и раньше, вы бы использовали бинарный поиск на чтобы найти наименьшее k, для которого существует такой DFA.К К
источник