Étant donné deux chaînes x et y, je veux créer une taille minimale DFA qui accepte x et rejette y. Une façon de le faire est la recherche par force brute. Vous énumérez les DFA en commençant par le plus petit. Vous essayez chaque DFA jusqu'à ce que vous en trouviez un qui accepte x et rejette y.
Je veux savoir s'il existe un autre moyen connu de trouver ou de créer un DFA de taille minimale qui accepte x et rejette y. En d'autres termes, pouvons-nous battre la recherche par force brute?
Plus de détails:
(1) Je veux vraiment qu'un algorithme trouve une taille minimale DFA, pas une taille DFA proche de la taille minimale.
(2) Je ne veux pas seulement savoir quelle est la taille du DFA minimum.
(3) Ici, je ne me concentre que sur le cas où vous avez deux chaînes x et y.
Modifier :
Informations supplémentaires pour le lecteur intéressé:
Supposons que et sont des chaînes binaires de longueur au plus . C'est un résultat connu qu'il existe un DFA qui accepte et rejette avec au plus états. Notez qu'il y a environ DFA avec un alphabet binaire et au plus états. Par conséquent, l'approche par force brute ne nous obligerait pas à énumérer plus de DFA. Il s'ensuit que l'approche par force brute ne pouvait pas prendre beaucoup plus que temps.
Diapositives que j'ai trouvées utiles: https://cs.uwaterloo.ca/~shallit/Talks/sep2.pdf
la source
Réponses:
Si je devais le faire dans la pratique, j'utiliserais un solveur SAT.
La question de savoir s'il existe un DFA avec états qui accepte x et rejette y peut être facilement exprimée comme une instance SAT. Par exemple, une façon consiste à avoir 2 k 2 variables booléennes: z s , b , t est vrai si le DFA passe de l'état s à l'état t sur le bit d'entrée b . Ajoutez ensuite quelques clauses pour faire en sorte qu'il s'agisse d'un DFA, et quelques variables et clauses pour faire en sorte qu'il accepte x et rejette y .k x y 2k2 zs,b,t s t b x y
Utilisez maintenant la recherche binaire sur pour trouver le plus petit k tel qu'il existe un DFA de ce type. Sur la base de ce que j'ai lu dans des articles sur un problème connexe, je m'attendrais à ce que cela soit raisonnablement efficace dans la pratique.k k
D'autres codages de cela comme SAT sont possibles. Par exemple, nous pouvons utiliser un encodage de trace:
Si est de longueur m , vous pouvez ajouter m lg k variables booléennes: soit s 0 , s 1 , … , s m soit la séquence d'états traversés sur l'entrée x , et représenter chaque s i à l' aide de ⌈ lg k ⌉ variables booléennes.x m mlgk s0,s1,…,sm x si ⌈lgk⌉
Maintenant, pour chaque tel que x i = x j , vous avez la contrainte que s i - 1 = s j - 1i,j xi=xj .si−1=sj−1⟹si=sj
Ensuite, étendez ceci pour gérer : soit t 0 , … , t n la séquence d'états traversés sur l'entrée y , et représentez chaque t j à l' aide de lg k variables booléennes. Pour chaque i , j tel que y i = y j , ajoutez la contrainte que t i - 1 = t j - 1y t0,…,tn y tj lgk i,j yi=yj .ti−1=tj−1⟹ti=tj
De même, pour chaque tel que x i = y j , ajoutez la contrainte que s i - 1 = t j - 1i,j xi=yj .si−1=tj−1⟹si=tj
Les deux traces doivent commencer à partir du même point de départ, donc ajoutez l'exigence que (WLOG vous pouvez exiger s 0 = t 0 = 0 ).s0=t0 s0=t0=0
Pour garantir que le DFA n'utilise que états, exigez que 0 ≤ s i < k et 0 ≤ t j < k pour tout i , j .k 0≤si<k 0≤tj<k i,j
Enfin, pour coder l'exigence selon laquelle est accepté et y est rejeté, il faut que s m ≠ t n .x y sm≠tn
Toutes ces exigences peuvent être codées en tant que clauses SAT.
Comme précédemment, vous utiliseriez la recherche binaire sur pour trouver le plus petit k pour lequel un tel DFA existe.k k
la source