% a solution to the zebra problem

% basic call solving puzzle

test:-
      test_puzzle(zebra,Puzz),
      solve_puzzle(Puzz,Sol),
      write(Sol),nl.


% sole the puzzle by solving clues and queries

solve_puzzle(puzzle(Clues,Queries,Soln),Soln) :-
      solve(Clues),solve(Queries).

% solve each clue/queery

solve([Clue|Clues]) :-
      Clue,
      solve(Clues).

solve([]).

% setting up the puzzle

test_puzzle(Name,puzzle(Clues,Queries,Soln)) :-
     structure(Name,Struct),
     clues(Name,Struct,Clues),
     queries(Name,Struct,Queries,Soln).

% str5ucture of the solution is list of houses. Position in list determines
% house order

structure(zebra,[house(C1,N1,P1,D1,S1),house(C2,N2,P2,D2,S2),
                 house(C3,N3,P3,D3,S3),house(C4,N4,P4,D4,S4),house(C5,N5,P5,D5,S5)]).

% now the clues

clues(zebra,Houses,
      [first(house(C9,norwegian,P9,D9,S9),Houses),       % clue 9
       middle(house(C8,N8,P8,milk,S8),Houses),           % clue 8
       next(house(C1C14,norwegian,P1C14,D1C14,S1C14),
            house(blue,N2C14,P2C14,D2C14,S2C14),Houses), % clue 14
       memhouse(red,english,P1,D1,S1,Houses),            % clue 1
       memhouse(C2,spanish,dog,D2,S2,Houses),            % clue 2
       memhouse(green,N3,P3,coffee,S3,Houses),           % clue 3
       memhouse(C4,ukranian,P4,tea,S4,Houses),           % clue 4
       before(house(ivory,N1C5,P1C5,D1C5,S1C5),
              house(green,N3,P3,coffee,S3),Houses),      % clue 5
       memhouse(C6,N6,snail,D6,winston,Houses),          % clue 6
       memhouse(yellow,N7,P7,D7,kools,Houses),           % clue 7
       next(house(C1C10,N1C10,P1C10,D1C10,chesterfield),
            house(C2C10,N2C10,fox,D2C10,S2C10),Houses),  % clue 10
       next(house(C1C11,N1C11,P1C11,D1C11,kools),
            house(C2C11,N2C11,horse,D2C11,S2C11),Houses),  % clue 11
       memhouse(C12,N12,P12,orange,lucky,Houses),          % clue 12
       memhouse(C13,japanese,P13,D13,parliaments,Houses)         % clue 13
      ]).


% and the queries

queries(zebra,Houses,
       [memhouse(QC1,QN1,zebra,QD1,QS1,Houses), % query 1
        memhouse(QC2,QN2,QP2,water,QS2,Houses) % query 2
       ],
        [['The nationality of the zebra owner is ',QN1],
         ['The nationality of the water drinker is ' ,QN2]]
).

% auxiliary predicates

middle(C,[A,B,C,D,E]).    % C is the middle elenet of the list

before(A,B,[A,B,C,D,E]).
before(B,C,[A,B,C,D,E]).
before(C,D,[A,B,C,D,E]).
before(D,E,[A,B,C,D,E]).


next(A,B,Houses) :- before(A,B,Houses);before(B,A,Houses).

first(X,[X|Xs]).

memhouse(A,B,C,D,E,Houses) :-
   member(house(A,B,C,D,E),Houses).



