/*
The five houses puzzle
Five men with different nationalities live in the first five houses of a street.
They smoke five distinct kinds of cigarettes, and each of them has a favorite
animal and a favorite drink, all of them different. The five houses are
painted different colors. The following facts are know:
1. The Englishman lives in a red house.
2. The Spaniard owns a dog.
3. The owner of the green house drinks coffee.
4. The Ukrainian drinks tea.
5. The green house is to the right of the ivory one.
6. The person who smoke winstons breeds snails.
7. In the yellow house one smokes kools.
8. Milk is drunk in the middle house.
9. The Norwegian lives in the first house on the left.
10. The house of the fox is next to the one of the chesterfields smoker.
11. The house of the horse is next to the one of the kools smoker.
12. The lucky strikes smoker drinks orange juice.
13. The Japanese smokes parliaments.
14. The Norwegian's house is next to the blue one.
Where does the zebra live? And who drinks water?
*/
% house(Color,Nationality,Animal,Drink,Cigarettes)
main :-
houses(Houses),
member(house(red, english, _, _, _), Houses),
member(house(_, spanish, dog, _, _), Houses),
member(house(green, _, _, coffee, _), Houses),
member(house(_, ukrainian, _, tea, _), Houses),
right_of(house(green,_,_,_,_), house(ivory,_,_,_,_), Houses),
member(house(_, _, snails, _, winstons), Houses),
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),
member(house(_, _, _, orange_juice, lucky_strikes), Houses),
member(house(_, japanese, _, _, parliaments), Houses),
next_to(house(_,norwegian,_,_,_), house(blue,_,_,_,_), Houses),
member(house(_, _, zebra, _, _), Houses),
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).
member(X, [X|_]).
member(X, [_|Y]) :- member(X, Y).
print_houses([A|B]) :- !,
write(A), nl,
print_houses(B).
print_houses([]).
% Solution
% house(yellow,norwegian,fox,water,kools)
% house(blue,ukrainian,horse,tea,chesterfields)
% house(red,english,snails,milk,winstons)
% house(ivory,spanish,dog,orange_juice,lucky_strikes )
% house(green,japanese,zebra,coffee,parliaments)