このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1284632294/586
#  [1] 授業単元: 画像処理 
#  [2] 問題文(含コード&リンク): 
#  N×Nのbitmap画像を 
#  AB 
#  CD 
#  のように4等分し、 
#  DC 
#  BA 
#  と並び替えるプログラム 
#   
# [5] その他の制限: 並び替え前後どちらも1次元配列、左下原点(in[0])でお願いします。
%  ならびの要素は画素であるとした。

左下を原点として一次元のならびで表現された画像の区画変換(N,N,_原画像,_並び替えた画像) :-
    Len1 is N // 2,
    findall([_区画番号,_行単位の区画],member_L(1,_区画番号,Len1,_行単位の区画,_原画像),LL),
    区画要素のみ取り出す(4,LL,LL4),
    区画要素のみ取り出す(3,LL,LL3),
    区画要素のみ取り出す(1,LL,LL1),
    区画要素のみ取り出す(2,LL,LL2),
    一次元ならびの写像(LL4,LL3,Y),
    一次元ならびの写像(LL1,LL2,Z),
    append(Y,Z,_並び替えた画像).

一次元ならびの写像([],[],[]) :- !.
一次元ならびの写像([L1|R1],[L2|R2],[L3|R3]) :- append(L1,L2,L3),一次元ならびの写像(R1,R2,R3).

区画の要素のみ取り出す(_初期区画番号,LL,X) :- findall(L,member([_初期区画番号,L],LL),X).

member_L(M,M,N,Lx,L) :-
    length(Lx,N),
    append(Lx,R,L).
member_L(4,M,N,Lx,L) :-
    length(L1,N),
    append(L1,R,L),
    member_L(1,M,N,Lx,R),!.
member_L(M1,M,N,Lx,L) :-
    length(L1,N),
    append(L1,R,L),
    M2 is M + 1,
    member_L(M2,M,N,Lx,R).