fork(2) download
  1. select([A|As],S):- select(A,S,S1),select(As,S1).
  2. select([],_).
  3.  
  4. next_to(A,B,C):- left_of(A,B,C) ; left_of(B,A,C).
  5. left_of(A,B,C):- append(_,[A,B|_],C).
  6.  
  7. is_middle(A,L):- is_middle(A,L,L).
  8. is_middle(A,[_,_|L],[_|R]):- is_middle(A,L,R).
  9. is_middle(A,[_],[A|_]).
  10.  
  11. zebra(Owns, Hs):- % color,nation,pet,drink,smokes
  12. length(Hs,5), %% 1
  13. H2 = h(red,english,_,_,_), member( H2, Hs),
  14. H3 = h(_,swede,dog,_,_), member( H3, Hs),
  15. H4 = h(_,dane,_,tea,_), member( H4, Hs),
  16. left_of( h(green,_,_,_,_), h(white,_,_,_,_), Hs), %% 5
  17. H6 = h(green,_,_,coffee,_), member( H6, Hs),
  18. H7 = h(_,_,birds,_,pallmall), member( H7, Hs),
  19. H8 = h(yellow,_,_,_,dunhill), member( H8, Hs),
  20. H9 = h(_,_,_,milk,_), is_middle(H9, Hs),
  21. Hs = [ h(_,norwegian,_,_,_)|_], %% 10
  22. next_to( h(_,_,_,_,blend), h(_,_,cats, _,_), Hs),
  23. next_to( h(_,_,_,_,dunhill), h(_,_,horse,_,_), Hs),
  24. H13 = h(_,_,_,beer,bluemaster), member( H13, Hs),
  25. H14 = h(_,german,_,_,prince), member( H14, Hs),
  26. next_to( h(_,norwegian,_,_,_), h(blue,_,_,_,_), Hs), %% 15
  27. next_to( h(_,_,_,_,blend), h(_,_,_,water,_), Hs),
  28. member( h(_,Owns,zebra,_,_), Hs).
  29.  
  30. main :-
  31. zebra(Who, HS), maplist(writeln,HS), nl, write(Who), nl, nl, fail
  32. ;
  33. write('No more solutions.').
Success #stdin #stdout #stderr 0.06s 6160KB
stdin
main.
stdout
h(yellow, norwegian, cats, water, dunhill)
h(blue, dane, horse, tea, blend)
h(red, english, birds, milk, pallmall)
h(green, german, zebra, coffee, prince)
h(white, swede, dog, beer, bluemaster)

german

No more solutions.
stderr
true.