Re: Logic Programming
- To: mathgroup at smc.vnet.net
- Subject: [mg29670] Re: Logic Programming
- From: "Herwig Habenbacher" <habenb at hilti.com>
- Date: Tue, 3 Jul 2001 04:40:24 -0400 (EDT)
- References: <9hp4r6$2er$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Looks like the "classic" "Zebra" puzzle... It was used in the Prolog community to test your own programming skills and the speed of the Prolog implementation too... Here a solution found in some Prolog packages. Regards, Herwig --------------------------------------------------------- Herwig Habenbacher Scientific Computing (FII) Hilti AG - Technical Centre eMail: habenb at hilti.com FL - 9494 Schaan voice: ++423 234 2169 Principality of Liechtenstein fax: ++423 234 2379 % Where does the zebra live? % Puzzle solution written by Claude Sammut. go :- houses(Houses), a_member(house(red, english, _, _, _), Houses), a_member(house(_, spanish, dog, _, _), Houses), a_member(house(green, _, _, coffee, _), Houses), a_member(house(_, ukrainian, _, tea, _), Houses), right_of(house(green,_,_,_,_), house(ivory,_,_,_,_), Houses), a_member(house(_, _, snails, _, winstons), Houses), a_member(house(yellow, _, _, _, kools), Houses), Houses = [_, _, house(_, _, _, milk, _), _,_], Houses = [house(_, norwegian, _, _, _)|_], next_to(house(_,_,_,_,chesterfields), house(_,_,fox,_,_), Houses), next_to(house(_,_,_,_,kools), house(_,_,horse,_,_), Houses), a_member(house(_, _, _, orange_juice, lucky_strikes), Houses), a_member(house(_, japanese, _, _, parliaments), Houses), next_to(house(_,norwegian,_,_,_), house(blue,_,_,_,_), Houses), a_member(house(_, _, zebra, _, _), Houses), a_member(house(_, _, _, water, _), Houses), print_houses(Houses). houses([ house(_, _, _, _, _), house(_, _, _, _, _), house(_, _, _, _, _), house(_, _, _, _, _), house(_, _, _, _, _) ]). right_of(A, B, [B, A | _]). right_of(A, B, [_ | Y]) :- right_of(A, B, Y). next_to(A, B, [A, B | _]). next_to(A, B, [B, A | _]). next_to(A, B, [_ | Y]) :- next_to(A, B, Y). a_member(X, [X|_]). a_member(X, [_|Y]) :- a_member(X, Y). print_houses([A|B]) :- !, write(A), nl, print_houses(B). print_houses([]).