このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1288531658/780
#  よろしくお願いいたします。 
#  [1] 授業単元:C++言語入門 
#  [2] 問題文(含コード&リンク): 
#   
#  ネットワークのルートアドレスとネットマスク、そしてチェックしたいIPアドレスを 
#  渡して、チェックしたいIPアドレスがそのネットワークに含まれているかどうかを 
#  チェックする関数int checkIPAddress(unsigned int root,unsigned int mask,unsigned 
#  int address)を以下のように書いた。空欄をうめよ。 
#  ただし、あるIPアドレスがネットワークに含まれているかどうかチェックするには、 
#  ネットワークのルートアドレス(root)と、チェックしたいIPアドレス(address)の 
#  ネットワークIDを比較してその値が同じであったら、そのネットワークに含まれていると 
#  判定します。IPアドレス中のネットワーク部は、ネットマスクのビットパターンが1である部分と 
#  考えます。IPアドレスからネットワークIPを取り出すには、IPアドレスをネットマスクの 
#  ビットごとのANDを取り出します。詳細はインターネットの検索エンジンで「ネットマスク」 
#  をキーワードに調べてください。 
#   
#  int checkIPAddress(unsigned int root,unsigned int mask,unsigned int address) 
#  { 
#  return(root 空欄 ゞ欄)==(root 空欄 空欄) 
#  } 
#   
#  

'ネットワークのルートアドレスとネットマスク、そしてチェックしたいIPアドレスを渡して、チェックしたいIPアドレスがそのネットワークに含まれているかどうかをチェックする。'(_ネットワークのルートアドレス,_ネットマスク,_チェックしたいIPアドレスのネットワークID,_そのネットワークに含まれているか否か) :-
        'あるIPアドレスがネットワークに含まれているかどうかチェックするには、ネットワークのルートアドレス(root)と、チェックしたいIPアドレス(address)のネットワークIDを比較してその値が同じであったら、そのネットワークに含まれていると判定します。'(_ネットワークのルートアドレス,_ネットマスク,_チェックしたいIPアドレスのネットワークIP,_診断).

'あるIPアドレスがネットワークに含まれているかどうかチェックするには、ネットワークのルートアドレス(root)と、チェックしたいIPアドレス(address)のネットワークIDを比較してその値が同じであったら、そのネットワークに含まれていると判定します。'(_ネットワークのルートアドレス,_ネットマスク,_チェックしたいIPアドレスのネットワークIP,そのネットワークに含まれる) :-
        'IPアドレスからネットワークIPを取り出すには、IPアドレスをネットマスクのビットごとのANDを取り出します。'(_IPアドレス,_ネットマスク,_ネットワークIP),
        _ネットワークのルートアドレス = _ネットワークIP,!.
'あるIPアドレスがネットワークに含まれているかどうかチェックするには、ネットワークのルートアドレス(root)と、チェックしたいIPアドレス(address)のネットワークIDを比較してその値が同じであったら、そのネットワークに含まれていると判定します。'(_ネットワークのルートアドレス,_ネットマスク,_チェックしたいIPアドレスのネットワークID,そのネットワークに含まれない) :- !.

'IPアドレスからネットワークIPを取り出すには、IPアドレスをネットマスクのビットごとのANDを取り出します。'(_IPアドレス,_ネットマスク,_ネットワークIP) :-
        'IPアドレスのビット'(_IPアドレス,_IPアドレスのビットならび),
        ネットマスクのビット(_ネットマスク,_ネットマスクのビットならび),
        'IPアドレスをネットマスクのビットごとのANDを取り出します。'(_IPアドレスのビットならび,_ネットのビットならび,_ネットワークIP).

'IPアドレスのビット'(_IPアドレス,_IPアドレスのビットならび) :-
        split(_IPアドレス,['.'],[N1,N2,N3,N4]),
        二進ビットならびに変換(N1,N2,N3,N4,_IPアドレスのビットならび).

ネットマスクのビット(_ネットマスク,_ネットマスクのビットならび) :-
        split(_IPアドレス,['.'],[N1,N2,N3,N4]),
        二進ビットならびに変換(N1,N2,N3,N4,_ネットマスクのビットならび).

'IPアドレスをネットマスクのビットごとのANDを取り出します。'(_IPアドレスのビットならび,_ネットのビットならび,_ネットワークIP) :-
        _ネットワークIPのビットならび is _IPアドレスのビットならび /\ _ネットのビットならび,
        ビットならびからネットワークIPを復元(L,_ネットワークIP_4byte_ならび),
        concat_atom(_ネットワークIP_4byte_ならび,'.',_ネットワークIP),!.

ビットならびからネットワークIPを復元([],[]) :- !.
ビットならびからネットワークIPを復元([_b1,_b2,_b3,_b4,_b5,_b6,_b7,_b8|R1],[V|R2]) :-
        V is _b1 * 128 + _b2 * 64 + _b3 * 32 + _b4 * 16 + _b5 * 8 + _b6 * 4 + _b7 * 2 + _b8,
        ビットならびからネットワークIPを復元(R1,R2).

二進ビットならびに変換([],[]) :- !.
二進ビットならびに変換([N|R],_二進ビットならび) :-
        '1byteビットならび'(N,_1byteビットならび),
        二進ビットならびに変換(R,_二進ビットならび_1),
        append(_1bytpeビットならび,_二進ビットならび_1,_二進ビットならび).

'1byteビットならび'(N,_1byteビットならび) :-
        '1byteビットならび_1'(N,L),
        reverse(L,_1byteビットならび).

'1byteビットならびの一'(0,[]) :- !.
'1byteビットならびの一'(N,[_b|R]) :-
        N2 is N // 2,
        _b is N mod 2,
        '1byteビットならびの一'(N2,R).