このディレクトリの索引

http://pc12.2ch.net/test/read.cgi/tech/1255709298/160# [1] 授業単元: プログラミング言語
# [2] 問題文(含コード&リンク):
#   問1、符号無し整数xを右にnビット回転した値を返す関数
#      unsigned right(unsigned x,int n)
# {
# }
# を作成せよ

符号無し整数を右にnビット回転(_整数,N,X) :-
    i2b(32,_整数,L1),
    ならびの回転(右方向,N,L1,L2),
    i2b(32,X,L2).

% *** user: i2b / 3 ***
i2b(_ビット数,_整数表現,_二進数リスト) :-
    var(_ビット数),
    integer(_整数表現),
    i2b_2(_整数表現,[],_二進数リスト) .
i2b(_ビット数,_整数表現,_二進数リスト) :-
    integer(_ビット数),
    integer(_整数表現),
    i2b_2(_整数表現,[],L2),
    length(_二進数リスト,_ビット数),
    append(L1,L2,_二進数リスト),
    L1 all 0,
    ! .
i2b(_ビット数,_整数表現,_二進数リスト) :-
    var(_整数表現),
    length(_二進数リスト,_ビット数),
    i2b_3(_ビット数,_二進数リスト,_実数表現),
    _整数表現 is truncate(_実数表現) .

% *** user: i2b_3 / 4 ***
i2b_3(N,N,[],0) :-
    ! .
i2b_3(M,N,[I|R],X) :-
    M2 is M + 1,
    i2b_3(M2,N,R,Y),
    X is 2 ^ M + Y + I,
    ! .

% *** user: i2b_3 / 3 ***
i2b_3(1,[I],I) :-
    ! .
i2b_3(M,[I|R],X) :-
    M2 is M - 1,
    i2b_3(M2,R,Y),
    X is 2 ^ M2 * I + Y,
    ! .

% *** user: i2b_3 / 2 ***
i2b_3([],0) :-
    ! .
i2b_3([0|R],X) :-
    i2b_3(R,Y),
    X is Y * 2,
    ! .
i2b_3([1|R],X) :-
    i2b_3(R,Y),
    X is Y * 2 + 1 .

% *** user: i2b_2 / 3 ***
i2b_2(0,L,L) :-
    ! .
i2b_2(N,Y,X) :-
    N1 is N // 2,
    N2 is N mod 2,
    i2b_2(N1,[N2|Y],X) .

% *** 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) .

% *** user: 'ならびの回転' / 3 ***
'ならびの回転'('右方向',[A|R],L) :-
    append(R,[A],L) .
'ならびの回転'('右方向',[A|R],L) :-
    append(R,[A],L1),
    'ならびの回転'('右方向',L1,L) .