Title: Master Class
Solved by: Doug Edmunds
Publication: Dell Logic Puzzles
Issue: April, 1998
Page: 12
Stars: 2

Clues

/*
Dell Logic Puzzles 4/98 Edition p12
Title: Master Class (2 star)
Solved 14 Nov 1999

This solution treats two robinsons as
robinson1 and robinson2 and
treats two tenors as tenor1 and tenor2.
Thus there are multiple solutions as they
change places (pat is sometimes tenor1,
sometimes tenor2), etc.

order: 1 2 3 4 5
firsts: chris jp lee pat val
lasts: kingsley robinson robinson ulrich walker
voices: soprano-f mezzo-f tenor-m tenor-m bass-m

correct solution
singer(Order,FirstName, LastName, Voice)
singer(1, val, walker, bass),
singer(2, pat, robinson2, tenor1),
singer(3, lee, robinson1, soprano),
singer(4, chris, kingsley, mezzo),
singer(5, jp, ulrich, tenor2)
*/

:- use_module(library(fd)).
:- writeln("type: start(Units)").

start(Units) :-

Units =
[
singer(1, _,_,_),
singer(2, _,_,_),
singer(3, _,_,_),
singer(4, _,_,_),
singer(5, _,_,_)
],

[Chris, JP, Lee, Pat, Val,
Kingsley, Robinson1, Robinson2, Ulrich, Walker,
Soprano, Mezzo, Tenor1, Tenor2, Bass] ::1..5,

Constraints =
[
singer(Chris, chris, _, _),
singer(JP, jp, _, _),
singer(Lee, lee, _, _),
singer(Pat, pat, _, _),
singer(Val, val, _, _),

singer(Kingsley, _, kingsley, _),
singer(Robinson1,_, robinson1, _),
singer(Robinson2,_, robinson2, _),
singer(Ulrich, _, ulrich, _),
singer(Walker, _, walker, _),

singer(Soprano, _, _, soprano ),
singer(Mezzo, _, _, mezzo ),
singer(Tenor1, _, _, tenor1 ),
singer(Tenor2, _, _, tenor2 ),
singer(Bass, _, _, bass )
],

firstandsecond(Pat,Bass),

Kingsley ## 5,
Robinson1 ## 5,
Robinson2 ## 5,

oneormore(Tenor1,Tenor2),

tenorandmezzo(Kingsley,Mezzo,Tenor1,Tenor2),

3 ## Chris,
Walker ## Chris,
thirdisRobinson(Robinson1,Robinson2),

Ulrich ## Mezzo,
Ulrich ## Bass,
Lee ## Tenor1,
Lee ## Tenor2,
Val ## Tenor1,
Val ## Tenor2,
Val ## 3,
JP ## 3,
Chris ## 5,
Bass ##Robinson1,
Bass ##Robinson2,

psubset(Constraints, Units),
(foreach(Unit,Units) do writeln (Unit)).


psubset([],_).
psubset([H|T],List) :-
member(H,List),
psubset(T,List).


%clue1
firstandsecond(A,B) :- A #= 1, B #= 2.
firstandsecond(A,B) :- A #= 2, B #= 1.


%clue 2
oneormore(T1,T2):- T1 #= 2, T2 #=3.
oneormore(T1,T2):- T1 #= 3, T2 #=2.
oneormore(T1,T2):- T1 #= 2, T2 ##3.
oneormore(T1,T2):- T1 #= 3, T2 ##2.
oneormore(T1,T2):- T1 ## 3, T2 #=2.
oneormore(T1,T2):- T1 ## 2, T2 #=3.


%clue3
tenorandmezzo(K,Mez,T1, T2):- Mez #= K, (T1 #= 5; T2 #= 5).
tenorandmezzo(K,Mez,T1, T2):- Mez #= 5, (T1 #= K; T2 #= K).


%clue 4
thirdisRobinson(R1,R2) :- R1 #= 3, R2 ##3.
thirdisRobinson(R1,R2) :- R2 #= 3, R1 ##3.


% © Copyright Doug Edmunds 2000