/*
Javított keresés:

	- nem engedjük meg, hogy ugyanazt a csúcsot egy útvonal keresése	
	  során többször is vizsgálja
	- eredményként meghatározzuk a megtalált útvonalat is.

(Megjegyzés: ez az úgynevezett mélységi keresés, vagyis a keresőgráfban
mindig a legmélyebben lévő csúcsból folytatja a keresést.
Sok egyéb keresési algoritmus is van, nem ez az egyetlen, sőt, 
nem is a leghatékonyabb, de könnyű megvalósítani.

*/



%:- use_module(osadat).
:- use_module(farmer).
%:- use_module(arpadhaz).  
%:- use_module(vasut).
%:- use_module(kiralynok).


melysegi(Start,Cel,Megoldas) :-  melysegi(Start,Cel, [], Megoldas).


melysegi(Start,Cel,_,[Start,Cel]) :- el(Start,Cel).
melysegi(Start,Cel,Eddigvizsgalt,[Start|Utvonal]) :-
         el(Start,Csucs), \+ member(Csucs,Eddigvizsgalt),
         melysegi(Csucs,Cel,[Csucs|Eddigvizsgalt],Utvonal).



/*Magyarázat: 

(2. szabály): Ha van él a Start csúcsból a Csucs csúcsba, és még nem jártunk ebben
a csúcsban (a \+ jelentése: tagadás), és a Csucs csúcsból van út a Cel csúcsba, 
akkor a Start-ból is van út Cél-ba. 

Az eljárás újrahívásakor az Eddig vizsgált csúcsok listájába bekerül a Csucs is
(csak az elejére kerülhet a listakezelés szabályai alapján). Utvonal jelzi a a Csucs-ból
a Cel-ba vezető utat, vagyis az útvonalon szereplő csúcsok listáját. Ha van ilyen útvonal,
akkor a Start-ból a Cel-ba vezető út is bővül, mégpedig úgy, hogy az Utvonal elé kerül
a Start. 

A megállási feltétel (1. szabály): ha közvetlen él vezet a Start-ból a Cel állapotba, akkor
a megoldási útvonal a Start-ot és a Cel-t tartalmazó két elemű lista.

Híváskor az eddig vizsgált csúcsok listájában a kezdő és a végállapot van, 
és a Megoldas listát keressük.
(Ez a Start-ból a Cel-ba vezető útvonalon lévő csúcsok listája.)

*/


/*
Egy másik lehetséges megoldás - gondolja végig, próbálja ki!

melysegi(Start,Cel,Megoldas) :-  melysegi(Start,Cel, [], Megoldas).

melysegi(Start,Start,Regiut,[Start|Regiut]).
melysegi(Start,Cel,Regiut,Megoldas):- el(Start,Csucs), \+ member(Csucs, Regiut),
	  melysegi(Csucs,Cel,[Start|Regiut],Megoldas).


*/

/*
JAVASLAT:

Hogy könnyebben megértse, előbb az osadat.pl adataival próbálja ki!
Rajzolja is fel a szóban forgó gráfot.

Ekkor a cél pl.:
?- melysegi(a,X,L).

vagy: 
?- melysegi(b,X,L).

vagy:
?- melysegi(b,f,L).


A farmer példa esetén az indító cél:

?- melysegi(allapot(bal,bal,bal,bal),allapot(jobb,jobb,jobb,jobb),L).


A többinél találja ki önállóan!
(A vasut-nál meg lehet kérdezni, pl, hogy hova lehet eljutni Pécs-ről, vagy azt, hogy 
milyen útvonalon lehet eljutni pl. Pécsről Székesfehérvárra, stb.)


*/