Детермінізація НДСкА: відмінності між версіями

[неперевірена версія][неперевірена версія]
Вилучено вміст Додано вміст
м r2.7.3) (робот додав: fa:ساختمان پاورست
м суміш розкладок за допомогою AWB
Рядок 31:
Метод: Алгоритм тримає набір поточних станів <math>S</math>, які наразі були досягнуті читанням рядка. Якщо <math>c</math>&nbsp;— наступний вхідний символ, читаємо функцією ''nextchar()'', тоді спочатку обчислюємо ''move(S, c)'' і потім замикаємо цю множину за допомогою ''&epsilon;-closure()''.
 
1: S = &epsilon;ε-closure(s0);
2: c = nextchar();
3: while ( c != eof ) {
4: S = &epsilon;ε-closure (move(S, c)) ;
5: c = nextchar();
6: }
7: if ( S &cap; F != 0 ) return "yes";
8: else return "no";
 
Рядок 46:
# Двомірний масив ''move[s, a]'', що містить таблицю переходів НСА. Записи в цій таблиці, які є наборами станів, представлені зв'язними списками.
 
Для втілення рядка (1), ми маємо встановити кожний запис масиву alreadyOn у FALSE, тоді для кожного стану ''s'' в ''c-closure(so)'', заштовхнути ''s'' у стек ''oldStates'' і встановити alreadyOn[s] в TRUE. WЦяЦя дія зі станом ''s'', а також реалізація рядку (4), спрощується за допомогою функції яку ми назвемо ''addState(s)''. Ця функція заштовхує стан s у ''newStates'', встановлює ''alreadyOn[s]'' у TRUE, і викликає себе рекурсивно на всіх станах у ''move[s, &epsilon;]'' для подальшого обчислення ''&epsilon;-closure(s)''. Однак, щоб уникнути подвійної роботи, ми маємо бути обачними і ніколи не викликати ''addState'' для стану, який уже в стеці ''newStates''.
 
9: addState(s) {
10: push s onto newStates;
11: alreadyOn[s] = TRUE;
12: for ( t on move[s, &epsilon;ε] )
13: if ( !alreadyOn(t) )
14: addState(t) ;