It's fairly correct and up-to-date although I note that the constraint example 'send more money' given is stated as 'Prolog' when it really uses ECLiPSe Prolog constraint syntax (alldifferent/1, labelling/1 and '#' integer constraints):

If you're really interested in constraint based languages then have a look at ECLiPSe (yes shameless plug and I'm biased ;-):

http://www.eclipse-clp.org

and in particular the language tutorial:

http://www.eclipse-clp.org/doc/tutorial/index.html

ECLiPSe is robust and mature enough for industrial application development, most notably by Cisco and CrossCore Optimization.

Incidentally, we've often seen a lot of traffic on here about Sudoku solvers and I've always wanted to post the ECLiPSe solution
(neat when you consider the length of the sudoku/2 predicate ;-) :

% ECLiPSe sample code - Sudoku problem
%
%    This is a puzzle, originating from Japan, where you have a
%    9x9 grid, consisting of 9 3x3 sub-grids. The challenge is
%    to fill the grid with numbers from 1 to 9 such that every row,
%    every column, and every 3x3 sub-grid contains the digits 1 to 9.
%    Some of these numbers are given, which is the way different
%    instances of the problem are made. The solution is usually unique.
%
%    Compile this file with ECLiPSe and call e.g.
%    :- solve(1).
%
% Author: Joachim Schimpf, IC-Parc
%

:- lib(ic).
:- import alldifferent/1 from ic_global.

solve(ProblemName) :-
   problem(ProblemName, Board),
   print_board(Board),
   sudoku(3, Board),
   print_board(Board).


sudoku(N, Board) :-
   N2 is N*N,
   dim(Board, [N2,N2]),
   Board[1..N2,1..N2] :: 1..N2,
   ( for(I,1,N2), param(Board,N2) do
       Row is Board[I,1..N2],
       alldifferent(Row),
       Col is Board[1..N2,I],
       alldifferent(Col)
   ),
   ( multifor([I,J],1,N2,N), param(Board,N) do
       ( multifor([K,L],0,N-1), param(Board,I,J), foreach(X,SubSquare) do
       X is Board[I+K,J+L]
       ),
       alldifferent(SubSquare)
   ),
   term_variables(Board, Vars),
   labeling(Vars).


print_board(Board) :-
   dim(Board, [N,N]),
   ( for(I,1,N), param(Board,N) do
       ( for(J,1,N), param(Board,I) do
           X is Board[I,J],
       ( var(X) -> write("  _") ; printf(" %2d", [X]) )
       ), nl
   ), nl.


%----------------------------------------------------------------------
% Sample data
%----------------------------------------------------------------------

problem(1, [](
   [](_, _, 2, _, _, 5, _, 7, 9),
   [](1, _, 5, _, _, 3, _, _, _),
   [](_, _, _, _, _, _, 6, _, _),
   [](_, 1, _, 4, _, _, 9, _, _),
   [](_, 9, _, _, _, _, _, 8, _),
   [](_, _, 4, _, _, 9, _, 1, _),
   [](_, _, 9, _, _, _, _, _, _),
   [](_, _, _, 1, _, _, 3, _, 6),
   [](6, 8, _, 3, _, _, 4, _, _))).

Cheers

Andy

Peter Verswyvelen wrote:
Jerzy Karczmarczuk  wrote
> Perhaps somebody can say more about constraint languages which replaced

Yes please! Of example, how correct is http://en.wikipedia.org/wiki/Constraint_programming?



_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
--
*********************************************************************
*  Andrew Cheadle                    email:  [EMAIL PROTECTED] *
*  Department of Computing           http://www.doc.ic.ac.uk/~amc4/ *
*  Imperial College London                                          *
*********************************************************************

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to