Záverečné zadanie - vlakové spojenia

Created: 2009-10-03 - 12:59

%hrany naznacujuce prepojenia miest aj s cenami spojeni
edge(kosice,presov,35).

edge(kosice,roznava,31).

edge(kosice,trebisov,23).

edge(trebisov,michalovce,21).

edge(presov,spiskaNovaVes,39).

edge(spiskaNovaVes,poprad,15).

edge(roznava,rimavskaSobota,55).

edge(rimavskaSobota,lucenec,20).

edge(lucenec,zvolen,43).

edge(zvolen,banskaBystrica,12).

edge(banskaBystrica,ruzomberok,34).

edge(ruzomberok,liptovskyMikulas,23).

edge(liptovskyMikulas,poprad,41).

edge(ruzomberok,martin,13).

edge(martin,zilina,12).

edge(zilina,trencin,34).

edge(trencin,trnava,63).
edge(trnava,bratislava,23).
edge(trnava,nitra,14).
edge(nitra,prievidza,40).
edge(prievidza,zvolen,30).

%zistuje, ci su mesta spojene (lubovolnym smerom)
spojene(X,Y,Z):-edge(X,Y,Z);edge(Y,X,Z).

%obratenie zoznamu naruby

rv([X|Y],Z,W):-rv(Y,[X|Z],W).
rv([],X,X).
revert(X,Y):-rv(X,[],Y).

%najlepsie spojenie medzi dvoma mestami
najlepsieSpojenie(Z,Do,Cesta,Cena):-list(Z,Do,[Cena|Zvysok]),spojenie(Z,Do,Cesta,Cena).

%vypise zoznam s cenami spojenia Z-Do

list(Z,Do,Zoznam):-findall(Y,spojenie(Z,Do,Cesta,Y),Zoznam1),sort(Zoznam1,Zoznam).

%vypise vsetky spojenia medzi dvoma mestami aj s ich cenami

spojenie(Z,Do,VyslednaCesta,Cena):-cesta(Z,Do,[Z],Cesta,Cena),revert(Cesta,VyslednaCesta).

%zisti spojenie z mesta do mesta

cesta(Do,Do,Cesta,Cesta,0).
cesta(Z,Do,AktualnaCesta,Cesta,Cena):-Z\=Do,spojene(Z,Dalsie,CenaSpojenia),non_member(Dalsie,AktualnaCesta),cesta(Dalsie,Do,[Dalsie|AktualnaCesta],Cesta,CenaAktualna),Cena is CenaSpojenia+CenaAktualna.