function useful_loop(j):
do<tex>I_j'' = I_j</tex> while <tex>I_j''</tex> не пусто <tex>I_j'</tex> = <tex>I_j''</tex> <tex>I_j''</tex> = ∅ for <tex>[B \rightarrow \eta \cdot , k] \in I_j'</tex>
for <tex>[A \rightarrow \alpha \cdot B \beta, i] \in I_{k}</tex>
<tex>I_j''</tex> ∪= <tex>[A \rightarrow \alpha B \cdot \beta, i]</tex> # Правило (2) for <tex>[B \rightarrow \alpha \cdot A \eta, k] \in I_j'</tex>
for <tex>\beta : (A \rightarrow \beta) \in P</tex>
<tex>I_j''</tex> ∪= <tex>[A \rightarrow \cdot \beta, j]</tex> # Правило (3) while на данной итерации какое-то множество изменилось <tex>I_j</tex> ∪= <tex>I_j''</tex>
==Корректность алгоритма==