我有这个代码将整数转换为罗马数字 我需要添加一个函数来比较整数和罗马数字输入,并显示它是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).
答案 0 :(得分:5)
尝试以不同方式表达问题:编写语法(dcg)以关联整数和表示罗马数字的字符列表。这是一个开始:
:- 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。
答案 1 :(得分:1)
您应该将toroman/1
程序更改为toroman/2
,以返回罗马数字,而不是仅仅打印它。
然后,您可以轻松地将罗马数字与调用toroman/2
的结果进行比较。
另请注意,如果您回溯另一个解决方案,您的当前过程将循环,直到获得堆栈溢出。你应该保护每个递归调用自身的子句,只有当调用的参数是非负的时候,或者作为第一个子句添加一个安全失败的检查,例如:
roman(N):- N < 0, !, fail.
更改toroman / 1后返回罗马文字,你会得到这样的东西(只是修改了一下你的代码以返回文字作为第二个参数):
toroman(N, _):- N < 0, !, fail.
toroman(0, []).
toroman(N, ['I'|Roman]) :- N < 4, M is N - 1, toroman(M, Roman).
toroman(4, ['IV']).
toroman(5, ['V']).
toroman(N, ['V'|Roman]) :- N < 9, M is N - 5, toroman(M, Roman).
toroman(9, ['IX']).
toroman(N, ['X'|Roman]) :- N < 40, M is N - 10, toroman(M, Roman).
toroman(N, ['XL'|Roman]) :- N < 50, M is N - 40, toroman(M, Roman).
toroman(N, ['L'|Roman]) :- N < 90, M is N - 50, toroman(M, Roman).
toroman(N, ['XC'|Roman]) :- N < 100, M is N - 90, toroman(M, Roman).
toroman(N, ['C'|Roman]) :- N < 400, M is N - 100, toroman(M, Roman).
toroman(N, ['CD'|Roman]) :- N < 500, M is N - 400, toroman(M, Roman).
toroman(N, ['DD'|Roman]) :- N < 900, M is N - 500, toroman(M, Roman).
toroman(N, ['CM'|Roman]) :- N < 1000, M is N - 900, toroman(M, Roman).
toroman(N, ['M'|Roman]) :- N < 4000, M is N - 1000, toroman(M, Roman).
roman(N, R) :- toroman(N, L), atomic_list_concat(L, R).
roman(N) :- roman(N, R), write(R).
然后,您只需致电roman(N, R)
并测试R
是否与您感兴趣的罗马数字相结合。