0

I have a problem with zebra puzzle.

    rightOf(A,B,(B,A,_,_,_)).
    rightOf(A,B,(_,B,A,_,_)).
    rightOf(A,B,(_,_,B,A,_)).
    rightOf(A,B,(_,_,_,B,A)).

    middleHouse(A,(_,_,A,_,_)).
    firstHouse(A,(A,_,_,_,_)).

    nextTo(A,B,(A,B,_,_,_)).
    nextTo(A,B,(_,A,B,_,_)).
    nextTo(A,B,(_,_,A,B,_)).
    nextTo(A,B,(_,_,_,A,B)).
    nextTo(A,B,(B,A,_,_,_)).
    nextTo(A,B,(_,B,A,_,_)).
    nextTo(A,B,(_,_,B,A,_)).
    nextTo(A,B,(_,_,_,B,A)).

    house[Nationality,Pet,Sport,Drinks,Colour].

    zebra_owner(Owner) :-
        houses(Houses),
        exists(house(Owner,zebra,_,_,_), Houses).

    length(5,Houses),
    exists(house(british,_,_,_,red),Houses),
    exists(house(spanish,dog,_,_,_),Houses),
    exists(house(_,_,_,coffe,green),Houses),
    exists(house(ukrainian,_,_,tea,_),Houses),
    rightOf(house(_,_,_,_,green),house(_,_,_,_,ivory),Houses),
    exists(house(_,snail,tennis,_,_),Houses),
    exists(house(_,_,chess,_,yellow),Houses),
    middleHouse(house(_,_,_,mlik,_),Houses),
    firstHouse(house(norwegian,_,_,_,_),Houses),
    nextTo(house(_,_,rugby,_,_),house(_,fox,_,_,_),Houses),
    nextTo(house(_,_,chess,_,_),house(_,horse,_,_,_),Houses),
    exists(house(_,_,volleyball,orangejuice,_),Houses),
    exists(house(japanese,_,_,_,_),Houses),
    nextTo(house(norwegian,_,_,_,_),house(_,_,_,_,blue),Houses),
    nextTo(house(_,_,_,tea,_),house(_,_,_,milo,_),Houses),
    exists(house(zebra_owner,zebra,_,_,_),Houses).

Under

house[Nationality,Pet,Smokes,Drinks,Colour].

I see the error: Singleton variables: house[Nationality,Pet,Smokes,Drinks,Colour].

And when I write ?- zebra_owner(Owner)

I see the error: procedure 'houses(A)' does not exist. Reachable from:zebra_owner(A).`

David Tonhofer
  • 14,559
  • 5
  • 55
  • 51

1 Answers1

1

You cannot write

house[Nationality,Pet,Sport,Drinks,Colour].

that's non-existent syntax.

To express that predicate house/1 is valid for list [Nationality,Pet,Sport,Drinks,Colour], write:

house([Nationality,Pet,Sport,Drinks,Colour]).

You also must pay attention to predicate naming: houses/1 is not house/1. Predicate houses/1 is defined nowhere (the error message is wrong, it should really say predicate houses/1 is undeclared).

David Tonhofer
  • 14,559
  • 5
  • 55
  • 51