Skip to content

Instantly share code, notes, and snippets.

@kbhaines
Created September 16, 2014 10:55
Show Gist options
  • Save kbhaines/54270178805dda43e718 to your computer and use it in GitHub Desktop.
Save kbhaines/54270178805dda43e718 to your computer and use it in GitHub Desktop.
Experiments with Prolog for Constraints Programming
?- use_module(library(clpfd)).
/* type go(200, Answer) to run the program. 200 is the highest side */
/* length it will look for. */
go(Top, [L1,L2,L3,L4,L5,L6,L7,L8,L9,L10,L11,L12,L13,L14,
L15,L16,L17,L18,L19,L20,L21,L22,L23,L24,L25]) :-
/* Start the timer */
statistics(runtime,_),
/* Domains */
L1 in 1..Top, L2 in 1..Top, L3 in 1..Top, L4 in 1..Top,
L5 in 1..Top, L6 in 1..Top, L7 in 1..Top, L8 in 1..Top,
L9 in 1..Top, L10 in 1..Top, L11 in 1..Top, L12 in 1..Top,
L13 in 1..Top, L14 in 1..Top, L15 in 1..Top, L16 in 1..Top,
L17 in 1..Top, L18 in 1..Top, L19 in 1..Top, L20 in 1..Top,
L21 in 1..Top, L22 in 1..Top, L23 in 1..Top, L24 in 1..Top,
L25 in 1..Top,
/* Ordering */
L1 #< L2, L2 #< L3, L3 #< L4, L4 #< L5, L5 #< L6, L6 #< L7,
L7 #< L8, L8 #< L9, L9 #< L10, L10 #< L11, L11 #< L12, L12 #< L13,
L13 #< L14, L14 #< L15, L15 #< L16, L16 #< L17, L17 #< L18,
L18 #< L19, L19 #< L20, L20 #< L21, L21 #< L22, L22 #< L23,
L23 #< L24, L24 #< L25,
all_different([L1,L2,L3,L4,L5,L6,L7,L8,L9,L10,L11,L12,L13,L14,
L15,L16,L17,L18,L19,L20,L21,L22,L23,L24,L25]),
/* Sum of Squares Constraint */
L1*L1 + L2*L2 + L3*L3 + L4*L4 + L5*L5 + L6*L6 + L7*L7 + L8*L8 +
L9*L9 + L10*L10 + L11*L11 + L12*L12 + L13*L13 + L14*L14 + L15*L15 +
L16*L16 + L17*L17 + L18*L18 + L19*L19 + L20*L20 + L21*L21 + L22*L22 +
L23*L23 + L24*L24 #= L25*L25,
/* Length Constraints */
L1 + L3 #= L4, L4 + L1 #= L5,
L4 + L5 #= L7, L5 + L7 #= L8,
L3 + L4 + L7 #= L9, L1 + L5 + L8 #= L11,
L2 + L12 #= L14, L2 + L14 #= L15,
L2 + L15 #= L16, L10 + L11 #= L17,
L7 + L8 + L9 #= L18, L6 + L16 #= L19,
L6 + L19 #= L20, L9 + L18 #= L21,
L10 + L17 #= L22, L14 + L15 #= L23,
L13 + L20 #= L24, L21 + L22 + L23 #= L25,
L18 + L21 + L24 #= L25, L19 + L20 + L24 #= L25,
L15 + L16 + L19 + L23 #= L25,
/* Find the Answer */
labeling([], [L1,L2,L3,L4,L5,L6,L7,L8,L9,L10,L11,L12,L13,L14,
L15,L16,L17,L18,L19,L20,L21,L22,L23,L24,L25]),
/* Write the Answer */
write('L1 = '),write(L1),nl,write('L2 = '),write(L2),nl,
write('L3 = '),write(L3),nl,write('L4 = '),write(L4),nl,
write('L5 = '),write(L5),nl,write('L6 = '),write(L6),nl,
write('L7 = '),write(L7),nl,write('L8 = '),write(L8),nl,
write('L9 = '),write(L9),nl,write('L10 = '),write(L10),nl,
write('L11 = '),write(L11),nl,write('L12 = '),write(L12),nl,
write('L13 = '),write(L13),nl,write('L14 = '),write(L14),nl,
write('L15 = '),write(L15),nl,write('L16 = '),write(L16),nl,
write('L17 = '),write(L17),nl,write('L18 = '),write(L18),nl,
write('L19 = '),write(L19),nl,write('L20 = '),write(L20),nl,
write('L21 = '),write(L21),nl,write('L22 = '),write(L22),nl,
write('L23 = '),write(L23),nl,write('L24 = '),write(L24),nl,
write('L25 = '),write(L25),nl,nl,
/* Double check the Answer */
LHS is L1*L1 + L2*L2 + L3*L3 + L4*L4 + L5*L5 + L6*L6 + L7*L7 +
L8*L8 + L9*L9 + L10*L10 + L11*L11 + L12*L12 + L13*L13 + L14*L14 +
L15*L15 + L16*L16 + L17*L17 + L18*L18 + L19*L19 + L20*L20 + L21*L21 +
L22*L22 + L23*L23 + L24*L24,
RHS is L25*L25,
write(LHS),nl,
write(RHS),nl,nl,
/* Stop the timer */
statistics(runtime,[_,TimeTaken]),
write(TimeTaken),nl,nl.
cpfun(Base,[C,P,I,S,F,U,N,T,R,E]) :-
statistics(runtime,_),
Vars = [C,P,I,S,F,U,N,T,R,E],
BB is Base-1,
Vars ins 0..BB,
C*Base + P
+ I*Base + S
+ F*Base*Base + U*Base + N
#= T*Base*Base*Base + R*Base*Base + U*Base + E,
C #\= 0,
I #\= 0,
F #\= 0,
T #\= 0,
all_different(Vars),
labeling([],Vars),
statistics(runtime,[_,TimeTaken]),
write(TimeTaken),nl,nl.
ruler4([X1,X2,X3,X4,X5,X6]) :-
Order=4,
Vars = [X1,X2,X3,X4,X5,X6],
all_different(Vars),
Vars ins 0..15,
X1 + X2 #= X4,
X2 + X3 #= X5,
X1 + X2 + X3 #= X6,
X6 #>0,
X6 #<15,
/*indomain(X6).*/
labeling([],Vars).
/*M1 = 0,
M2 = X1,
M3 = X1 + X2,
M4 = X1 + X2 + X3,*/
tmp(Val, Lim, [A,B]) :-
A + B #= Val,
A #= 2*B,
[A,B] ins 0..Lim.
puzzle([S,E,N,D] + [M,O,R,E] = [M,O,N,E,Y]) :-
Vars = [S,E,N,D,M,O,R,Y],
Vars ins 0..9,
all_different(Vars),
S*1000 + E*100 + N*10 + D +
M*1000 + O*100 + R*10 + E #=
M*10000 + O*1000 + N*100 + E*10 + Y,
M #\= 0, S #\= 0.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment