select([A|As],S):- select(A,S,S1),select(As,S1).
select([],_).
next_to(A,B,C):- left_of(A,B,C) ; left_of(B,A,C).
left_of(A,B,C):- append(_,[A,B|_],C).
zebra(Owns, HS):- % color,nation,pet,drink,smokes
HS = [h(_,norwegian,_,_,_),_,h(_,_,_,milk,_),_,_],
select([h(red,english,_,_,_),h(_,swede,dog,_,_),h(_,dane,_,tea,_),
h(_,german,_,_,prince)], HS),
select([h(_,_,birds,_,pallmall),h(yellow,_,_,_,dunhill),
h(_,_,_,beer,bluemaster)], HS),
left_of( h(green,_,_,coffee,_),h(white,_,_,_,_), HS),
next_to( h(_,_,_,_,dunhill),h(_,_,horse,_,_), HS),
next_to( h(_,_,_,_,blend), h(_,_,cats, _,_), HS),
next_to( h(_,_,_,_,blend), h(_,_,_,water,_), HS),
next_to( h(_,norwegian,_,_,_), h(blue,_,_,_,_), HS),
member( h(_,Owns,zebra,_,_), HS).
main :-
;
write('No more solutions.').
c2VsZWN0KFtBfEFzXSxTKTotIHNlbGVjdChBLFMsUzEpLHNlbGVjdChBcyxTMSkuCnNlbGVjdChbXSxfKS4gCiAKbmV4dF90byhBLEIsQyk6LSBsZWZ0X29mKEEsQixDKSA7IGxlZnRfb2YoQixBLEMpLgpsZWZ0X29mKEEsQixDKTotIGFwcGVuZChfLFtBLEJ8X10sQykuCiAKemVicmEoT3ducywgSFMpOi0gICUgY29sb3IsbmF0aW9uLHBldCxkcmluayxzbW9rZXMKICAgICAgSFMgPSBbaChfLG5vcndlZ2lhbixfLF8sXyksXyxoKF8sXyxfLG1pbGssXyksXyxfXSwgCiAgICAgIHNlbGVjdChbaChyZWQsZW5nbGlzaCxfLF8sXyksaChfLHN3ZWRlLGRvZyxfLF8pLGgoXyxkYW5lLF8sdGVhLF8pLAogICAgICAgICAgICAgIGgoXyxnZXJtYW4sXyxfLHByaW5jZSldLCBIUyksCiAgICAgIHNlbGVjdChbaChfLF8sYmlyZHMsXyxwYWxsbWFsbCksaCh5ZWxsb3csXyxfLF8sZHVuaGlsbCksCiAgICAgICAgICAgICAgaChfLF8sXyxiZWVyLGJsdWVtYXN0ZXIpXSwgSFMpLCAKICAgICAgbGVmdF9vZiggaChncmVlbixfLF8sY29mZmVlLF8pLGgod2hpdGUsXyxfLF8sXyksIEhTKSwKICAgICAgbmV4dF90byggaChfLF8sXyxfLGR1bmhpbGwpLGgoXyxfLGhvcnNlLF8sXyksIEhTKSwKICAgICAgbmV4dF90byggaChfLF8sXyxfLGJsZW5kKSwgIGgoXyxfLGNhdHMsIF8sXyksIEhTKSwKICAgICAgbmV4dF90byggaChfLF8sXyxfLGJsZW5kKSwgIGgoXyxfLF8sd2F0ZXIsXyksIEhTKSwKICAgICAgbmV4dF90byggaChfLG5vcndlZ2lhbixfLF8sXyksIGgoYmx1ZSxfLF8sXyxfKSwgSFMpLAogICAgICBtZW1iZXIoICBoKF8sT3ducyx6ZWJyYSxfLF8pLCBIUykuCgptYWluIDotIAogICAgemVicmEoV2hvLCBIUyksIG1hcGxpc3Qod3JpdGVsbixIUyksIG5sLCB3cml0ZShXaG8pLCBubCwgbmwsIGZhaWwgCiAgICA7CiAgICB3cml0ZSgnTm8gbW9yZSBzb2x1dGlvbnMuJyku