Mit zwei Zeichenfolgen x und y möchte ich einen DFA mit einer Mindestgröße erstellen, der x akzeptiert und y ablehnt. Eine Möglichkeit hierfür ist die Brute-Force-Suche. Sie zählen die DFAs beginnend mit den kleinsten auf. Sie probieren jeden DFA aus, bis Sie einen finden, der x akzeptiert und y ablehnt.
Ich möchte wissen, ob es eine andere bekannte Möglichkeit gibt, einen DFA mit einer Mindestgröße zu finden oder zu erstellen, der x akzeptiert und y ablehnt. Mit anderen Worten, können wir die Brute-Force-Suche schlagen?
Mehr Details:
(1) Ich möchte wirklich, dass ein Algorithmus eine minimale DFA-Größe findet, keine nahezu minimale DFA-Größe.
(2) Ich möchte nicht nur wissen, wie groß oder klein der minimale DFA ist.
(3) Hier konzentriere ich mich nur auf den Fall, in dem Sie zwei Zeichenfolgen x und y haben.
Bearbeiten :
Zusätzliche Informationen für den interessierten Leser:
Angenommen, und y sind binäre Zeichenfolgen mit einer Länge von höchstens n . Es ist bekannt, dass es einen DFA gibt, der x akzeptiert und y mit höchstens √ ablehnt Staaten. Beachten Sie, dass es ungefährn √ gibt DFAs mit einem binären Alphabet und höchstens√ Staaten. Daher würde der Brute-Force-Ansatz nicht erfordern, dass wir mehr alsn √ aufzählen DFAs. Daraus folgt, dass der Brute-Force-Ansatz nicht viel mehr alsn √ dauern kann zeit.
Folien, die ich hilfreich fand: https://cs.uwaterloo.ca/~shallit/Talks/sep2.pdf
quelle
Antworten:
Wenn ich dies in der Praxis tun müsste, würde ich einen SAT-Löser verwenden.
Die Frage, ob es einen DFA mit Zuständen gibt, der x akzeptiert und y ablehnt, kann leicht als SAT-Instanz ausgedrückt werden. Zum Beispiel besteht eine Möglichkeit darin, 2 k 2 boolesche Variablen zu haben: z s , b , t ist wahr, wenn der DFA beim Eingangsbit b vom Zustand s zum Zustand t übergeht . Fügen Sie dann einige Klauseln hinzu, um zu erzwingen, dass dies ein DFA ist, und einige Variablen und Klauseln, um zu erzwingen, dass es x akzeptiert und y ablehnt .k x y 2k2 zs,b,t s t b x y
Verwenden Sie nun binäre Suche auf die kleinste zu finden k , so dass ein DFA dieser Art existiert. Basierend auf dem, was ich in Artikeln über verwandte Probleme gelesen habe, würde ich erwarten, dass dies in der Praxis einigermaßen effektiv ist.k k
Andere Kodierungen davon als SAT sind möglich. Beispielsweise können wir eine Ablaufverfolgungscodierung verwenden:
Wenn Länge m hat , können Sie m lg k boolesche Variablen hinzufügen : Sei s 0 , s 1 , ... , s m die Folge von Zuständen, die am Eingang x durchlaufen werden , und repräsentieren jedes s i mit ⌈ lg k ⌉ booleschen Variablen.x m mlgk s0,s1,…,sm x si ⌈lgk⌉
Nun haben Sie für jedes so dass x i = x j ist , die Bedingung, dass s i - 1 = s j - 1 isti,j xi=xj si−1=sj−1⟹si=sj .
Als nächstes erweitern Sie dies, um zu behandeln : sei t 0 , ... , t n die Folge von Zuständen, die an der Eingabe y durchlaufen werden , und repräsentieren jedes t j unter Verwendung von lg k booleschen Variablen. Fügen Sie für jedes i , j, so dass y i = y j ist, die Bedingung hinzu, dass t i - 1 = t j - 1 isty t0,…,tn y tj lgk i,j yi=yj .ti−1=tj−1⟹ti=tj
In ähnlicher Weise füge für jedes so dass x i = y j ist, die Bedingung hinzu, dass s i - 1 = t j - 1 isti,j xi=yj .si−1=tj−1⟹si=tj
Beide Messkurven müssen vom selben Startpunkt ausgehen. Fügen Sie daher die Anforderung hinzu, dass (WLOG kann s 0 = t 0 = 0 sein ).s0=t0 s0=t0=0
Alle diese Anforderungen können als SAT-Klauseln kodiert werden.
quelle