OCaml (option informatique) · Chapitre 18 · Exercice de TD
Compter les mots acceptés
Automates finis · niveau 3 (difficile)
Énoncé
Écrire compte_mots a longueur : le nombre de mots de longueur exactement longueur acceptés par a.
Corrigé
let compte_mots a longueur =
let nb_sym = Array.length a.delta.(0) in
let nb = Array.make a.nb_etats 0 in
nb.(a.initial) <- 1;
for _i = 1 to longueur do
let suivant = Array.make a.nb_etats 0 in
for e = 0 to a.nb_etats - 1 do
for s = 0 to nb_sym - 1 do
let e' = a.delta.(e).(s) in
suivant.(e') <- suivant.(e') + nb.(e)
done
done;
for e = 0 to a.nb_etats - 1 do nb.(e) <- suivant.(e) done
done;
let total = ref 0 in
for e = 0 to a.nb_etats - 1 do
if a.acceptants.(e) then total := !total + nb.(e)
done;
!total
Programmation dynamique (chapitre 13) sur les états : nb.(e) compte les mots (de la longueur courante) menant à l'état e. À chaque lettre lue, on propage ces comptes le long des transitions. À la fin, on somme sur les états acceptants. Coût — sans énumérer les mots un à un.
Exercices semblables
- Langage non vide corrigé
- Complément corrigé
- Intersection corrigé
- Les multiples de 3 en binaire corrigé
- Équivalence jusqu'à une longueur corrigé