何时对 DFA/NFA 中的状态使用 Ø
When to use Ø for states in DFA / NFA
我对 DFA / NFA 中“Ø”的用法感到困惑(让我们在 DFA 到 NFA 转换的上下文中讨论这个问题)
假设我有一个 NFA,如下所示:
enter image description here
没有为状态 1 的符号“a”定义任何转换。所以在转换中 table 我会写与“Ø”相同的转换还是写“1”原因它将保持状态“1”,因为它没有任何转换箭头
会不会是这样:
| state | a | b | E |
|----------------|----------|-------|---------|
| 1 | Ø | {2} | {3} |
| 2 | {2,3} | {3} | Ø |
| 3 | {1} | Ø | Ø |
或:
| state | a | b | E |
|----------------|----------|-------|---------|
| 1 | {1} | {2} | {3} |
| 2 | {2,3} | {3} | {2} |
| 3 | {1} | {3} | {3} |
选择使用“Ø”会影响最终输出。现在,我们可以构建状态的幂集,然后计算 epsilon clousure,但让我们把它缩短,我们将直接看一个有争议的状态,它可能会或可能不会出现在最终的 DFA 中,我们将尝试使用“Ø”而不使用“Ø”
(1) 不使用 null: ( Table 2 )
州 = {1,2}
从 1 和 2,收到 a 我们去 1,2,3
epsilon 闭包 (1,2,3) = 1,2,3
(2) 使用空值:( Table 1 )
州 = {1,2}
从 1 和 2,收到 a 我们转到 {2,3}
epsilon 闭包 (2,3) = 1,2,3
现在,过渡可能看起来相同,但在某些情况下,我们会再次以我们无处可去但保持相同状态的状态结束,如果我们选择使用“Ø”,那么我们在最终输出“Ø”中会有一个额外的状态。在这种情况下,它只是意味着如果我们没有某个符号的转换,那么我们会进入这个状态
但如果我们不这样做,那么我们的最终输出将不会有额外的状态“Ø”。在这里,如果我们不为某个符号指定转换,我们就不会为它指定转换箭头,就像图中状态 1 中的符号“a”一样
那么,哪一个是正确的,一个没有状态“Ø”,一个有状态“Ø”
带Ø的那个。考虑一个简单的 NFA:
/-> S -a-> (T)
| |
\-a-/
S为起始状态,T为接受状态。字母表是{a, b}。
当本机读取字符串 b
时,它会拒绝。如果 (S, b) 的转换集是 {S},那么这个转换成的 DFA 将接受 ba
,这显然是错误的。
正确的过渡状态如下:
S, a, {S, T}
S, b, Ø
{S, T}, a, {S, T}
{S, T}, b, Ø
Ø, a, Ø
Ø, b, Ø
你可以用两种方式绘制这个 DFA。不完整的 DFA(空状态被省略)或完整的 DFA(空状态作为不可避免的状态存在)。 q1 = {S}
,开始状态,q2 = {S, T}
,接受状态。
Incomplete:
q1 -a-> (q2)<-\
| |
\-a-/
Complete:
/a,b\
| /
\ v
/-> q3 <-\
b b
| |
q1 -a-> (q2)<-\
| |
\-a-/
请注意,在完整版本中,q3
与 Ø 具有相同的属性。
(一般来说,一个不完整的 DFA 总是可以用这种方式替换为一个完整的 DFA:创建一个新的 non-accepting 状态 d
,其输出转换为 d, Σ, d
,并且其传入转换是原始 DFA 中缺少的任何转换。d
是“转储”状态,可以被认为是“拒绝”状态而不是接受状态。一旦输入进入该状态状态,它没有接受的途径,因此可以被拒绝。)
我对 DFA / NFA 中“Ø”的用法感到困惑(让我们在 DFA 到 NFA 转换的上下文中讨论这个问题)
假设我有一个 NFA,如下所示: enter image description here
没有为状态 1 的符号“a”定义任何转换。所以在转换中 table 我会写与“Ø”相同的转换还是写“1”原因它将保持状态“1”,因为它没有任何转换箭头
会不会是这样:
| state | a | b | E |
|----------------|----------|-------|---------|
| 1 | Ø | {2} | {3} |
| 2 | {2,3} | {3} | Ø |
| 3 | {1} | Ø | Ø |
或:
| state | a | b | E |
|----------------|----------|-------|---------|
| 1 | {1} | {2} | {3} |
| 2 | {2,3} | {3} | {2} |
| 3 | {1} | {3} | {3} |
选择使用“Ø”会影响最终输出。现在,我们可以构建状态的幂集,然后计算 epsilon clousure,但让我们把它缩短,我们将直接看一个有争议的状态,它可能会或可能不会出现在最终的 DFA 中,我们将尝试使用“Ø”而不使用“Ø”
(1) 不使用 null: ( Table 2 )
州 = {1,2}
从 1 和 2,收到 a 我们去 1,2,3
epsilon 闭包 (1,2,3) = 1,2,3
(2) 使用空值:( Table 1 )
州 = {1,2}
从 1 和 2,收到 a 我们转到 {2,3}
epsilon 闭包 (2,3) = 1,2,3
现在,过渡可能看起来相同,但在某些情况下,我们会再次以我们无处可去但保持相同状态的状态结束,如果我们选择使用“Ø”,那么我们在最终输出“Ø”中会有一个额外的状态。在这种情况下,它只是意味着如果我们没有某个符号的转换,那么我们会进入这个状态
但如果我们不这样做,那么我们的最终输出将不会有额外的状态“Ø”。在这里,如果我们不为某个符号指定转换,我们就不会为它指定转换箭头,就像图中状态 1 中的符号“a”一样
那么,哪一个是正确的,一个没有状态“Ø”,一个有状态“Ø”
带Ø的那个。考虑一个简单的 NFA:
/-> S -a-> (T)
| |
\-a-/
S为起始状态,T为接受状态。字母表是{a, b}。
当本机读取字符串 b
时,它会拒绝。如果 (S, b) 的转换集是 {S},那么这个转换成的 DFA 将接受 ba
,这显然是错误的。
正确的过渡状态如下:
S, a, {S, T}
S, b, Ø
{S, T}, a, {S, T}
{S, T}, b, Ø
Ø, a, Ø
Ø, b, Ø
你可以用两种方式绘制这个 DFA。不完整的 DFA(空状态被省略)或完整的 DFA(空状态作为不可避免的状态存在)。 q1 = {S}
,开始状态,q2 = {S, T}
,接受状态。
Incomplete:
q1 -a-> (q2)<-\
| |
\-a-/
Complete:
/a,b\
| /
\ v
/-> q3 <-\
b b
| |
q1 -a-> (q2)<-\
| |
\-a-/
请注意,在完整版本中,q3
与 Ø 具有相同的属性。
(一般来说,一个不完整的 DFA 总是可以用这种方式替换为一个完整的 DFA:创建一个新的 non-accepting 状态 d
,其输出转换为 d, Σ, d
,并且其传入转换是原始 DFA 中缺少的任何转换。d
是“转储”状态,可以被认为是“拒绝”状态而不是接受状态。一旦输入进入该状态状态,它没有接受的途径,因此可以被拒绝。)