このディレクトリの索引

'for/3を使って横向きに星のピラミッドを描く'(_ピラミッドの頂点の高さ) :-
        ビラミッドの頂点までを描く(_ピラミッドの頂点の高さ),
        ピラミッドの頂点から後を描く(_ピラミッドの頂点の高さ).

ビラミッドの頂点までを描く(_ピラミッドの頂点の高さ) :-
        for(1,_表示する星の数,_ピラミッドの頂点の高さ),
        星で行表示する(_表示する星の数),
        _表示する星の数 = _ピラミッドの頂点の高さ.

ピラミッドの頂点から後を描く(_ビラミッドの頂点の高さ) :-
        for(_ピラミッドの頂点の高さ-1,_表示する星の数,1),
        星で行表示する(_表示する星の数),
        _表示する星の数 = 1.

星で行表示する(_表示する星の数) :-
        for(1,M,_表示する星の数),
        星を一個表示する,
        M = _表示する星の数,
        改行する.

星を一個表示する :-
        put_char(*).

改行する :-
        nl.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  
%  for ループ
%  
%  ?- for(1,N,3),writef('%t\n',[N]),N=3.
%  1
%  2
%  3
%  

for(S,N,E) :-
        E >= S,
        for_2(S,N,E).

for(S,N,E) :-
        E < S,
        for_1(S,N,E).

for_1(S,_,E) :-
        S < E,!,fail.
for_1(N,N,E).
for_1(S,N,E) :-
        S1 is S - 1,
        for_1(S1,N,E).

for_2(S,_,E) :-
        S > E,!,fail.
for_2(N,N,E).
for_2(S,N,E) :-
        S1 is S + 1,
        for_2(S1,N,E).