تبدیل NFA به DFA (ساخت زیرمجموعه)
ماشین ناقطعی را به ماشین قطعی معادل تبدیل میکند: هر حالت DFA مجموعهای از حالتهای NFA است که ماشین ناقطعی همزمان میتواند در آنها باشد.
در ماشین ناقطعی (NFA) از یک حالت با یک نماد ممکن است به چند حالت رفت، یا بدون خواندن نماد (با ε) جابهجا شد. ولی هر NFA یک ماشین قطعی (DFA) معادل دارد: حالتهای DFA مجموعههایی از حالتهای NFAاند.
ادامهی توضیح ↓- زمان:
O(2ⁿ) states in the worst case - حافظه:
O(2ⁿ) - جانسونباو، فصل ۱۲
NFA تامسون برای (a|b)*abb با ۱۱ حالت (۰ تا ۱۰)؛ DFA معادل ۵ حالت دارد. هر سطر ورودی [از، نماد، به] است (۰ = a، ۱ = b، ۲ = ε).
def subset_construction(edges, accept):# edges: rows [from, symbol, to] with symbol 0 = a, 1 = b, 2 = ε. The start state is 0.eps = {} # the ε-moves out of each statefor f, s, t in edges:if s == 2:eps.setdefault(f, []).append(t)dstates = [closure(eps, [0])]rows = []i = 0while i < len(dstates):T = dstates[i]targets = []for c in (0, 1):moved = [t for f, s, t in edges if f in T and s == c]U = closure(eps, moved)if U not in dstates:dstates.append(U)targets.append(dstates.index(U))rows.append([i, set_text(T), targets[0], targets[1], "yes" if accept in T else ""])i = i + 1return len(dstates)def closure(eps, states):# Every NFA state reachable from these using ε-moves only.seen = set(states)stack = list(states)while stack:q = stack.pop()for t in eps.get(q, []):if t not in seen:seen.add(t)stack.append(t)return tuple(sorted(seen))def set_text(T):return "{" + ",".join(str(q) for q in T) + "}"
شروع اجرا
جدول هنوز خالی است.
متغیرهای محلی
نارنجی = در همین گام عوض شد
edges list
Call stack
- subset_construction()خط 1
توضیح
ایده
در ماشین ناقطعی (NFA) از یک حالت با یک نماد ممکن است به چند حالت رفت، یا بدون خواندن نماد (با ε) جابهجا شد. ولی هر NFA یک ماشین قطعی (DFA) معادل دارد: حالتهای DFA مجموعههایی از حالتهای NFAاند.
ساخت زیرمجموعه
- بستار ε یک مجموعه: همهی حالتهایی که فقط با ε از آنها رسیدنیاند.
- حالت شروع DFA بستار ε حالت شروع NFA است.
- برای هر حالت DFA مثل
Tو هر نمادc: همهی حالتهایی که ازTباcرسیدنیاند، و بستار ε آنها، یک حالت (شاید تازه) DFA است. - حالتی پذیرش است که حالت پذیرش NFA را داشته باشد.
هزینه
در بدترین حالت 2ⁿ حالت (ورودی «انفجار حالتها»)، ولی معمولاً خیلی کمتر. این همان کاری است که ابزارهای عبارت منظم (مثل lex) انجام میدهند.
ورودی
هر سطر یک یال [از، نماد، به] با 0 = a، 1 = b، 2 = ε؛ حالت شروع ۰ و accept حالت پذیرش است.