このディレクトリの索引

http://pc12.2ch.net/test/read.cgi/tech/1273368706/94 
#  9×9の2次元配列を3×3の小さなブロック9個で区切り左上から 
#  0,1,2, 
#  3,4,5, 
#  6,7,8,と番号をつけるとします。 
#  各番号のブロックにある数字を足し、1次元の配列にブロック内の数の合計を保存したいです。 
#  以下のプログラムを書いた場合、1次元の配列の添え字を工夫すると簡単にプログラミングできる 
#  と聞いたのですが、どうしても思いつきません。アドバイスお願いします。 
# 
#  (i=0;i<10;i++) 
#  (j=0;j<10;j++) 
#  total[ここの添え字を工夫]=data[i][j]; 
# 
#  totalを2次元配列にする方法は思いつくのですが、1次元に保存する方法がどうしてもわかりません。 
#  よろしくお願いします。 

各ブロックの合計数を保存する(_9マス,_保存する合計値ならび) :-
        findall(S,(
             '9×9の2次元配列を3×3の小さなブロック9個で区切り左上から\n0,1,2,\n3,4,5,\n6,7,8,と番号をつけるとします。'(N,_9マス,_3マス),
              flat(_3マス,L1),
              加算(L1,Sum),
              S is truncate(Sum)),
          _保存する合計値ならび).

'9×9の2次元配列を3×3の小さなブロック9個で区切り左上から\n0,1,2,\n3,4,5,\n6,7,8,と番号をつけるとします。'(N,_9マス,_3マス) :-
        for(0,N,8),
        U is (N // 3) * 3,
        U1 is U + 1,
        U2 is U1 + 2,
        V is (N mod 3) * 3,
        V1 is V + 1,
        V2 is V1 + 2,
        findall(L1,
                  (    for(U1,M,U2),list_nth(M,_9マス,L),
                       findall(A,(for(V1,M2,V2),list_nth(M2,L,A)),L1)),
                _3マス).