%%% %%% Les utilitaires de lecture %%% fichier "entree.pro" %%% %% transformation de la ligne lue en une suite d'atomes lire_les_mots(Ws):-lire_car(C),lire_les_mots(C,Ws). lire_les_mots(C,[W|Ws]):- % ajoute un mot car_mot(C),!, lire_mot(C,W,C1),lire_les_mots(C1,Ws). lire_les_mots(C,[]):- % fin de phrase car_fin_des_mots(C),!. lire_les_mots(_,Ws):- % on oublie ce lire_car(C1),lire_les_mots(C1,Ws). % caractère lire_mot(C,W,C1):- % construit un mot cars_des_mots(C,Cs,C1),nom(W,Cs). cars_des_mots(C,[C|Cs],C0):- car_mot(C),!,lire_car(C1),cars_des_mots(C1,Cs,C0). cars_des_mots(C,[],C):- \+(car_mot(C)). %% classes des caractères car_mot(C):- a @=< C, C @=< z. car_mot(C):-'A' @=< C,C @=< 'Z'. car_mot(''''). %% une liste de mots est terminée par un point un %% un point d'interrogation ou une fin de ligne car_fin_des_mots('.'):-skip(10). % sauter jusqu'\a la car_fin_des_mots('?'):-skip(10). % fin de ligne car_fin_des_mots(X) :-name(X,[10]). % le "newline" %%% prédicats nécessaires en C-Prolog pour éviter %%% la manipulation de codes ascii %% lecture d'un caractère et %% transformation en l'atome correspondant lire_car(X) :- get0(X1), name(X,[X1]). %% nom explose un identificateur en %% une liste d'identificateurs d'une lettre %% appel: nom(aimer,[a,i,m,e,r]) %% nom(X,Xl) :- % explose var(Xl),!, name(X,Codes), nom1(Codes,Xl). nom(X,Xl) :- % compose var(X),!, nom1(Codes,Xl), name(X,Codes). nom1([],[]). nom1([X|Xs],[X1|X1s]):- name(X1,[X]), nom1(Xs,X1s).