このディレクトリの索引
#  
#  上部の基壇に幅をもたせたピラミッドの矩形
#  
#  
#  _向き = 上向き, _頂点の高さ = 2, _上部の基壇の幅 = 3 の場合
#  
#   ***
#  *****
#  
#  _向き = 右向き, _頂点の高さ = 3, _上部の基壇の幅 = 2 の場合
#  
#  *
#  **
#  ***
#  ***
#  **
#  *
#  

ピラミッドの矩形(右向き,_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形) :-
        下向きピラミッドの矩形を転置する(_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形),!.
ピラミッドの矩形(左向き,_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形) :-
        上向きピラミッドの矩形を転置する(_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形),!.
ピラミッドの矩形(_向き,_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形) :-
        '上・下向きピラミッドの矩形を描く'(_向き,_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形).

下向きピラミッドの矩形を転置する(_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形) :-
        ピラミッドの矩形(下向き,_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形_1),
        転置(_ピラミッドの矩形_1,_ピラミッドの矩形).

上向きピラミッドの矩形を転置する(_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形) :-
        ピラミッドの矩形(上向き,_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形_1),
        転置(_ピラミッドの矩形_1,_ピラミッドの矩形).

'上・下向きピラミッドの矩形を描く'(_向き,_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形) :-
        _底辺の幅 is _頂点の高さ * 2 + _上部基壇の幅,
        length(L,_底辺の幅),
        findall(L4,(
                    append(L1,L2,L),
                    行にピラミッドの文様を描く(_向き,_上部基壇の幅,L1,L2,L4)),
                _ピラミッドの矩形).

行にピラミッドの文様を描く(上向き,_上部基壇の幅,[A|L1],L2,L4) :-
        length(L0,_上部基壇の幅),
        append(L0,L1,L),
        行にピラミッドの文様を描く(L,L2,L4).
行にピラミッドの文様を描く(下向き,_上部基壇の幅,L1,[A|L2],L4) :-
        length(L0,_上部基壇の幅),
        append(L0,L2,L),
        行にピラミッドの文様を描く(L,L1,L4).

行にピラミッドの文様を描く(L1,L2,L4) :-
        all(L1,'*'),
        all(L2,' '),
        append(L3,L3,L2),
        append(L3,L1,L3,L4).

ピラミッドの矩形を表示する([]).
ピラミッドの矩形を表示する([L|R]) :-
        atomic_list_concat(L,A),
        writef('%t\n',[A]),
        ピラミッドの矩形を表示する(R).

all([],_).
all([A|R],A) :-
        all(R,A).

append([],L2,L3,L4) :-
        append(L2,L3,L4).
append([U|L1],L2,L3,[U|L4]) :-
        append(L1,L2,L3,L4).

転置([[]|_],[]) :- !.
転置(L,[L1|R2]) :-
        転置(L,L2,L1),
        転置(L2,R2).

転置([],[],[]) :- !.
転置([[A|R1]|R2],[R1|R3],[A|R4]) :-
        転置(R2,R3,R4).