33 lines
828 B
Prolog
33 lines
828 B
Prolog
decode_digit(i, 1).
|
|
decode_digit(v, 5).
|
|
decode_digit(x, 10).
|
|
decode_digit(l, 50).
|
|
decode_digit(c, 100).
|
|
decode_digit(d, 500).
|
|
decode_digit(m, 1000).
|
|
|
|
decode_string(Sum, _, [], Sum).
|
|
|
|
decode_string(LastSum, LastValue, [Digit|Rest], NextSum) :-
|
|
decode_digit(Digit, Value),
|
|
Value < LastValue,
|
|
Sum is LastSum - Value,
|
|
decode_string(Sum, Value, Rest, NextSum).
|
|
|
|
decode_string(LastSum, LastValue, [Digit|Rest], NextSum) :-
|
|
decode_digit(Digit, Value),
|
|
Value >= LastValue,
|
|
Sum is LastSum + Value,
|
|
decode_string(Sum, Value, Rest, NextSum).
|
|
|
|
decode_string(Atom, Value) :-
|
|
atom_chars(Atom, String),
|
|
reverse(String, [Last|Rest]),
|
|
decode_digit(Last, Start),
|
|
decode_string(Start, Start, Rest, Value).
|
|
|
|
test :-
|
|
decode_string(mcmxc, 1990),
|
|
decode_string(mmviii, 2008),
|
|
decode_string(mdclxvi, 1666).
|