dinesmans(X) :-
%% Baker, Cooper, Fletcher, Miller, and Smith live on different floors
%% of an apartment house that contains only five floors.
Domain = [1,2,3,4,5],
%% Baker does not live on the top floor.
select(Baker,Domain,D1), Baker =\= 5,
%% Cooper does not live on the bottom floor.
select(Cooper,D1,D2), Cooper =\= 1,
%% Fletcher does not live on either the top or the bottom floor.
select(Fletcher,D2,D3), Fletcher =\= 1, Fletcher =\= 5,
%% Miller lives on a higher floor than does Cooper.
select(Miller,D3,D4), Miller > Cooper,
%% Smith does not live on a floor adjacent to Fletcher's.
select
(Smith
,D4
,_
), 1 =\
= abs(Smith
- Fletcher
),
%% Fletcher does not live on a floor adjacent to Cooper's.
1 =\
= abs(Fletcher
- Cooper
),
%% Where does everyone live?
X = ['Baker'(Baker), 'Cooper'(Cooper), 'Fletcher'(Fletcher),
'Miller'(Miller), 'Smith'(Smith)].
main
:- bagof( X
, dinesmans
(X
), L
) -> maplist
( writeln
, L
), nl, write('No more solutions.') ; write('No solutions.').
ZGluZXNtYW5zKFgpIDotCiAgICAlJSBCYWtlciwgQ29vcGVyLCBGbGV0Y2hlciwgTWlsbGVyLCBhbmQgU21pdGggbGl2ZSBvbiBkaWZmZXJlbnQgZmxvb3JzIAogICAgJSUgb2YgYW4gYXBhcnRtZW50IGhvdXNlIHRoYXQgY29udGFpbnMgb25seSBmaXZlIGZsb29ycy4gCiAgICBEb21haW4gPSBbMSwyLDMsNCw1XSwKCiAgICAlJSBCYWtlciBkb2VzIG5vdCBsaXZlIG9uIHRoZSB0b3AgZmxvb3IuIAogICAgc2VsZWN0KEJha2VyLERvbWFpbixEMSksIEJha2VyID1cPSA1LAoKICAgICUlIENvb3BlciBkb2VzIG5vdCBsaXZlIG9uIHRoZSBib3R0b20gZmxvb3IuCiAgICBzZWxlY3QoQ29vcGVyLEQxLEQyKSwgQ29vcGVyID1cPSAxLAoKICAgICUlIEZsZXRjaGVyIGRvZXMgbm90IGxpdmUgb24gZWl0aGVyIHRoZSB0b3Agb3IgdGhlIGJvdHRvbSBmbG9vci4KICAgIHNlbGVjdChGbGV0Y2hlcixEMixEMyksIEZsZXRjaGVyID1cPSAxLCBGbGV0Y2hlciA9XD0gNSwKCiAgICAlJSBNaWxsZXIgbGl2ZXMgb24gYSBoaWdoZXIgZmxvb3IgdGhhbiBkb2VzIENvb3Blci4gCiAgICBzZWxlY3QoTWlsbGVyLEQzLEQ0KSwgTWlsbGVyID4gQ29vcGVyLAoKICAgICUlIFNtaXRoIGRvZXMgbm90IGxpdmUgb24gYSBmbG9vciBhZGphY2VudCB0byBGbGV0Y2hlcidzLgogICAgc2VsZWN0KFNtaXRoLEQ0LF8pLCAxID1cPSBhYnMoU21pdGggLSBGbGV0Y2hlciksCgogICAgJSUgRmxldGNoZXIgZG9lcyBub3QgbGl2ZSBvbiBhIGZsb29yIGFkamFjZW50IHRvIENvb3BlcidzLgogICAgMSA9XD0gYWJzKEZsZXRjaGVyIC0gQ29vcGVyKSwKCiAgICAlJSBXaGVyZSBkb2VzIGV2ZXJ5b25lIGxpdmU/CiAgICBYID0gWydCYWtlcicoQmFrZXIpLCAnQ29vcGVyJyhDb29wZXIpLCAnRmxldGNoZXInKEZsZXRjaGVyKSwgCiAgICAgICAgICdNaWxsZXInKE1pbGxlciksICdTbWl0aCcoU21pdGgpXS4KCm1haW4gOi0gIGJhZ29mKCBYLCBkaW5lc21hbnMoWCksIEwgKSAKICAgICAgICAgLT4gbWFwbGlzdCggd3JpdGVsbiwgTCksIG5sLCB3cml0ZSgnTm8gbW9yZSBzb2x1dGlvbnMuJykgCiAgICAgICAgIDsgIHdyaXRlKCdObyBzb2x1dGlvbnMuJyku