% Find all 3 by 3 magic squares. 10 times faster! % digit(D) is for digit digit(1). digit(2). digit(3). digit(4). digit(5). digit(6). digit(7). digit(8). digit(9). % digits can only be used once. Select extracts one digit from Unused list d(D,OldUnUsed,NewUnUsed):-select(OldUnUsed,D,NewUnUsed). % a row has 3 digits that add up to 15 row(X,Y,Z,OldUnused, NewUnused):-d(X,OldUnused, U),d(Y,U,U2), Z is 15 - X - Y, d(Z,U2,NewUnused). % was row(X,Y,Z):-d(X),d(Y), X=\=Y, d(Z),X=\=Z, Y=\=Z, X+Y+Z=:=15. col(X,Y,Z):- X+Y+Z=:=15. diag(X,Y,Z):- X+Y+Z=:=15. printrow(A,B,C):-write(A),write(B),write(C),nl. out(A,B,C,D,E,F,G,H,I):-nl, printrow(A,B,C), printrow(D,E,F), printrow(G,H,I). go:-go(More). go(More):-More=more, UnUsed=[1,2,3,4,5,6,7,8,9], row(A,B,C,UnUsed,UnUsed2), row(D,E,F,UnUsed2,UnUsed3), G is 15-A-D, H is 15-B-E, row(G,H,I,UnUsed2,UnUsed4), col(A,D,G),col(B,E,H),col(C,F,I), diag(A,E,I), diag(G,E,C), out(A,B,C,D,E,F,G,H,I).