/***** Shortest Distance in a Directed Graph (by Terry Wilmarth) *****/
/*		(with stylistic changes by BJ)			     */

mode none.
closure short/3.

short(X,X,L)  equals 0.
short(X,Y,1)  equals cost(edgesfrom(X),Y).
short(X,Y,L)  equals min({short(X,Y,L-1)\short_all(edgesfrom(X),Y,L)}).

short_all({to(Z,D)\_},Y,L) contains if eq(Z,Y) then {D} else {D+short(Z,Y,L-1)}.

	cost({to(Y,D)\_}, Y) equals D.
	cost(_, _)           equals infinity.

	min(phi)   equals infinity.
	min({X\T}) equals min2(X,min(T)).

		min2(X,Y)  equals if X < Y then X else Y.

	/* Directed graph in edge-set format */

	edgesfrom(a) equals {to(b,10), to(c,16), to(d,8), to(f,20), to(h,19)}.
	edgesfrom(b) equals {to(a,20), to(c,2), to(e,4), to(h,40)}.
	edgesfrom(c) equals {to(a,16), to(d,3), to(e,1)}.
	edgesfrom(d) equals {to(a,8), to(e,11), to(f,100)}.
	edgesfrom(e) equals {to(b,4), to(g,50)}.
	edgesfrom(f) equals {to(a,99), to(g,10)}.
	edgesfrom(h) equals {to(g,10)}.
	edgesfrom(_) equals phi.

	infinity   equals 10000.

