69
правок
Изменения
Нет описания правки
== Алгоритм Эрли ==
Чтобы воспользоваться леммой, необходимо найти <tex>I_nD_n</tex> для <tex>w</tex>. Алгоритм Эрли является [[Динамическое программирование|динамическим алгоритмом]]: он последовательно строит список разбора, причём при построении <tex>I_jD_j</tex> используются <tex>I_0D_0, \ldots, I_D_{j}</tex> (то есть элементы списков с меньшими номерами и ситуации, содержащиеся в текущем списке на данный момент).
Алгоритм основывается на следующих трёх правилах:
# Если <tex>[A \rightarrow \alpha \cdot a_w_{j} \beta, i] \in I_D_{j-1}</tex> (где <tex>a_jw_j</tex> — <tex>j</tex>-ый символ строки), то <tex>[A \rightarrow \alpha a_w_{j} \cdot \beta, i] \in I_jD_j</tex>.# Если <tex>[B \rightarrow \eta \cdot , k] \in I_j</tex> и <tex>[A \rightarrow \alpha \cdot B \beta, i] \in I_{k}</tex>, то <tex>[A \rightarrow \alpha B \cdot \beta, i] \in I_j</tex>.
# Если <tex>[B \rightarrow \alpha \cdot A \eta, k] \in I_j</tex> и <tex>(A \rightarrow \beta) \in P</tex>, то <tex>[A \rightarrow \cdot \beta, j] \in I_j</tex>.
'''for''' <tex>[A \rightarrow \alpha \cdot B \beta, i]</tex> <tex>\in</tex> D[j]
'''for''' <tex>[B \rightarrow \eta]</tex> <tex>\in</tex> P
D[j] <tex>\cup</tex>= {<tex>[B \rightarrow \cdot \eta, j]</tex>}
<font color=green> // Третье правило </font>
'''function''' complete(D, j)
'''for''' <tex>[B \rightarrow \eta \cdot, i]</tex> <tex>\in</tex> D[j]
'''for''' <tex>[A \rightarrow \alpha \cdot B \beta, k]</tex> <tex>\in</tex> D[i]
D[j] <tex>\cup</tex>= {<tex>[A \rightarrow \alpha B \cdot B \beta, k]</tex>}
==Корректность алгоритма==