5

整数をローマ数字に変換するこのコードがあります。整数をローマ数字の入力と比較し、それが try か false かを示す関数を追加する必要があります。たとえば、roman(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).
4

2 に答える 2

4

問題を別の方法で定式化してみてください。整数とローマ数字を表す文字のリストを関連付ける文法 ( これが始まりです:

:- use_module(ライブラリ(clpfd))。

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

次のように使用できます。

?- 句 (roman(3), L)。
L = "III";
間違い。

また

?- 語句 (ローマン語 (N)、「II」)。
N = 2;
間違い。

または、何を尋ねたらよいかわからない場合は、最も一般的な質問をしてください。

?- 句 (ローマン語 (N)、L)。
N = 0、
L = [] ;
N = 1、
L =「私」;
N = 2、
L = "II" ;
N = 3、
L = "III";
間違い。

のようにコンパクトに答えを得るには、 See this answer for more をL = "III"使用してください。:- set_prolog_flag(double_quotes,chars).

于 2012-11-07T12:31:18.347 に答える
0

単に印刷するのではなく、ローマ数字を返すtoroman/1ようなものにプロシージャを変更する必要があります。toroman/2

toroman/2そうすれば、ローマ数字と整数を呼び出した結果を簡単に比較できます。

また、別の解決策を求めてバックトラックすると、スタック オーバーフローが発生するまで現在の手順がループすることにも注意してください。呼び出しのパラメーターが負でない場合にのみ再帰的にそれ自体を呼び出す各句を保護するか、安全に失敗するチェックを最初の句として追加する必要があります。

roman(N):- N < 0, !, fail.

toroman/1 をローマ字リテラルを返すように変更すると、次のようになります (2 番目の引数としてリテラルを返すようにコードを少し変更しただけです)。

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

于 2012-11-07T12:29:23.463 に答える