Zebra puzzle — cine deține zebra?
Vrem să rezolvăm în Prolog următorul puzzle — Zebra puzzle.
Pentru fiecare personaj știm:
- locuiește într-o casă care are o anumită culoare
- are o naționalitate
- are un animal de companie
- are o băutură preferată
- fumează un anumit tip de țigări
Informații:
- Sunt cinci case.
- Englezul locuiește în casa roșie.
- Spaniolul are un câine.
- În casa verde se bea cafea.
- Ucraineanul bea ceai.
- Casa verde este imediat în dreapta casei bej.
- Fumătorul de Old Gold are melci.
- În casa galbenă se fumează Kools.
- În casa din mijloc se bea lapte.
- Norvegianul locuiește în prima casă.
- Fumătorul de Chesterfields locuiește lângă cel care are o vulpe.
- Kools sunt fumate în casa de lângă cea în care se ține calul.
- Fumătorul de Lucky Strike bea suc de portocale.
- Japonezul fumează Parliaments.
- Norvegianul locuiește lângă casa albastră.
Scopul este să determinăm naționalitatea posesorului zebrei.
Pentru a putea rezolva, veți defini:
right(X, Y)— adevărat cândX is Y + 1left(X, Y)— adevărat cândY is X + 1near(X, Y)— adevărat cândXeste sau la stânga, sau la dreapta luiY
Veți reprezenta casele prin house(Number, Nationality, Colour, Pet, Drink, Cigarettes).
Te-ai blocat?
editor
soluție
right(X, Y) :- X is Y + 1.
left(X, Y) :- right(Y, X).
near(X, Y) :- left(X, Y), !.
near(X, Y) :- right(X, Y).
% house(Number, Nationality, Colour, Pet, Drink, Cigarettes)
solution(Street, ZebraOwner) :-
Street = [
house(1,_,_,_,_,_),
house(2,_,_,_,_,_),
house(3,_,_,_,_,_),
house(4,_,_,_,_,_),
house(5,_,_,_,_,_)
],
member(house(_, english, red, _, _, _), Street),
member(house(_, spanish, _, dog, _, _), Street),
member(house(X, _, green, _, coffee, _), Street),
member(house(_, ukrainian, _, _, tea, _), Street),
member(house(Y, _, beige, _, _, _), Street),
right(X, Y),
member(house(_, _, _, snails, _, oldGold), Street),
member(house(U, _, yellow, _, _, kools), Street),
member(house(3, _, _, _, milk, _), Street),
member(house(1, norwegian, _, _, _, _), Street),
member(house(A, _, _, _, _, chesterfields), Street),
member(house(B, _, _, fox, _, _), Street),
near(A, B),
member(house(V, _, _, horse, _, _), Street),
near(U, V),
member(house(_, _, _, _, orangeJuice, luckyStrike), Street),
member(house(_, japanese, _, _, _, parliaments), Street),
member(house(T, _, blue, _, _, _), Street),
near(1, T),
member(house(_, ZebraOwner, _, zebra, _, _), Street).
?-
Tastează o interogare (ex. father_of(sandra, X).) și apasă Enter — sau apasă pe un caz de test de mai jos.
Cazuri de test (1 — apasă pe unul ca să îl rulezi, sau Verifică pentru toate)
?
solution(_, Owner).
așteptat: Owner = japanese