/*
Dell Logic Puzzles 4/98 Edition p16
Title: Jelly Beans (3 star)
solved 17 Nov 1999
ages: 7 9 10 12
names: noah oscar patty rosie
guesses: 437 462 486 501
prizes: bear gift movie sundaes
place: 1 2 3 4
correct solution
guess(Rank, Name, Prize, Guess, Age)
guess(1, rosie, movie, 437, 12),
guess(2, patty, sundae, 462, 7),
guess(3, noah, gift, 486, 10),
guess(4, oscar, bear, 501, 9)
*/
:- use_module(library(fd)).
:- writeln("type: start(Units)").
start(Units) :-
Units =
[
guess(1,_,_,_,_),
guess(2,_,_,_,_),
guess(3,_,_,_,_),
guess(4,_,_,_,_)
],
[RN,RO,RP,RR,RBear,RGift,RMovie,RSundae,
R437, R462, R486, R501,R7,R9,R10,R12] ::[1..4],
[BR, B7] ::[437,462,486,501],
[AP, AR4,AMovie, A486,AN,A501] ::[7,9,10,12],
Constraints =
[
guess(RN,noah ,_,_,_),
guess(RO,oscar,_,_,_),
guess(RP,patty,_,_,_),
guess(RR,rosie,_,_,_),
guess(RBear ,_,bear ,_,_),
guess(RGift ,_,gift ,_,_),
guess(RMovie ,_,movie ,_,_),
guess(RSundae,_,sundae,_,_),
guess(R437,_,_,437,_),
guess(R462,_,_,462,_),
guess(R486,_,_,486,_),
guess(R501,_,_,501,_),
guess(R7 ,_,_,_,7 ),
guess(R9 ,_,_,_,9 ),
guess(R10 ,_,_,_,10),
guess(R12 ,_,_,_,12),
%add min
guess(_,patty,_ ,_ ,AP ),
guess(4,_ ,_ ,_ ,AR4 ),
guess(_,rosie,_ ,BR ,_ ),
guess(_,_ ,_ ,B7 ,7 ),
guess(_,_ ,movie,_ ,AMovie ),
guess(_,_ ,_ ,486 ,A486 ),
guess(_,noah ,_ ,_ ,AN ),
guess(_,_ ,_ ,501 ,A501 )
] ,
% ranking must be lowest 1 to highest last, if lowest guess is best
% but must be highest-first to lowest-last, if highest is best
% but insufficient info if either mid-count is best
(R437 #=1 -> (R462 #=2, R486 #=3, R501#=4);
(R501 #=1 -> (R486 #=2, R462 #=3, R437#=1);
writeln("shouldn't be here, insufficient info given"),true)),
%clue 1
RN #=R9-1,
RN #>RMovie,
%clue 2
B7 ## 486,
% clue 3
R462 ## RBear,
R462 ## 1,
% clue 4
RGift ## 4,
RGift ## R7,
%clue 5 older_than
AR4 #> AP,
%clue 6 more_beans_than
B7 #> BR,
%clue 7 older_than
AMovie #> A486,
%clue 8 not_youngest
AN ##7,
R9 ## R437,
%clue 10 older_than
A501 #>7,
psubset(Constraints, Units),
(foreach(Unit,Units) do writeln (Unit)).
psubset([],_).
psubset([H|T],List) :-
member(H,List),
psubset(T,List).
% © Copyright Doug Edmunds 2000