% rewrite('X',[['X','X','X'],['X',0,'X'],['X','X','X']]). % rewrite(0,[[0,0,0],[0,0,0],[0,0,0]]). %?- carpet(3). rewrite('X',[['X','X','X'],[0,'X',0],['X','X','X']]). rewrite(0,[[0,0,0],[0,0,0],[0,0,0]]). carpet(I) :- carpet(I, C), phrase(carpet(C), L), format(L). carpet([]) --> []. carpet([A|As]) --> carpet_line(A), "\n", carpet(As). carpet_line([]) --> []. carpet_line([A|As]) --> carpet_dot(A), carpet_line(As). carpet_dot(0) --> " ". carpet_dot('X') --> "X". carpet(0, [['X']]). carpet(I, C) :- I > 0, I0 is I - 1, carpet(I0, C0), carpet_rewritten(C0, C). carpet_rewritten([], []). carpet_rewritten([A|As], C) :- line_rewritten(A, B), carpet_rewritten(As, Bs), append(B, Bs, C). block_append(A, [], A). block_append([A|As], [B|Bs], [C|Cs]) :- append(A, B, C), block_append(As, Bs, Cs). line_rewritten([], []). line_rewritten([A|As], Rs) :- rewrite(A, Bs), line_rewritten(As, Cs), block_append(Bs, Cs, Rs).