Biorąc pod uwagę dwa ciągi xiy, chcę zbudować DFA o minimalnym rozmiarze, który akceptuje x i odrzuca y. Jednym ze sposobów na to jest wyszukiwanie siłowe. Wymieniasz DFA zaczynając od najmniejszego. Próbujesz każdego DFA, aż znajdziesz taki, który akceptuje x i odrzuca y.
Chcę wiedzieć, czy istnieje inny znany sposób na znalezienie lub zbudowanie DFA o minimalnym rozmiarze, który akceptuje x i odrzuca y. Innymi słowy, czy możemy pokonać brutalne poszukiwanie siły?
Więcej szczegółów:
(1) Naprawdę chcę, aby algorytm znalazł minimalną wielkość DFA, a nie prawie minimalną wielkość DFA.
(2) Nie chcę tylko wiedzieć, jak duży lub mały jest minimalny DFA.
(3) Tutaj skupiam się tylko na przypadku, gdy masz dwa ciągi x i y.
Edytuj :
Dodatkowe informacje dla zainteresowanego czytelnika:
Załóżmy, i y są binarne łańcuchy o długości co najwyżej n . Wiadomo, że wynik jest DFA przyjmuje X i odrzuca Y z co najwyżej √ stanów. Zauważ, że istnieje okołon √ DFA z alfabetem binarnym i co najwyżej√ stanów. Dlatego podejście z użyciem brutalnej siły nie wymagałoby od nas liczenia więcej niżn √ DFA. Wynika z tego, że podejście brutalnej siły nie mogło zająć więcej niżn √ raz.
Pomocne dla mnie slajdy: https://cs.uwaterloo.ca/~shallit/Talks/sep2.pdf
źródło
Odpowiedzi:
Gdybym musiał to zrobić w praktyce, użyłbym solvera SAT.
Pytanie, czy istnieje DFA ze stanami , które akceptuje x i odrzuca y, można łatwo wyrazić jako instancję SAT. Na przykład jednym ze sposobów jest posiadanie 2 k 2 zmiennych logicznych: z s , b , t jest prawdą, jeśli DFA przechodzi ze stanu s do stanu t na bicie wejściowym b . Następnie dodaj kilka klauzul, aby wymusić, że jest to DFA, oraz niektóre zmienne i klauzule, aby wymusić, że akceptuje x i odrzuca y .k x y 2k2 zs,b,t s t b x y
Teraz użyj wyszukiwania binarnego na aby znaleźć najmniejsze k takie, że istnieje DFA tego rodzaju. Na podstawie tego, co przeczytałem w artykułach na temat pokrewnego problemu, spodziewałbym się, że może to być dość skuteczne w praktyce.k k
Możliwe są inne kodowania tego jako SAT. Na przykład możemy użyć kodowania śledzenia:
Jeśli ma długość m , można dodać m lg k zmiennych logicznych: let s 0 , y 1 , ... , s m być sekwencja stanów które przechodzi na wejściowym x , i reprezentują każdy s i przy użyciu ⌈ lg k ⌉ zmiennych logicznych.x m mlgk s0,s1,…,sm x si ⌈lgk⌉
Teraz dla każdego takiego, że x i = x j , masz ograniczenie, którei,j xi=xj .si−1=sj−1⟹si=sj
Następnie rozszerz to, aby obsłużyć : niech t 0 , … , t n będzie sekwencją stanów przemierzonych na wejściu y , i reprezentuje każde t j przy użyciu zmiennych logicznych lg k . Dla każdego i , j tak, że y i = y j , dodaj ograniczenie, że t i - 1 = t j - 1y t0,…,tn y tj lgk i,j yi=yj .ti−1=tj−1⟹ti=tj
Podobnie, dla każdego takiego, że x i = y j , dodaj ograniczenie, które s i - 1 = t j - 1i,j xi=yj .si−1=tj−1⟹si=tj
Oba ślady muszą zaczynać się od tego samego punktu początkowego, więc dodaj warunek, że (WLOG możesz wymagać s 0 = t 0 = 0 ).s0=t0 s0=t0=0
Aby upewnić się, że DFA używa tylko stanów , należy wymagać, aby 0 ≤ s i < k oraz 0 ≤ t j <k 0≤si<k dla wszystkich i , j .0≤tj<k i,j
Na koniec, aby zakodować wymaganie, że jest akceptowane, a y odrzucane, wymagaj, aby sx y .sm≠tn
Wszystkie te wymagania można zakodować jako klauzule SAT.
Tak jak poprzednio, użyjesz wyszukiwania binarnego na aby znaleźć najmniejsze k, dla którego istnieje taki DFA.k k
źródło