1:- module(roman, [dcg//1, roman/2]). 2 3:- use_module(library(clpfd)).
8roman(Arabic,Roman) :- 9 phrase(dcg(Arabic),Roman). 10 11%% dcg(?Arabic:integer)// 12% 13% Parse and generate Roman numerals. 14dcg(Arabic) --> 15 { Arabic in 1..3999 }, 16 roman(Arabic), 17 !. 18 19roman(Total) --> 20 { Rest #>= 0 }, 21 { Total #= Value + Rest }, 22 digit(Value), 23 roman(Rest). 24roman(0) --> "". 25 26digit(1000) --> "M". 27digit(900) --> "CM". 28digit(500) --> "D". 29digit(400) --> "CD". 30digit(100) --> "C". 31digit(90) --> "XC". 32digit(50) --> "L". 33digit(40) --> "XL". 34digit(10) --> "X". 35digit(9) --> "IX". 36digit(5) --> "V". 37digit(4) --> "IV". 38digit(1) --> "I"