Zebra Puzzle in Prolog
Zebra Puzzle
(See wikipedia).
- Five colored houses in a row, each with an owner, a pet, cigarettes, and a drink.
- The English lives in the red house.
- The Spanish has a dog.
- They drink coffee in the green house.
- The Ukrainian drinks tea.
- The green house is next to the white house.
- The Winston smoker has a serpent.
- In the yellow house they smoke Kool.
- In the middle house they drink milk.
- The Norwegian lives in the first house from the left.
- The Chesterfield smoker lives near the man with the fox.
- In the house near the house with the horse they smoke Kool.
- The Lucky Strike smoker drinks juice.
- The Japanese smokes Kent.
- The Norwegian lives near the blue house.
Who owns the zebra and who drinks water?
Prolog Solution
Represent the solution as a list of 5 houses, with each member of the list being a term with 5 components.
h(Nationality, Pet, Cigarette, Drink, Color)
zebra_owner(Owner) :- houses(Hs), member(h(Owner,zebra,_,_,_), Hs). water_drinker(Drinker) :- houses(Hs), member(h(Drinker,_,_,water,_), Hs). houses(Hs) :- length(Hs, 5), % 1 member(h(english,_,_,_,red), Hs), % 2 member(h(spanish,dog,_,_,_), Hs), % 3 member(h(_,_,_,coffee,green), Hs), % 4 member(h(ukrainian,_,_,tea,_), Hs), % 5 adjacent(h(_,_,_,_,green), h(_,_,_,_,white), Hs), % 6 member(h(_,snake,winston,_,_), Hs), % 7 member(h(_,_,kool,_,yellow), Hs), % 8 Hs = [_,_,h(_,_,_,milk,_),_,_], % 9 Hs = [h(norwegian,_,_,_,_)|_], % 10 adjacent(h(_,fox,_,_,_), h(_,_,chesterfield,_,_), Hs), % 11 adjacent(h(_,_,kool,_,_), h(_,horse,_,_,_), Hs), % 12 member(h(_,_,lucky,juice,_), Hs), % 13 member(h(japanese,_,kent,_,_), Hs), % 14 adjacent(h(norwegian,_,_,_,_), h(_,_,_,_,blue), Hs), % 15 member(h(_,_,_,water,_), Hs), % one of them drinks water member(h(_,zebra,_,_,_), Hs). % one of them owns a zebra adjacent(A, B, Ls) :- append(_, [A,B|_], Ls). adjacent(A, B, Ls) :- append(_, [B,A|_], Ls).
Queries
?- zebra_owner(Owner). ?- water_drinker(Drinker). ?- houses(Houses).
Updated Tue Nov. 20 2018, 13:25 by cameron.