swi-prologで魔方陣を計算する

もらいもの。
prologってこういうのは美しくかけるんだな。

 magic_square(L):-magic_square([1,2,3,4,5,6,7,8,9],L).
 magic_square(Elements,[A,B,C,D,E,F,G,H,I]):-
 	permutation(Elements,[A,B,C,D,E,F,G,H,I]),
 	sumlist([A,B,C],15),
 	sumlist([D,E,F],15),
 	sumlist([G,H,I],15),
 	sumlist([A,D,G],15),
 	sumlist([B,E,H],15),
 	sumlist([C,F,I],15).
  
% ?- magic_square(X).
% ?- time(magic_square(X)). /* 時間計測するとき */
% ?-  magic_square(X),print(X),nl,fail. /* 全部出力するときはこちら */
$ ?- time((magic_square(X),print(X),nl,fail)). /* 時間計測 */
% X = [6, 7, 2, 8, 3, 4, 1, 5, 9] ;