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).

is_middle(A,L):- is_middle(A,L,L).
is_middle(A,[_,_|L],[_|R]):- is_middle(A,L,R).
is_middle(A,[_],[A|_]).
 
zebra(Owns, Hs):-  % color,nation,pet,drink,smokes
      length(Hs,5),                                              %% 1
      H2   =   h(red,english,_,_,_),     member(   H2,     Hs),
      H3   =   h(_,swede,dog,_,_),       member(   H3,     Hs),
      H4   =   h(_,dane,_,tea,_),        member(   H4,     Hs),
      left_of( h(green,_,_,_,_),         h(white,_,_,_,_), Hs),  %% 5
      H6   =   h(green,_,_,coffee,_),    member(   H6,     Hs),
      H7   =   h(_,_,birds,_,pallmall),  member(   H7,     Hs),
      H8   =   h(yellow,_,_,_,dunhill),  member(   H8,     Hs),
      H9   =   h(_,_,_,milk,_),          is_middle(H9,     Hs),
      Hs   = [ h(_,norwegian,_,_,_)|_],                          %% 10 
      next_to( h(_,_,_,_,blend),         h(_,_,cats, _,_), Hs),
      next_to( h(_,_,_,_,dunhill),       h(_,_,horse,_,_), Hs),
      H13  =   h(_,_,_,beer,bluemaster), member(   H13,    Hs),
      H14  =   h(_,german,_,_,prince),   member(   H14,    Hs),
      next_to( h(_,norwegian,_,_,_),     h(blue,_,_,_,_),  Hs),  %% 15
      next_to( h(_,_,_,_,blend),         h(_,_,_,water,_), Hs),
      member(  h(_,Owns,zebra,_,_),                        Hs).

main :- 
    zebra(Who, HS), maplist(writeln,HS), nl, write(Who), nl, nl, fail 
    ;
    write('No more solutions.').