numbers - prolog 将数字转换为罗马数字

标签 numbers prolog dcg clpfd roman-numerals

我有这段代码可以将整数转换为罗马数字 我需要添加一个函数,将整数与罗马数字输入进行比较,并显示它是 try 还是 false,例如: 罗马(v,5)。 正确

toroman(0).
toroman(N) :- N < 4, put("I"), M is N - 1, toroman(M).
toroman(N) :- N = 4, put("I"), put("V").
toroman(N) :- N = 5, put("V").
toroman(N) :- N < 9, put("V"), M is N - 5, toroman(M).
toroman(N) :- N = 9, put("I"), put("X").
toroman(N) :- N < 40, put("X"), M is N - 10, toroman(M).
toroman(N) :- N < 50, put("X"), put("L"), M is N - 40, toroman(M).
toroman(N) :- N < 90, put("L"), M is N - 50, toroman(M).
toroman(N) :- N < 100, put("X"), put("C"), M is N - 90, toroman(M).
toroman(N) :- N < 400, put("C"), M is N - 100, toroman(M).
toroman(N) :- N < 500, put("C"), put("D"), M is N - 400, toroman(M).
toroman(N) :- N < 900, put("D"), put("D"), M is N - 500, toroman(M).
toroman(N) :- N < 1000, put("C"), put("M"), M is N - 900, toroman(M).
toroman(N) :- N < 4000, put("M"), M is N - 1000, toroman(M).



roman(N) :- toroman(N).

最佳答案

尝试以不同的方式表述问题:编写语法 ( ) 将整数和表示罗马数字的字符列表联系起来。这是一个开始:

:- use_module(library(clpfd)).

roman(0) --> "".
roman(N0) --> "I", { 1 #=< N0, N0 #=< 3, N1 #= N0-1}, roman(N1).

你可以像这样使用它:

?- phrase(roman(3), L).
   L = "III"
;  false.

?- phrase(roman(N), "II").
   N = 2
;  false.

或者,如果您不知道要问什么,只需问最常见的问题:

?- phrase(roman(N), L).
   N = 0, L = []
;  N = 1, L = "I"
;  N = 2, L = "II"
;  N = 3, L = "III"
;  false.

要像 L = "III" 那样紧凑地获得答案,请使用 :- set_prolog_flag(double_quotes,chars)。 请参阅 this answer了解更多。

关于numbers - prolog 将数字转换为罗马数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13269694/

相关文章:

python - 在特定字符串后获取多个数字

javascript - javascript中数字到字符串的转换错误

prolog - 比 assoc 更快的字典,但具有相同的关系/回溯功能

prolog - 如何构建主列表中某个元素的位置列表?

c# - 如何将 SWI Prolog 连接到 Visual Studio 2012

c++ - 将数字转换为单词

python - 四舍五入到最接近的百位时,如何包含 0

prolog - 计算 Prolog 中的确定子句语法递归

python - 是否有受支持的 Prolog 实现可以与 Python 完美交互?