1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | % % ECLiPSe sample program % Licenced under CC-BY-4.0 : http://creativecommons.org/licenses/by/4.0/ % % Various models for the N-Queens problem % % Author: Joachim Schimpf. Use at your own risk for any purpose. % % Sample run: % % % eclipse -f queens.ecl -e "queens(8)" % ....Q... % Q....... % .......Q % ...Q.... % .Q...... % ......Q. % ..Q..... % .....Q.. % :- lib(ic). queens( N , Qs ) :- % The model: Qs is a list of column numbers length( Qs , N ), Qs :: 1.. N , ( fromto ( Qs ,[ Q1 | Q2s ], Q2s ,[]) do ( foreach ( Q2 , Q2s ), param ( Q1 ), count ( Dist ,1, _ ) do Q2 #\= Q1 , Q2 - Q1 #\= Dist , Q1 - Q2 #\= Dist ) ), % Search heuristic for larger instances: start in the middle lists:middle_out( Qs , Ordered ), search( Ordered , 0, first_fail, indomain_middle, complete, []). % With solution printing queens( N ) :- queens( N , Qs ), ( foreach ( Q , Qs ), param ( N ) do L is Q -1, R is N - Q , printf( "%*cQ%*c%n" , [ L ,0 '.,R,0' .]) ). % Counting solutions queens_all( N ) :- shelf_create( count (0), Count ), \+ (queens( N , _ ), shelf_inc( Count , 1), fail), shelf_get( Count , 1, NSol ), printf( "%d queens: %d solutions%n" , [ N , NSol ]). |