このディレクトリの索引
#  出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/684
#  お題: ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ
#   
#  出力: http://ime.nu/codepad.org/9Qm1zRxy 
#   
#  一番上の「☆」と土台の「||」は固定でよい 
#  装飾は適当な文字(例:N,i,X,J,o,%,bなど)を利用する 
#   
#  解答例: http://ime.nu/codepad.org/aR7eI9F2 
#  
#  ☆ 
#  || 
#  ☆ 
#  **
#  || 
#   ☆ 
#   b*
#  *i*o
#   || 
#    ☆ 
#    **
#   ****
#  ******
#    || 
#     ☆ 
#     *b
#    ****
#   i**%*J
#  *Ni*****
#     || 
#      ☆ 
#      **
#     *%**
#    *****i
#   **JX****
#  **********
#      || 
#       ☆ 
#       %*
#      **%*
#     *i***o
#    ********
#   ****%*****
#  **o%****oi*b
#       || 


'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ

出力: http://ime.nu/codepad.org/9Qm1zRxy

一番上の「☆」と土台の「||」は固定でよい
装飾は適当な文字(例:N,i,X,J,o,%,bなど)を利用する' :-
        forall((between(2,8,_段),
                'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ'(_段,_クリスマスツリー)),
                クリスマスツリーの表示(_クリスマスツリー)).

'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ'(_段,_クリスマスツリー) :-
        length(L,_段),
        append([☆|L1],['||'],L),
        findall(A,(
                    nth1(_nth1,L,A),
                    '一段生成'(_nth1,A)),
                L).                    

'一段生成'(_nth1,A) :-
        var(A),
        length(L,_nth1),
        飾りを含む葉の生成(L,A),!.
'一段生成'(_,A) :-
        \+(var(A)).

飾りを含む葉の生成(L,A) :-
        findall(B,(
                    member(B,L),
                    _乱数 is random(20),
                    nth0(_乱数,[*,*,*,*,*,*,*,*,*,*,*,*,*,'N','i','X','J',o,'%',b],B)),
                L),
        atomic_list_concat(L,A),!.

クリスマスツリーの表示(_クリスマスツリー) :-
        forall(member(A,_クリスマスツリー),
               writef('%t\n',[A])).