このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1370255305/159
#  [1] 授業単元:タンシバへの挑戦状 
#  [2] 問題文:入力された正の整数をローマ数字に変換するプログラムを作れ。 
#  


正の整数をローマ数字に変換(_正の整数,_ローマ数字) :-
        正の整数をローマ数字に変換([1,4,5,9,10,40,50,90,100,400,500,900,1000],['I','IV','V','IX','X','XL','L','XC','C','CD','D','CM','M'],_正の整数,_ローマ数字).


正の整数をローマ数字に変換(L1,L2,_正の整数,_ローマ数字) :-
        '正の整数がL1に存在した時はL2から対応するローマ数字を得る'(L1,L2,_正の整数,_ローマ数字).
正の整数をローマ数字に変換(L1,L2,_正の整数,_ローマ数字) :-
        '正の整数がL1に存在しない場合はL2から正の整数より小さくかつ最大のローマ数字単位とローマ数字を得る'(L1,L2,_正の整数,_ローマ数字単位,_ローマ数字_1),
        '正の整数からローマ数字単位を引いた整数のローマ数字を得る'(L1,L2,_正の整数,_ローマ数字単位,_ローマ数字_2),
        concat_atom(_ローマ数字_1,_ローマ数字_2,_ローマ数字).


'正の整数がL1に存在した時はL2から対応するローマ数字を得る'(L1,L2,_正の整数,_ローマ数字) :-
        nth1(_nth1,L1,_正の整数),
        nth1(_nth1,L2,_ローマ数字),!.

'正の整数がL1に存在しない場合は正の整数より小さくかつ最大のローマ数字単位とローマ数字を得る'(L1,L2,_正の整数,_ローマ数字単位,_ローマ数字) :-
        正の整数より小さくかつ最大のローマ数字単位(L1,L0,_ローマ数字単位),
        正の整数より小さくかつ最大のローマ数字(L2,L0,_ローマ数字).

正の整数より小さくかつ最大のローマ数字単位(L1,L0,_ローマ数字単位) :-
        append(L0,[_ローマ字数字単位|R],L1),
        _ローマ字数字単位 < _正の整数,
        \+((member(_ローマ字数字単位_1,R),_ローマ字数字単位_1 < _正の整数)).

正の整数より小さくかつ最大のローマ数字(L2,L0,_ローマ数字) :-
        length(L0,_nth0),
        nth0(_nth0,L2,_ローマ数字).


'正の整数からローマ数字単位を引いた整数のローマ数字を得る'(L1,L2,_正の整数,_ローマ数字単位,_ローマ数字_2) :-
        _差分整数 is _正の整数 - _ローマ数字単位,
        正の整数をローマ数字に変換(L1,L2,_差分整数,_ローマ数字_2).