%% traduction des nombres romains en une liste de 4 chiffres décimaux %% on utilise les DCG pour une version "reversible" unites(I,_,_,3) --> [I,I,I]. unites(I,_,_,2) --> [I,I]. unites(I,V,_,4) --> [I,V]. unites(I,_,X,9) --> [I,X]. unites(I,_,_,1) --> [I]. unites(I,V,_,8) --> [V,I,I,I]. unites(I,V,_,7) --> [V,I,I]. unites(I,V,_,6) --> [V,I]. unites(_,V,_,5) --> [V]. unites(_,_,_,0) --> []. milliers(3) --> [m,m,m]. milliers(2) --> [m,m]. milliers(1) --> [m]. milliers(0) --> []. romains([M,C,D,U])--> milliers(M), unites(c,d,m,C), unites(x,l,c,D), unites(i,v,x,U). %% facilite les appels mais ceci n'est pas reversible test(Dec,Rom) :- var(Dec),!,nom(Rom,R),romains(D,R,[]),nom(Dec,D). test(Dec,Rom) :- nombre(Dec,D),romains(D,R,[]),nom(Rom,R). nom(X,Xl) :- % explose var(Xl),!, name(X,Codes), nom1(Codes,Xl). nom(X,Xl) :- % compose nom1(Codes,Xl), name(X,Codes). nom1([],[]). nom1([X|Xs],[X1|X1s]):- name(X1,[X]), nom1(Xs,X1s). nombre(X0,[M,C,D,U]):- M is X0 // 1000, X1 is X0 - M*1000, C is X1 // 100, X2 is X1 - C*100, D is X2 // 10, U is X2 - D*10. /* exemples d'appels et de résultats | ?- romains([0,6,8,8],R,[]). R = [d,c,l,x,x,x,v,i,i,i] | ?- romains(D,[m,c,i,v],[]). D = [1,1,0,4] | ?- test(1104,R). R = mciv | ?- test(D,mciv). D = 1104 | ?- test(688,R). R = dclxxxviii | ?- test(D,dclxxxviii). D = 688 */