Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 8113711
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 6, 20262026-06-06T02:55:03+00:00 2026-06-06T02:55:03+00:00

I have been given an exercise to solve the zebra puzzle using a constraint

  • 0

I have been given an exercise to solve the zebra puzzle using a constraint solver of my choice, and I tried it using the Prolog clpfd library.

I am aware that there are other more idiomatic ways to solve this problem in Prolog, but this question is specifically about the clpfd package!

So the specific variation of the puzzle (given that there are many of them) I’m trying to solve is this one:

There are five houses

  1. The Englishman lives in the red house
  2. The Swedish own a dog
  3. The Danish likes to drink tea
  4. The green house is left to the white house
  5. The owner of the green house drinks coffee
  6. The person that smokes Pall Mall owns a bird
  7. Milk is drunk in the middle house
  8. The owner of the yellow house smokes Dunhill
  9. The norwegian lives in the first house
  10. The marlboro smoker lives next to the cat owner
  11. The horse owner lives next to the person who smokes dunhill
  12. The winfield smoker likes to drink beer
  13. The norwegian lives next to the blue house
  14. The german smokes rothmanns
  15. The marlboro smoker has a neighbor who drinks water

I tried to solve it with the following approach:

Each attribute a house can have is modeled as a variable, e.g. “British”,
“Dog”, “Green”, etc. The attributes can take values from 1 to 5, depending on the house
in which they occur, e.g. if the variable “Dog” takes the value 3, the dog lives in the
third house.

This approach makes it easy to model neighbor constraints like this:

def neighbor(X, Y) :-
    (X #= Y-1) #\/ (X #= Y+1).

But somehow, the clpfd package does not yield a solution, even though (IMO) the problem is modeled correctly (I used the exact same model with the Choco constraint solver and the result was correct).

Here is the complete code:

:- use_module(library(clpfd)).

neighbor(X, Y) :-
    (X #= (Y - 1)) #\/ (X #= (Y + 1)).

solve([British, Swedish, Danish, Norwegian, German], Fish) :-

    Nationalities = [British, Swedish, Danish, Norwegian, German],
    Colors = [Red, Green, Blue, White, Yellow],
    Beverages = [Tea, Coffee, Milk, Beer, Water],
    Cigarettes = [PallMall, Marlboro, Dunhill, Winfield, Rothmanns],
    Pets = [Dog, Bird, Cat, Horse, Fish],

    all_different(Nationalities),
    all_different(Colors),
    all_different(Beverages),
    all_different(Cigarettes),
    all_different(Pets),

    Nationalities ins 1..5,
    Colors ins 1..5,
    Beverages ins 1..5,
    Cigarettes ins 1..5,
    Pets ins 1..5,

    British #= Red, % Hint 1
    Swedish #= Dog, % Hint 2
    Danish #= Tea, % Hint 3

    Green #= White - 1 , % Hint 4
    Green #= Coffee, % Hint 5,
    PallMall #= Bird, % Hint 6

    Milk #= 3, % Hint 7
    Yellow #= Dunhill, % Hint 8,
    Norwegian #= 1, % Hint 9

    neighbor(Marlboro, Cat), % Hint 10
    neighbor(Horse, Dunhill), % Hint 11
    Winfield #= Beer, % Hint 12

    neighbor(Norwegian, Blue), % Hint 13
    German #= Rothmanns, % Hint 14,
    neighbor(Marlboro, Water). % Hint 15

Did I misunderstand a concept within clpfd, or am I simply missing something obvious here? In case it helps, here you can find the same approach implemented using Choco and Scala.


Edit: The reason why I believe that the solver isn’t able to solve the problem ist that it never comes up with definite values for the variables, but only with ranges, e.g. “Fish 1..3\/5”.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-06T02:55:05+00:00Added an answer on June 6, 2026 at 2:55 am

    running your code in SWI-Prolog, I get

    ?- solve(X),label(X).
    X = [3, 5, 2, 1, 4].
    

    Without label:

    ?- solve(X).
    X = [3, _G3351, _G3354, 1, _G3360],
    _G3351 in 4..5,
    all_different([_G3351, _G3386, _G3389, 2, _G3395]),
    all_different([3, _G3351, _G3354, 1, _G3360]),
    _G3386 in 3..5,
    all_different([_G3386, _G3444, 1, _G3450, _G3360]),
    _G3389 in 1\/3..5,
    _G3389+1#=_G3478,
    _G3492+1#=_G3389,
    _G3395 in 1\/3..5,
    _G3478 in 2..6,
    _G3444#=_G3478#<==>_G3529,
    _G3444 in 2..5,
    _G3444#=_G3556#<==>_G3553,
    _G3444#=_G3568#<==>_G3565,
    _G3444#=_G3492#<==>_G3577,
    _G3450 in 2\/5,
    all_different([_G3354, 4, 3, _G3450, _G3614]),
    _G3360 in 2\/4..5,
    _G3354 in 2\/5,
    _G3614 in 1..2\/5,
    _G3614+1#=_G3556,
    _G3568+1#=_G3614,
    _G3556 in 2..3\/6,
    _G3553 in 0..1,
    _G3565#\/_G3553#<==>1,
    _G3565 in 0..1,
    _G3568 in 0..1\/4,
    _G3492 in 0..4,
    _G3577 in 0..1,
    _G3577#\/_G3529#<==>1,
    _G3529 in 0..1.
    

    If I change all_different to all_distinct I get the solution without label:

    ....
    all_distinct(Nationalities),
    all_distinct(Colors),
    all_distinct(Beverages),
    all_distinct(Cigarettes),
    all_distinct(Pets),
    ....
    
    ?- solve(X).
    X = [3, 5, 2, 1, 4].
    

    As you see, the docs state stronger propagation for all_distinct vs all_different. Running the proposed sample help to understand the difference between those:

    ?- maplist(in, Vs, [1\/3..4, 1..2\/4, 1..2\/4, 1..3, 1..3, 1..6]), all_distinct(Vs).
    false.
    
    ?- maplist(in, Vs, [1\/3..4, 1..2\/4, 1..2\/4, 1..3, 1..3, 1..6]), all_different(Vs).
    Vs = [_G419, _G422, _G425, _G428, _G431, _G434],
    _G419 in 1\/3..4,
    all_different([_G419, _G422, _G425, _G428, _G431, _G434]),
    _G422 in 1..2\/4,
    _G425 in 1..2\/4,
    _G428 in 1..3,
    _G431 in 1..3,
    _G434 in 1..6.
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I have been given an exercise about anagrams and it looked so really easy
I have been given the task of using java to produce a Sin table,
I have been given the following request. Please give 7% of the current contacts
I have been given the option to either have a Windows laptop or a
I have been given the task of adding functionality to an existing IIS 6.0
I have been given the unenviable task of cleaning up after a developer who
I have been given an app written by someone else and the error I
I have been given a WSDL file and I need to consume a web
I have been given the task to design a database to store a lot
I have been given a staff list which is supposed to be up to

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.