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).