このディレクトリの索引

'CRC-16'(_バイト単位文字コードならび,BCC1,BCC2) :-
        'CRC16'(_バイト単位文字コードならび,0xa001,0,CRC,BCC1,BCC2).

'CRC16-CCITT'(_バイト単位文字コードならび,BCC1,BCC2) :-
        'CRC16'(_バイト単位文字コードならび,0x8408,0,CRC,BCC1,BCC2).

'CRC16'([],_生成多項式,CRC,CRC,BCC1,BCC2) :-
        ビット列を反転した数(CRC,N),
        BCC1 is N // 256,
        BCC2 is N mod 256,!.
'CRC16'([N|R1],_生成多項式,CRC1,CRC,BCC1,BCC2) :-
        'CRC16_2'([_,_,_,_,_,_,_,_],_生成多項式,N,CRC1,CRC2),
        'CRC16'(R1,_生成多項式,CRC2,CRC,BCC1,BCC2).

'CRC16_2'([],_,_,CRC,CRC) :- !.
'CRC16_2'([_|Ln],_生成多項式,D,CRC1,CRC) :-
        'CRC16_3'(D,CRC1,Lsb,CRC3),
        'CRC16_4'(Lsb,_生成多項式,CRC3,CRC4),
        D3 is (D << 1) /\ 0x00ff,
        'CRC16_2'(Ln,_生成多項式,D3,CRC4,CRC).

'CRC16_3'(D,CRC1,Lsb,CRC3) :-
        N is (D >> 7) /\ 0xff,
        R is CRC1 /\ 1,
        Lsb is R xor N,
        CRC2 is CRC1 >> 1,
        CRC3 is CRC2 /\ 0x7fff.

'CRC16_4'(Lsb,_生成多項式,CRC3,CRC4) :-
        \+(Lsb = 0),
        CRC4 is _生成多項式 xor CRC3.
'CRC16_4'(Lsb,_生成多項式,CRC3,CRC4) :-
        Lsb = 0,
        CRC4 = CRC3.

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

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

ビット列を反転した数(CRC,N) :-
        i2b(16,CRC,L),
        reverse(L,L2),
        i2b(16,N,L2).

all([],_).
all([V|R],V) :-
        all(R,V).