順列
自分でチャレンジしてみたけど、書けなかったのでカンニング。
permutation(,).
http://it.wikipedia.org/wiki/Prolog
permutation(Xs,[Z|Zs]) :- select(Z,Xs,Ys), permutation(Ys,Zs).
select(X,[X|Xs],Xs).
select(Y,[X|Xs],[X|Ys]) :- select(Y,Xs,Ys).
selectはこんな感じで動く。
?- select(X,[1,2,3],Y). X = 1, Y = [2, 3] ; X = 2, Y = [1, 3] ; X = 3, Y = [1, 2] ; ?- select(1,X,[2,3]). X = [1, 2, 3] ; X = [2, 1, 3] ; X = [2, 3, 1] ;
全てをリストで繋げて返値にするしかないlisp,haskellと違って、prologはバックトラックの先に潜在的に値を持たせる作法になるのがいいなあ。