	/***       Reaching Definitions in a Program Flow Graph      ****/
	/***  adapted from "Green Dragon" book, by Aho & Ullman, 1977 ***/

mode none.
closure out/1, in/1, all_in/1.

out(B) contains diff(in(B), kill(B)).
out(B) contains gen(B).

in(B)  contains all_out(pred(B)).

all_out({B\_}) contains out(B).

	diff({X\_},S) contains if member(X,S) then phi else {X}.

		member(X, {X\_}) equals true.
		member(_, _)     equals false.

	gen(b1)  equals {1, 2, 3}.
	kill(b1) equals {4, 5, 6, 7}.

	gen(b2)  equals {4, 5}.
	kill(b2) equals {1, 2, 7}.

	gen(b3) equals {6}.
	kill(b3) equals {3}.

	gen(b4) equals {7}.
	kill(b4) equals {1, 4}.

	pred(b1) equals phi.
	pred(b2) equals {b1, b3, b4}.
	pred(b3) equals {b2}.
	pred(b4) equals {b2}.
