/* 

Probléma: A farmernek át kell vinnie a folyón a farkast, kecskét, ill. a káposztát úgy, hogy 
a/ rajta kivül legföljebb egy valaki fér el a csónakban
b/ távollétében nehogy kárt tegyen a farkas a kecskében, ill. a kecske a káposztában

*/


:- module(farmer,[el/2]).


/* Egy modul definiálásakor fel kell sorolni az átadandó predikátumokat. 
   Ezeket majd közvetlenül is el lehet érni, a többit csak a modul nevének megadásával.
*/


el(EGYIK,MASIK) :- atvisz(EGYIK,MASIK), \+ hibas(EGYIK), \+ hibas(MASIK).


/*
(a \+ a tagadás jele - elvileg lehetne not-ot is írni, de nem szabványos)

vagyis akkor van él egyik állapotból a másikba, ha 
	- az egyik partról át tud vinni a másikra valakit, 
	- és egyik parton sem marad nem megengedhető állapot

Ezt persze precízen meg kell fogalmazni.

Ez van leírva az alábbiakban. Bogarássza végig, értse meg!
*/



ellenkezo(bal,jobb).
ellenkezo(jobb,bal).



/*
allapot: azt mutatja, hogy a farmer, a farkas, a kecske ill. a káposzta a folyó melyik oldalán van.
Pl allapot(bal,bal,jobb,bal) jelentése: a farmer, a farkas és a káposzta a folyó baloldalán, 
					a kecske a folyó jobboldalán van.

Lehetne négyelemű listaként ([bal,bal,jobb,bal]) vagy 
csak négy adat rögzített sorrendjével ((bal,bal,jobb,bal)) is ábrázolni, 
de így talán olvashatóbb.
*/



hibas(allapot(FARMER,_,KECSKEKAPOSZTA,KECSKEKAPOSZTA)) :- 
	ellenkezo(FARMER,KECSKEKAPOSZTA) .
hibas(allapot(FARMER,FARKASKECSKE,FARKASKECSKE,_)) :- 
	ellenkezo(FARMER,FARKASKECSKE) .


/*
vagyis: hibás az az állapot, ahol a kecske és a káposzta, 
			   illetve a farkas és a kecske 
a folyó azonos oldalán van, a farmer viszont az ellenkező oldalon. 
*/



atvisz(allapot(FARMER1,FARKAS,KECSKE,KAPOSZTA),allapot(FARMER2,FARKAS,KECSKE,KAPOSZTA)):-
	ellenkezo(FARMER1,FARMER2).  

	/*a farmer egyedül megy át a túloldalra */

atvisz(allapot(FARMER1,FARKAS1,KECSKE,KAPOSZTA),allapot(FARMER2,FARKAS2,KECSKE,KAPOSZTA)):-
	ellenkezo(FARMER1,FARMER2),
	ellenkezo(FARKAS1,FARKAS2).  

	/*a farmer a farkast viszi át */

atvisz(allapot(FARMER1,FARKAS,KECSKE1,KAPOSZTA),allapot(FARMER2,FARKAS,KECSKE2,KAPOSZTA)):-
	ellenkezo(FARMER1,FARMER2),
	ellenkezo(KECSKE1,KECSKE2).
  
	/*a farmer a kecskét viszi át */

atvisz(allapot(FARMER1,FARKAS,KECSKE,KAPOSZTA1),allapot(FARMER2,FARKAS,KECSKE,KAPOSZTA2)):-	
	ellenkezo(FARMER1,FARMER2),
	ellenkezo(KAPOSZTA1,KAPOSZTA2).  

	/*a farmer a káposztát viszi át */  








