このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1344655285/162
#  rubyで一番よく使うのはmap、これは戻り値に配列を返す
#  普通に書いたら
#  p [1,2,3].map { |x| x*2 } # => [2, 4, 6]
#  
#  だけど、メソッド(イテレータ)チェインする事によって、本来配列を返さない
#  each_with_indexなども
#  p [1,2,3].each_with_index { |x,i| x*(2+i) } # => [1, 2, 3]
#  
#  mapを置く事による戻り値を変えられる
#  p [1,2,3].each_with_index.map { |x,i| x*(2+i) } # => [2, 6, 12]
#  
#  これをforで書くとこう
#  s = []
#  i = 0
#  for x in [1,2,3]
#    s << x*(2+i)
#    i += 1
#  end
#  p s
#  
#  for文とイテレータじゃ力の差が有りすぎて異論の余地すらない
# >>> [val*(2+idx) for idx,val in enumerate(sorted([3,2,1]))]
#  [2, 6, 12]
# irb(main):001:0> [3,2,1].sort.each_with_index.map { |x, i| x * (2 + i) }
#  => [2, 6, 12]

'p [1,2,3].map { |x| x*2 } # => [2, 4, 6]' :-
        findall(_y,(
                    member(_x,[1,2,3]),
                    _y is _x * 2),
                L),
        writef('%t\n',[L]).

'p [1,2,3].each_with_index.map { |x,i| x*(2+i) } # => [2, 6, 12]' :-
        findall(_y,(
                    nth1(_i,[1,2,3],_x),
                    _y is _x * (2 + _i)),
                L),
        writef('%t\n',[L]).

'>>> [val*(2+idx) for idx,val in enumerate(sorted([3,2,1]))]'(L) :-
        sort([3,2,1],L1),
        findall(_y,(
                    nth1(_idx,L1,_x),
                    _y is _x * (2 + _idx)),
                L).

'[3,2,1].sort.each_with_index.map { |x, i| x * (2 + i) }'(L) :-
        sort([3,2,1],L1),
        findall(_y,(
                    nth1(_i,L1,_x),
                    _y is _x * (2 + _i)),
                L).