このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1308749241/340
#  [1] C言語演習 
#  [2] put_nchar関数(←自分で作成する)を使用して、以下のプログラムを作成せよ。 
#  参考:http://codepad.org/DdpoVJOe 
#   何段ですか:5 
#        * 
#       *** 
#      ***** 
#       *** 
#        * 
# 

菱形を描く :-
        段数を得る(_段),
        菱形図案(_段,_図案用紙),
        菱形を描画する(_図案用紙).

菱形図案(_段,_図案用紙) :-
        図案用紙の手配(_段,_図案用紙),
        上向きの山を築く([_],_図案用紙),
        下向きの山と合体する(_図案用紙).

図案用紙の手配(_段,_図案用紙) :-
        length(_図案用紙,_段),
        findall(_,(
                    append(_,[_|_],_図案用紙)),
                _図案用紙).

上向きの山を築く(L1,[L|R]) :-
        append(L0,L1,L0,L),
        all(L0,' '),
        all(L1,'*'),
        上向きの山を築く([_,_|L1],R).
上向きの山を築く(_,_図案用紙).

下向きの山と合体する(_図案用紙) :-
        逆さまにコピーして下向きの山を作る(_図案用紙,_図案用紙2),
        _図案用紙 = _図案用紙2.

逆さまにコピーして下向きの山を作る(_図案用紙,_図案用紙2) :-
        reverse(_図案用紙,_図案用紙2).

菱形を描画する(_図案用紙) :-
        append(_,[L|R],_図案用紙),
        concat_atom(L,S),
        writef('%t\n',[S]),
        R = [].

段数を得る(_段) :-
        write('段数を入力してください : '),
        get_line(Line),
        段数入力診断(Line,_段),!.
段数を得る(_段) :-
        段数を得る(_段).

段数入力診断(Line,_段) :-
        atom_to_term(Line,_段,_),
        integer(_段),
        _段 > 0,
        1 is _段 mod 2,!.
段数入力診断(Line,_) :-
        writef('入力された %t からは段として適切な奇数が得られませんでした。\n',[Line]),
        fail.