monadiccp-0.6: examples/Alpha.hs
-- --------------------------------------------------------------------------
-- Benchmark (Finite Domain) INRIA Rocquencourt - ChLoE Project --
-- --
-- Name : alpha.pl --
-- Title : alphacipher --
-- Original Source: Daniel Diaz - INRIA France --
-- Date : January 1993 --
-- Adapted for MCP: Tom Schrijvers --
-- --
-- This problem comes from the news group rec.puzzle. --
-- The numbers 1 - 26 have been randomly assigned to the letters of the --
-- alphabet. The numbers beside each word are the total of the values --
-- assigned to the letters in the word. e.g for LYRE L,Y,R,E might equal --
-- 5,9,20 and 13 respectively or any other combination that add up to 47. --
-- Find the value of each letter under the equations: --
-- --
-- BALLET 45 GLEE 66 POLKA 59 SONG 61 --
-- CELLO 43 JAZZ 58 QUARTET 50 SOPRANO 82 --
-- CONCERT 74 LYRE 47 SAXOPHONE 134 THEME 72 --
-- FLUTE 30 OBOE 53 SCALE 51 VIOLIN 100 --
-- FUGUE 50 OPERA 65 SOLO 37 WALTZ 34 --
-- --
-- Solution: --
-- [A, B,C, D, E,F, G, H, I, J, K,L,M, N, O, P,Q, R, S,T,U, V,W, X, Y, Z] --
-- [5,13,9,16,20,4,24,21,25,17,23,2,8,12,10,19,7,11,15,3,1,26,6,22,14,18] --
-- --------------------------------------------------------------------------
import Control.CP.FD.Example.Example
import Control.CP.FD.FD
import Control.CP.FD.Expr
import Control.CP.SearchTree
main = example_main_void model
model :: FDSolver solver => Tree (FDWrapper solver) [FDExpr solver]
model =
exist 26 $
\list@[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z] ->
allin list (1,26) /\
allDiff list /\
b + a + l + l + e + t @= 45 /\
c + e + l + l + o @= 43 /\
c + o + n + c + e + r + t @= 74 /\
f + l + u + t + e @= 30 /\
f + u + g + u + e @= 50 /\
g + l + e + e @= 66 /\
j + a + z + z @= 58 /\
l + y + r + e @= 47 /\
o + b + o + e @= 53 /\
o + p + e + r + a @= 65 /\
p + o + l + k + a @= 59 /\
q + u + a + r + t + e + t @= 50 /\
s + a + x + o + p + h + o + n + e @= 134 /\
s + c + a + l + e @= 51 /\
s + o + l + o @= 37 /\
s + o + n + g @= 61 /\
s + o + p + r + a + n + o @= 82 /\
t + h + e + m + e @= 72 /\
v + i + o + l + i + n @= 100 /\
w + a + l + t + z @= 34 /\
return list