Q:

Solving logic puzzle in Prolog

I am reading "Learn Prolog Now" and one of its exercises I haven't been able to solve myself  is the following:

There is a street with three
  neighboring houses that all have a
  different color. They are red, blue,
  and green. People of different
  nationalities live in the different
  houses and they all have a different
  pet. Here are some more facts about
  them:

The Englishman lives in the red house.
The jaguar is the pet of the Spanish family.
The Japanese lives to the right of the snail keeper.
The snail keeper lives to the left of the blue house.

Who keeps the zebra?
Define a predicate zebra/1 that tells you the nationality of the owner of the zebra.
Hint: Think of a representation for the houses and the street. Code the four constraints in Prolog. member and sublist might be useful predicates.

Any ideas how to code it under Prolog? Thanks.

A:

neigh(Left, Right, List) :- 
        List = [Left | [Right | _]];
        List = [_ | [Left | [Right]]].

zebraowner(Houses, ZebraOwner):-
        member([englishman, _, red], Houses),
        member([spanish, jaguar, _], Houses),
        neigh([_, snail, _], [japanese, _, _], Houses),
        neigh([_, snail, _], [_, _, blue], Houses),
        member([ZebraOwner, zebra, _], Houses),
        member([_, _, green], Houses).

zebra(X) :- zebraowner([_, _, _], X).

