Path: utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!tut.cis.ohio-state.edu!gem.mps.ohio-state.edu!wuarchive!psuvax1!psuvm!cunyvm.bitnet!lazbm
From: LAZBM@CUNYVM.CUNY.EDU
Newsgroups: comp.lang.prolog
Subject: The jobs puzzle
Message-ID: <2572LAZBM@CUNYVM>
Date: 2 Oct 89 13:51:15 GMT
Organization: The City University of New York - New York, NY
Lines: 54
DISCLAIMER: Author bears full responsibility for contents of this article


 This is my solution to the jobs puzzle.
 It works, but it would be nice to write down the problem and that would
 be the solution.
 Anybody has a better solution?

/* The jobs puzzle
 * 1  There are four people roberta thelma steve and pete
 * 2  Among them,they hold eight different jobs
 * 3  Each holds exactly 2 jobs
 * 4  The jobs are:chef,guard,nurse,telephone operator,
 *        police officer(gender not implied) teacher actor boxer
 * 5  The job of nurse is held by a male
 * 6  The husband of the chef is the telephone operator
 * 7  Roberta is not the boxer
 * 8  Pete has no education past ninth grade
 * 9  Roberta, the chef and the police officer went golfing together
 */
solve:-joblist(Jlist),
       del(J1,Jlist,Jl1),del(J2,Jl1,Jl2),J1 < J2 ,hasjobs(roberta,J1,J2),
       del(J3,Jl2,  Jl3),del(J4,Jl3,Jl4),J3 < J4 ,hasjobs(thelma ,J3,J4),
       del(J5,Jl4  ,Jl5),del(J6,Jl5,Jl6),J5 < J6 ,hasjobs(steve  ,J5,J6),
       del(J7,Jl6  ,Jl7),del(J8,Jl7,Jl8),J7 < J8 ,hasjobs(pete   ,J7,J8),
       write('roberta '),write(J1),write(' '),write(J2),nl,
       write('thelma  '),write(J3),write(' '),write(J4),nl,
       write('steve   '),write(J5),write(' '),write(J6),nl,
       write('pete    '),write(J7),write(' '),write(J8),nl.

hasjobs(X,chef,police):-!,fail.      /*9 */
hasjobs(X,police,chef):-!,fail.      /*9 */
hasjobs(X,telop,chef):-!,fail.       /*6 */
hasjobs(X,chef,telop):-!,fail.       /*6 */
hasjobs(X,J1,J2):- hasjob(X,J1),
                   hasjob(X,J2).

hasjob(roberta,chef):-!,fail.       /*9 */
hasjob(roberta,police):-!,fail.     /*9 */
hasjob(pete,police):-!,fail.        /*8*/
hasjob(pete,nurse ):-!,fail.        /*8*/
hasjob(pete,teacher):-!,fail.       /*8*/
hasjob(roberta,boxer):- !,fail.     /*7*/
hasjob(X,nurse):- !,male(X).        /*5*/
hasjob(X,actor):- !,male(X).                 /* meaning of actor*/
hasjob(X,telop):-!,male(X).         /*6 */
hasjob(X,chef ):-!,not male(X).     /*6 */
hasjob(X,Y).

male(steve).
male(pete ).

/* list symbol is { } in this prolog */
joblist({chef,guard,nurse,telop,police,teacher,actor,boxer}).
del(X,{X|T},T).
del(X,{Y|T},{Y|T1}) :- del(X,T,T1).