このディレクトリの索引
#  出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/43
#  お題 与えられた集合の要素を数珠順列に並べたもの全てを列挙せよ。 
#   
#  例 
#  # {'a','b','c','d'} の数珠順列の全て 
#  necklace=λ kfsAg:sum([[(kfsAg.sl[0],y)+x+(z,) for x in permutate(kfsAg-kfs([kfsAg.sl[0],y,z]))] for y,z in combinate(kfsAg.sl[1:],2)],[]); necklace(kfs("abcd")) 
#  =============================== 
#  [('a', 'b', 'd', 'c'), ('a', 'b', 'c', 'd'), ('a', 'c', 'b', 'd')] 
#   
#   
#  # [1, 2, 3, 4, 5] の数珠順列の全て 
#  necklace=λ kfsAg:sum([[(kfsAg.sl[0],y)+x+(z,) for x in permutate(kfsAg-kfs([kfsAg.sl[0],y,z]))] for y,z in combinate(kfsAg.sl[1:],2)],[]); necklace(kfs([1,2,3,4,5])) 
#  =============================== 
#  [(1, 2, 4, 5, 3), (1, 2, 5, 4, 3), (1, 2, 3, 5, 4), (1, 2, 5, 3, 4), (1, 2, 3, 4, 5), (1, 2, 4, 3, 5), 
#   (1, 3, 2, 5, 4), (1, 3, 5, 2, 4), (1, 3, 2, 4, 5), (1, 3, 4, 2, 5), (1, 4, 2, 3, 5), (1, 4, 3, 2, 5)] 
#   
#  参考 URL;;http://ime.nu/www.geocities.jp/m_hiroi/light/pyalgo62.html 
# 
# 

'与えられた集合の要素を数珠順列に並べたもの全てを列挙せよ。'(_集合,_数珠順列) :-
        _集合 = [_首に掛ける要素|_残り集合],
        length(_残り集合,_残り集合の要素数),
        findall([_首に掛ける要素|L],(
                    順列(_残り集合,_残り集合の要素数,L)),
                _数珠順列).

順列(Y,0,[]).
順列(Y,N,[A|X]) :-
        select(A,Y,Z),
        M is N - 1,
        順列(Z,M,X).