GNU Prolog で実装しています。
extract(Offset, Length, List, Extract) :-
append(Left, ExtractRight, List),
append(Extract, _Right, ExtractRight),
length(Left, Offset),
length(Extract, Length).
subrectangle(Width, Height, Rectangle, SubRectangle) :-
extract(_, Height, Rectangle, Rows),
maplist(extract(_, Width), Rows, SubRectangle).
subrectangle.prolog
という名前で保存して、gprolog
コマンドで GNU Prolog を起動します。
| ?- ['subrectangle.prolog'].
| ?- findall(S, subrectangle(3, 3, [[1,2,3,4,5],[2,3,4,5,6],[3,4,5,6,7],[4,5,6,7,8]], S), SS).
SS = [[[1,2,3],[2,3,4],[3,4,5]],[[2,3,4],[3,4,5],[4,5,6]],[[3,4,5],[4,5,6],[5,6,7]],[[2,3,4],[3,4,5],[4,5,6]],[[3,4,5],[4,5,6],[5,6,7]],[[4,5,6],[5,6,7],[6,7,8]]]
例えば、3 x 3 のリストのリストの要素の合計を表す述語を用意しておくと、
sum3x3([[A11, A12, A13], [A21, A22, A23], [A31, A32, A33]], Sum) :-
Sum is A11 + A12 + A13 + A21 + A22 + A23 + A31 + A32 + A33.
それを満たす組み合わせを得ることができます。
| ?- subrectangle(3, 3, [[1,2,3,4,5],[2,3,4,5,6],[3,4,5,6,7],[4,5,6,7,8]], S), sum3x3(S, 45), !.
S = [[3,4,5],[4,5,6],[5,6,7]]
次回はどう書くの問題を解くコードを Prolog で書きます。つづく。