我有此代码转换成整数罗马数字I需要添加的整数用罗马数字输入进行比较的功能,并显示,如果它的尝试或假,例如:罗马(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).
尝试不同的制订问题:写一本语法( 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).
见这个答案更多。
你应该改变你的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
与您感兴趣的罗马数字统一。