/* Reprezentujme jeden dum jako seznam [Barva,Narodnost,Kurivo,Piti,Zvire] a vsechny domy jako seznam peti takovych seznamu (v poradi zleva doprava, jak to vidi pozorovatel). */ /* Budeme vyuzivat obousmernost predikatu; member umoznuje nejen testovat, zda je prvek v seznamu, ale taky ho umi "vsunout" do seznamu na misto promenne. */ member(X,[X|_]). member(X,[_|Y]) :- member(X,Y). % potrebujeme urcit, co je nalevo (z pohledu pozorovatele) left_right(L,R,[L,R,_,_,_]). left_right(L,R,[_,L,R,_,_]). left_right(L,R,[_,_,L,R,_]). left_right(L,R,[_,_,_,L,R]). % potrebujeme urcit, co je vedle next_to(X,Y,L) :- left_right(X,Y,L). next_to(X,Y,L) :- left_right(Y,X,L). % Lustime zebru, kodujeme podminky ze zadani, nejprve ty nejvice urcujici. % Na poradi nekterych podminek zalezi efektivita. % To, ze barvy, narodnosti, kurivo, napoje a zvirata jsou exkluzivni, % zajistuji jejich pocty v zadani, zvolena reprezentace a formulace podminek. % Na miste pateho zvirete zustane volna promenna. zebra(S) :- % [Barva,Narodnost,Kurivo,Piti,Zvire] pro pripomenuti S = [[_,nor,_,_,_],_,[_,_,_,mleko,_],_,_], % 8 a 9 next_to([_,nor,_,_,_],[modry,_,_,_,_],S), % 14 member([cerveny,brit,_,_,_],S), % 1 member([_,sved,_,_,pes],S), % 2 member([_,dan,_,caj,_],S), % 3 left_right([zeleny,_,_,_,_],[bily,_,_,_,_],S), % 4 member([zeleny,_,_,kava,_],S), % 5 member([_,_,pallmall,_,ptak],S), % 6 member([zluty,_,dunhill,_,_],S), % 7 next_to([_,_,blend,_,_],[_,_,_,_,kocka],S), % 10 next_to([_,_,_,_,kun],[_,_,dunhill,_,_],S), % 11 member([_,_,bluemaster,pivo,_],S), % 12 member([_,nemec,prince,_,_],S), % 13 next_to([_,_,blend,_,_],[_,_,_,voda,_],S). % 15 % kdo ma rybicky? rybicky(X) :- zebra(S), member([_,X,_,_,rybicky],S). % pomoci ?- zebra([A,B,C,D,E]). celkem citelne vypiseme, jak cela situace % vypada. Kdyby existovalo vice reseni, pomoci stredniku najdeme vsechna.