1:- module(roman, [dcg//1, roman/2]).    2
    3:- use_module(library(clpfd)).
 roman(?Arabic:integer, ?Roman:codes)
True if Arabic has a Roman representation.
    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"