このディレクトリの索引
#  出題場所 :: 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
#       || 


葉と飾り(20,[*,*,*,*,*,*,*,*,*,*,*,*,*,'N','i','X','J',o,'%',b]).


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

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

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

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

一段生成(_段目,_飾りを含む葉) :-
        var(_飾りを含む葉),
        length(_段,_段目),
        飾りを含む葉の生成(_段,_飾りを含む葉),!.
一段生成(_,_既に存在するもの) :-
        \+(var(_既に存在するもの)).

飾りを含む葉の生成(_段,_一段の葉飾り) :-
        葉と飾り(_基数,_葉と飾りならび),
        findall(_葉または飾り,(
                    葉または飾りの選択(_段,_基数,_葉と飾りならび,_葉または飾り)),
                _葉または飾りならび),
        atomic_list_concat(_葉または飾りならび,_一段の葉飾り),!.

葉または飾りの選択(_段,_基数,_葉と飾りならび,_葉または飾り) :-
        member(_葉または飾り,_段),
        _乱数 is random(_基数),
        nth0(_乱数,_葉と飾りならび,_葉または飾り).

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