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 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
|
/*-------------------------------------------------------------------------*/
/* Benchmark (Finite Domain) */
/* */
/* Name : five.pl */
/* Title : five house puzzle */
/* Original Source: P. Van Hentenryck's book */
/* Adapted by : Daniel Diaz for GNU Prolog */
/* Date : September 1992 */
/* */
/* A logic puzzle */
/* */
/* Solution: */
/* [N1,N2,N3,N4,N5, [3,4,5,2,1, */
/* C1,C2,C3,C4,C5, 5,3,1,2,4, */
/* P1,P2,P3,P4,P5, 5,1,4,2,3, */
/* A1,A2,A3,A4,A5, 4,5,1,3,2, */
/* D1,D2,D3,D4,D5] 4,1,2,5,3] */
/*-------------------------------------------------------------------------*/
q :-
get_fd_labeling(Lab),
statistics(runtime, _),
five_house(L, Lab),
statistics(runtime, [_, Y]),
write(L),
nl,
write('time : '),
write(Y),
nl.
five_house(L, Lab) :-
fd_set_vector_max(5),
L = [N1, N2, N3, N4, N5, C1, C2, C3, C4, C5, P1, P2, P3, P4, P5, A1, A2, A3, A4, A5, D1, D2, D3, D4, D5],
fd_domain(L, 1, 5),
N5 #= 1,
D5 #= 3,
fd_all_different([C1, C2, C3, C4, C5]),
fd_all_different([P1, P2, P3, P4, P5]),
fd_all_different([N1, N2, N3, N4, N5]),
fd_all_different([A1, A2, A3, A4, A5]),
fd_all_different([D1, D2, D3, D4, D5]),
N1 #= C2,
N2 #= A1,
N3 #= P1,
N4 #= D3,
P3 #= D1,
C1 #= D4,
P5 #= A4,
P2 #= C3,
C1 #= C5 + 1,
plus_or_minus(A3, P4, 1),
plus_or_minus(A5, P2, 1),
plus_or_minus(N5, C4, 1),
% lab(Lab,L). % faster than lab(Lab,[C1,...,D5])
lab(Lab, [C1, C2, C3, C4, C5, P1, P2, P3, P4, P5, N1, N2, N3, N4, N5, A1, A2, A3, A4, A5, D1, D2, D3, D4, D5]).
% partial lookahead
plus_or_minus(X, Y, C) :-
X #= Y + C.
plus_or_minus(X, Y, C) :-
X + C #= Y.
lab(normal, L) :-
fd_labeling(L).
lab(ff, L) :-
fd_labelingff(L).
get_fd_labeling(Lab) :-
argument_counter(C),
get_labeling1(C, Lab).
get_labeling1(1, normal).
get_labeling1(2, Lab) :-
argument_value(1, Lab).
:- initialization(q).
|