- (*** TP Automates ***)
-
- (* on suppose l'alphabet a,b *)
-
- type automaton = { (* n : le nombre d'états, 0 à n-1 *)
- initial : int; (* l'état initial *)
- final : bool array; (* tableau de n booléens *)
- transitions : int array array; (* tableau n lignes, 2 colonnes *)
- (* colonne 0 : transition à la lecture de 'a' *)
- (* colonne 1 : transition à la lecture de 'b' *)
- }
-
- (* Automate complet *)
-
- let automate1 = { initial = 0; final = [|false;true|];
- transitions = [| [|1;0|]; [|0;1|] |] };;
-
- let lire0 aut mot = failwith "A implémenter";;
-
- assert(lire0 automate1 "baabba");;
- assert(not (lire0 automate1 "abba"));;
-
-
- (* Automates incomplets : on code l'absence de transition par -1 *)
- let automate2 = failwith "A définir";;
- (* automate2 reconnait les mots qui commencent par 3 'a' *)
-
- let automate3 = failwith "A définir";;
- (* automate3 reconnait les mots qui ne contiennent que des 'a' ou que des 'b' *)
-
-
- exception Blocked;; (* exception pour gérer le blocage de l'automate *)
-
- let lire aut mot = failwith "A implémenter";;
-
- assert(lire automate1 "baabba");;
- assert(not (lire automate1 "abba"));;
-
- assert(not (lire automate2 "aa"));;
- assert(not (lire automate2 "baaaa"));;
- assert(lire automate2 "aaa");;
- assert(lire automate2 "aaabaabba");;
-
- assert(lire automate3 "aa");;
- assert(not (lire automate3 "baaaa"));;
- assert(lire automate3 "bbbb");;
- assert(not (lire automate3 "bbaabba"));
-
- (* Automate non déterministe *)
-
- type automatonND = { (*n : le nombre d'états, numérotés de 0 à n-1 *)
- initial : int list; (* les états initiaux *)
- final : int list; (* les états finaux *)
- transitions : int list array array; (* n lignes, 2 colonnes *)
- }
-
- let automateND1 = { initial = [0]; final = [2];
- transitions = [| [| [0;1] ; [] |]; [| [2] ; [0;2] |] ; [| [] ; [] |] |] };;
-
- let automateND2 = failwith "A définir";;
-
- type ens = int list;;
-
- let rec unionLT e1 e2 = match (e1,e2) with
- (* union de deux listes triees sans doublon *)
- | _ -> failwith "A faire"
- ;;
-
- let rec interLT e1 e2 = match (e1, e2) with
- (* intersection de deux listes triees sans doublon *)
- | _ -> failwith "A faire"
- ;;
-
- let affiche_ens e =
- Printf.printf "["; List.iter (fun x->Printf.printf "%d-" x) e; Printf.printf "]";;
-
-
-
- let lireND aut mot = failwith "A implémenter"
- ;;
-
- assert (lireND automateND1 "aaa");;
- assert (not (lireND automateND1 "abbaa"));;
- assert (lireND automateND2 "abbaa");;
- assert (not (lireND automateND1 "bbaab"));;
-