1:- module(roman, [dcg//1, roman/2]). 2
3:- use_module(library(clpfd)).
8roman(Arabic,Roman) :-
9 phrase(dcg(Arabic),Roman).
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"