このディレクトリの索引

http://pc12.2ch.net/test/read.cgi/tech/1255709298/294
#  [1] 授業単元:プログラミング 
#  [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10004.txt
# 課題 
# 整数列を右に任意数だけローテーション(右ローテーション:right rotation)する
# プログラムを作りなさい.ただし,以下の点に留意すること.
# 
# ・整数列はキーボードから入力すること. 
# ・入力できる整数列の最大長は 10 とし,長さ 0 以下と 11 以上を指定した場合エラー終了すること. 
# ・ローテーション数が整数列の長さを超える場合でも正しい処理になるようにすること 

t846 :-
    t846_入力(_整数ならび,_ローテーションする数),
    length(_整数ならび,_入力した要素数),
    t846(_ローテーションする数,_入力した要素数,_整数ならび,_ローテーションした整数ならび),
    concat_atom(_ローテーションした整数ならび,',',S),
    write_formatted('ローテーションした整数列 %t です\n',[S]),!.
t846.

t846(_ローテーションする数,_入力した要素数,_整数ならび,X) :-
    _入力した要素数>0,
    _入力した要素数<11,
    ならびの回転(右方向,_ローテーションする数,_整数ならび,X),!.
t846(_ローテーションする数,_入力した要素数,_整数ならび,X) :-
    \+((_入力した要素数>0,_入力した要素数<11)),
    write_formatted('入力した要素数が適切でありません %t 個\n',[_入力した要素数]),
    fail.

t846_入力(_,_入力した要素数,_,_) :-
    write('整数をカンマで区切り最大10個まで入力してください : '),
    get_line(Line),
    split(Line,[','],_整数ならび),
    write('ローテーションする数を入れてください : '),
    get_integer(_ローテーションする数),!.

% *** user: ならびの回転 / 4 ***
ならびの回転(左方向,1,[A|R],L) :-
    append(R,[A],L).
ならびの回転(左方向,N,[A|R],L) :-
    N > 1,
    append(R,[A],L1),
    N1 is N - 1,
    ならびの回転(左方向,N1,L1,L).
ならびの回転(右方向,1,L1,L2) :-
    append(L0,[A],L1),
    append([A],L0,L2).
ならびの回転(右方向,N,L1,L2) :-
    N > 1,
    append(L0,[A],L1),
    append([A],L0,L3).