type 'a exprat = Vide | Epsilon | Lettre of 'a | Union of 'a exprat * 'a exprat | Produit of 'a exprat * 'a exprat | Etoile of 'a exprat ;;(* le langage dˇcrit est-il vide ? *)let rec lambda = function | Vide -> true | Epsilon | Lettre _ -> false | Union(e,e') -> lambda e & lambda e' | Produit(e,e') -> lambda e || lambda e' | Etoile _ -> false ;;(* longueur minimale d'un mot du langage dˇcrit *)let rec mu = function | Vide -> None | Epsilon -> Some 0 | Lettre _ -> Some 1 | Union(e,e') -> ( match (mu e,mu e') with | None,None -> None | None,Some x' -> Some x' | Some x,None -> Some x | Some x,Some x' -> Some(min x x') ) | Produit(e,e') -> ( match (mu e,mu e') with | None,_ | _,None -> None | Some x,Some x' -> Some(x+x') ) | Etoile _ -> Some 0 ;;(* un mot de longueur minimale du langage dˇcrit *)mu(Union (Lettre `z`,Produit (Lettre `z`,Lettre `z`)));; let rec pc_mot = function | Vide -> None | Epsilon -> Some "" | Lettre x -> Some(make_string 1 x) | Union(e,e') -> ( match (pc_mot e,pc_mot e') with | None,None -> None | None,Some x' -> Some x' | Some x,None -> Some x | Some x,Some x' -> if string_length x < string_length x' then Some x else Some x' ) | Produit(e,e') -> ( match (pc_mot e,pc_mot e') with | None,_ | _,None -> None | Some x,Some x' -> Some(x^x') ) | Etoile _ -> Some "" ;;