このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1291471791/252
#  [1] 授業単元: プログラミング 
#  [2] 問題文(含コード&リンク): 
#   
#  二つの整数width, heightを入力として受け付ける。 
#  文字*を使って幅(横)width,高さ(縦)height,縁の太さ2の「中が空白の長方形」を描きなさい。 
#  例えば, 7 6 を読み込んだときには, 
#  ******* 
#  *******  
#  **___**  
#  **___**  
#  *******  
#  *******  
#  と表示されればよい。 
#  ただし_のところは空白文字を示すので, 
#  画面上では何も表示されない)。 
#  なお,width, heightは4以上30以下と仮定してよい。 
#    

'二つの整数width, heightを入力として受け付ける。文字*を使って幅(横)width,高さ(縦)height,縁の太さ2の「中が空白の長方形」を描きなさい。' :-
        '二つの整数_幅,_高さを入力として受け付ける。'(_幅,_高さ),
        '文字*を使って幅(横)width,高さ(縦)height,縁の太さ2の「中が空白の長方形」を描く'(_幅,_高さ).

'二つの整数_幅,_高さを入力として受け付ける。'(_幅,_高さ) :-
        催促付き整数入力('幅を入力してください : ',_幅),
        催促付き整数入力('高さを入力してください : ',_高さ).

'文字*を使って幅(横)width,高さ(縦)height,縁の太さ2の「中が空白の長方形」を描く'(_幅,_高さ) :-
        for(1,_行,_高さ),
        行を描く(_行,_幅,_高さ),
        _行 = _高さ.

行を描く(N,_高さ,_幅) :-
        N =< 2,
        一行星を描く(_幅),!.
行を描く(N,_高さ,_幅) :-
        N > _高さ-2,
        一行星を描く(_幅),!.
行を描く(N,_高さ,_幅) :-
        N >= 3,
        N =< _高さ-2,
        '先頭と最後に2個づつ星、中は空白に描く'(_幅).

一行星を描く(_幅) :-
        length(L,_幅),
        all(L,*),
        concat_atom(L,_星文字列),
        write_formatted('%t\n',[_星文字列]).

'先頭と最後に2個づつ星、中は空白に描く'(_幅) :-
        length(L,_幅),
        append([*,*],L1,[*,*],L),
        all(L1,' '),
        concat_atom(L,S),
        write_formatted('%t\n',[S]).