このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1307166756/13
#  [1] 授業単元:繰り返し・条件分岐  
#  [2] 問題文(含コード&リンク):  
#  3以上40未満の整数Nを入力したとき、「*」の記号を使い、一辺の長さがNの中を塗り潰さない正方形を描画するプログラムを作成しなさい。  
#  例: 3  
#  ***  
#  * *  
#  ***  
#  

'3以上40未満の整数Nを入力したとき、「*」の記号を使い、一辺の長さがNの中を塗り潰さない正方形を描画する' :-
        '3以上40未満の整数Nを入力したとき'(_N),
        '「*」の記号を使い、一辺の長さがNの中を塗り潰さない正方形を描画する'(_N).
'3以上40未満の整数Nを入力したとき'(_N) :-
        write('3以上40未満の整数を入力してください : '),
        get_line(Line),
        '3以上40未満の整数Nを入力診断'(Line,_N),!.
'3以上40未満の整数Nを入力したとき'(_N) :-
        '3以上40未満の整数Nを入力したとき'(_N).

'3以上40未満の整数Nを入力診断'(Line,_N) :-
        atom_to_term(Line,_N,_),
        integer(_N),
        _N >= 3,
        _  < 40,!.
'3以上40未満の整数Nを入力診断'(Line,_N) :-
        writef('入力された %t からは3以上40未満の整数が得られませんでした。再入力をお願いします。\n',[Line]),
        fail.

'「*」の記号を使い、一辺の長さがNの中を塗り潰さない正方形を描画する'(_N) :-
        一辺の長さがNの(_N,LL),
        中を塗りつぶさない正方形を描画する(LL).

一辺の長さがNの(_N,LL) :-
        length(LL,_N),
        findall(L,(
                    append(_,[L|_],LL),
                    length(L,_N)),
                LL),!.

中を塗りつぶさない正方形を描画する([L|R]) :-
        all(L,'*'),
        中を塗りつぶさいない正方形を(R),
        描画する([L|R]).

中を塗りつぶさない正方形を([L]) :-
        all(L,'*'),!.
中を塗りつぶさない正方形を([['*'|R1]|R]) :-
        last(R1,'*'),
        変数を空白に変換(R1,' '),
        中を塗りつぶさない正方形を(R).

変数を空白に変換([]) :- !.
変数を空白に変換([' '|R]) :-
        変数を空白に変換(R),!.
変数を空白に変換([_|R]) :-
        変数を空白に変換(R).

描画する([]).
描画する([L|R]) :-
        concat_atom(L,S),
        writef('%t\n',[S]),
        描画する(R).