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([]).

```

• Prev by Date: AW: Making a LIst Reconsidered
• Next by Date: Re: Transforming matrices
• Previous by thread: Logic Programming
• Next by thread: Re: Question: How to display matrixes with a tube-defined figure