hrany([ hrana(a,b,5), hrana(b,c,4), hrana(c,a,1), hrana(a,e,2), hrana(c,e,4), hrana(e,d,1), hrana(c,d,10), hrana(e,b,3) ]). seskup([],[]). seskup([hrana(Z,DO,DE)|ZB],Seznam) :- seskup(ZB,SE),zatrid(Z,DO,DE,SE,Seznam). zatrid(Z,DO,DE,[],[Z-[hrana(DO,DE)]]). zatrid(Z,DO,DE,[H|T],[H|V]) :- H = X-_, \+ X = Z, zatrid(Z,DO,DE,T,V). zatrid(Z,DO,DE,[H|T], [X-[hrana(DO,DE)|HRANY] |T] ) :- H = X-HRANY, X=Z. empty_queue([]). queue_pop([P-H|T],P,H,T). queue_add([],P,I,[P-I]). queue_add([P1-I1|Q],P,I,Q2):- P=P1,queue_add(Q,P,I,Q3),Q2=[P1-I1|Q3]. %dijkstra(+Hrany,+Start,+Cil,-Vzdalenost) dijkstra(H, S, C, V) :- seskup(H, VH), empty_queue(Q), queue_add(Q, 0, S, VQ), dijkstra2(VH, VQ, [], C, V). %addAll( addAll([], _, Res, Res). addAll([hrana(Do, Delka)|R], De, Q, QR) :- NovaDelka is De+Delka, queue_add(Q, NovaDelka, Do, QR2), addAll(R, De, QR2, QR). dijkstra2(VH, VQ, Nav, C, Res) :- queue_pop(VQ, P, Vrch, VQ2), (Vrch = C, Res = P; Vrch \= C, (\+ member(Vrch, Nav), Nav2 = [Vrch|Nav], member(Vrch-Neighbours, VH), addAll(Neighbours, P, VQ2, VQRes), dijkstra2(VH, VQRes, Nav2, C, Res); member(Vrch, Nav), dijkstra2(VH, VQ2, Nav, C, Res) )). spocitej([19,'+','54','*',30],1639). vemCislo([C|Zb], Zb):- number(C). vemEl([V|Zb], Zb) :- number(V); V='(', vemVyraz(Zb, [')'|Zb2]).