Last modified 2/24/95.
NL = {A | P(A) ^ T* <> 0 } REPEAT L = NL NL = L U {B in V | P(B) ^ (T U L)* <> 0 } UNTIL (L = NL) RETURN LOn iteration i, the algorithm adds those variables that take at least i steps to derive a string of terminals.
NR = {S} REPEAT R = NR NR = R U {A in V | Exists B in R s.t. P(B) ^ (VUT)*A(VUT)* <> 0 } UNTIL (R = NR) RETURN ROn iteration i, the algorithm adds those variables that only appear in sentential forms that take least i steps to derive from S.
V' = FindLive(G) FOREACH (A in V1) P'(A) = P(A) ^ (V' U T)* G' =Only reachable and live variables can be useful (although these alone are not sufficient!), so the algorithm restricts attention to them. Only productions that involve live and reachable variables can contribute to L(G), so the rest are pruned. A variable may be both live and reachable, but may appear only in sentential forms with non-live variables, and so be useless. For this reason, it is important that the grammar G' with only live variables be produced first, since the pruning operation on P will eliminate all productions involving dead variables. If a live, reachable variable can only appear in a sentential form with non-live variables, then it will not be reachable in the pruned grammar, since the necessary step that produced the non-live variable(s) with which it must appear is no longer available.V1 = FindReachable(G') FOREACH (A in V1) P1(A) = P(A) ^ (V1 U T)* RETURN
Proof
Since only live variables can possibly produce a string of terminals, they are the only ones that can produce a string in L(G), so restricting V' to live variables cannot make L(G') different from L(G). Likewise, only reachable variables can appear in sentential forms derived from S in the grammar, and so any string in L(G) must have a derivation that has only reachable and live variables in its sentential forms. Thus L(G) = L(G1).
Showing that every variable A in V1 is useful is more involved. That A is both reachable and live is not enough. We must show that A appears in the derivation of some word x in L(G1). Since A is reachable in G', it must be that there are alpha and beta in (V' U T)* such that S =>* alpha A beta. Now all the variables in alpha and beta are live, so they can derive some terminal string, so it must be that there exist x1, x3 in T* such that alpha =>* x1 and beta =>* x3. Since A in V1, A is live, and there must be some x2 in T* such that A =>* x2. Thus S =>* alpha A beta =>* x1.x2.x3 = x in T*, so x in L(G1) and A is useful.
QED