% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %% Program rozwiazujacy zagadke Einsteina             2002.10.29    %%
% %%                                                                  %% 
% %%  Autor:   Lukasz Rymarczyk         EAIiE, AiR, 4rok              %%
% %%                                                                  %%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%%  TRESC ZAGADKI:
%%
%% Krazy legenda, ze te zagadke wymyslil Albert Einstein. Podobno powiedzial
%% tez, ze 98% ludzi nie jest w stanie jej rozwiazac.
%% 
%% Pieciu ludzi mieszka w pieciu roznych domach, z ktorych kazdy ma inny kolor.
%% Wszyscy pala piec roznych marek papierosw i pija piec roznych napojow.
%% Poza tym jeszcze hoduja zwierzeta pieciu roznych gatunkow.
%%
%% Oprocz tego wiesz jeszcze, ze: 
%% 
%% -Norweg zamieszkuje pierwszy dom
%% -Anglik mieszka w czerwonym domu
%% -Zielony dom jest po lewej stronie domu bialego
%% -Dunczyk pija herbate
%% -Palacz Rothmansow mieszka obok hodowcy kotow
%% -Mieszkaniec zoltego domu pali Dunhille
%% -Niemiec pali Marlboro
%% -Mieszkaniec srodkowego domu pija mleko
%% -Palacz Rothmasow ma sasiada, ktory pija wode
%% -Palacz Pall Malli hoduje ptaki
%% -Szwed hoduje psy
%% -Norweg mieszka obok niebieskiego domu
%% -Hodowca koni mieszka obok zoltego domu
%% -Palacz Philip Morris pija piwo
%% -W zielonym domu pija sie kawe.
%%
%%   Kto w takim razie hoduje rybki???
%%
%%      Poprawne rozwiazanie generowane przez program (lub jawnie zawarte
%%                    na koncu pliku)

domains
%%%%%% Przyjecie oznaczen zmiennych w programie
%
%% GOSCIE
%  Anglik, Niemiec, Norweg, Dunczyk, Szwed 		% Kto
%   GAn     GNi       GNo    GDu       GSz              % Jaka zmienna
%% KOLORY DOMKOW                                        
% czerwony, zielony, zolty, niebieski, bialy            % jaki domek
%   Dc       Dz       Do     Dn         Db              % jaka zmienna
%% PAPIEROSY
%  Rothmans, Malboro, Pall Malhi, Philip Morris, Dunhille  % jaka marka
%%   Pr        Pm      Pp           Po            Pd       % jaka zmienna
%% NAPOJE
%  woda, herbata, kawa, mleko, piwo
%%  Kw    Kh       Kk    Km     Kp
%% ZWIERZACZKI
%  kot, pies, rybki, kon, ptaki 
%%  Zk   Zp    Zr     Zh   Zb

predicates
	gen(integer,integer,integer,integer,integer)
	losowanie(integer)
	rozw(integer)		   %%% Predykat roziwazujacy zadanie
	czyobok(integer,integer)   %%% Predykat do sprawdzania, czy A jest obok B
clauses
    rozw(Hodowca) :-
	GNo = 1 ,       % NORWEG w 1 domku
	Dn  = 2,	% Norweg obok niebieskiego,
			% Norweg w 1 ,wiec niebieski = 2
	Km  = 3,	% w srodkowym domku - mleko

 	    %Kto gdzie mieszka (kolejnosc zamieszkiwania w domkach)
	gen(GAn,GNi,GNo,GDu,GSz),	
	Kh = GDu,	% Dunczyk - Herbata
	Dc = GAn,	% Anglik w czerwonym domu
	Pm = GNi,	% Niemiec pali Marlboro

	gen(Db,Dc,Dn,Do,Dz),
	czyobok(Db,Dz),
	Db > 1,		% zielony po lewej stronie bialego
	Dz < 5,         % zielony po lewej stronie bialego (odwrocenie)
	Pd = Do, 	% mieszkaniec zoltego pali Dunhille
	Kk = Dz,	% w zielonym  - kawa
	
	gen(Pd,Pp,Pr,Po,Pm),
	Kp = Po,	% Phillip Morris - Piwo
  	Zp = GSz,	% psy u Szweda
  	Zb = Pp, 	% papugi u palacza Pall Malhi
	gen(Kh,Kw,Km,Kk,Kp),
	czyobok(Pr,Kw),

  	gen(Zh,Zk,Zr,Zb,Zp),
  	czyobok(Zk, Pr), % Rothmans obok hodowcy kotow
 	czyobok(Zh, Do), % Hodowca koni obok zoltego domku
	
	%% %%%% Kolejnosc wyswietlania rozwiazan dobralem tak,
	%%      aby latwo bylo sprawdzic, czy rozwiazanie jest poprawne
	writef("Gos %d  %d  %d  %d  %d  %d\n",GNo, GDu, GAn, GNi, GSz),write("\n"),
	writef("Dom %d  %d  %d  %d  %d  %d\n",Do,  Dn,  Dc,  Dz,  Db),write("\n"),
	writef("Pap %d  %d  %d  %d  %d  %d\n",Pd,  Pr,  Pp,  Pm,  Po),write("\n"),
	writef("Nap %d  %d  %d  %d  %d  %d\n",Kw,  Kh,  Km,  Kk,  Kp),write("\n"),
	writef("Zwi %d  %d  %d  %d  %d  %d\n",Zk, Zh, Zb, Zr, Zp),write("\n"),
	Hodowca = Zr.



	%% sprawdzmy, czy A jest obok B 
	%% czyli abs(A-B) = 1
	czyobok(A,B) :-
		X = abs(A - B),
		Z = 1,
		Z = X.
	
     % GENERATOR ROZWIAZAN ....
	gen(A,B,C,D,E) :-
		losowanie(A),
		losowanie(B),
		B<>A,
		losowanie(C),
		C<>A,
		C<>B,
		losowanie(D),
		D<>A,
		D<>B,
		D<>C,
		losowanie(E),
		E<>A,
		E<>B,
		E<>C,
		E<>D.
		
      % ROZWIAZANIA GENERATORA	
	losowanie(1).
	losowanie(2).
	losowanie(3).
	losowanie(4).
	losowanie(5).

%%  Rozwiazanie:
%%
%% Dom Nr:      1         2        3          4         5
%% Kto:         Norweg    Dunczyk  Anglik     Niemiec   Szwed
%% Co Pali:     Dunhille  Rothams  Pall Mall  Marlboro  Phillip Morris
%% Co Pije:     woda      herbata  mleko      kawa      piwo
%% Co hoduje:   koty      konie    ptaki      RYBKI     psy
