【问题标题】:Ambiguity in transition: How to process string in NFA?过渡中的歧义:如何在 NFA 中处理字符串?
【发布时间】:2013-03-15 02:08:16
【问题描述】:

我已经根据给定的正则表达式制作了 DFA 来匹配测试字符串。在某些情况下会出现.*。 (例如.*ab)。现在假设机器处于状态 1。在 DFA 中,.* 指的是所有字符到自身的转换,以及从状态 1 到“a”的另一个转换。如果测试字符串包含“a”,那么转换可能是什么,因为从状态 1 开始,机器可以进入 DFA 中不可能的两个状态。

【问题讨论】:

  • 嗯,你得到的是一个非确定性有限自动机。只要一个节点有 2 个具有相同边标签的出边,它就不再是 DFA。

标签: regex regular-language dfa nfa kleene-star


【解决方案1】:

我从您的示例开始,以便大家发现它有帮助
任何class of automata 都可以有两种形式:

  • 确定性
  • 非确定性。

确定性模型中:我们只有一个选择(或说没有选择)从一个congratulation 移动到下一个configuration
Finite Automate (DFA) 的确定性模型中:对于状态 (Q) 和语言符号 (Σ) 的每个可能组合,我们总是有唯一的下一个状态。

Definition of transition function for DFA: δ:Q×Σ → Q

δ(q0, a) → q1
            ^ only single choice

因此,在 DFA 中,每个可能的移动都是确定从一个状态到下一个状态。

鉴于,
非确定性模型中:对于下一个配置,我们可以有多个选择。
并且在有限自动机 (NFA) 的非确定性模型中:输出是状态 (Q) 和语言符号的 一些 组合的 set 状态(Σ)。

NFA的转移函数定义:δ:Q×Σ → 2Q = ⊆ Q

δ(q0, a) → {q1, q2, q3}
               ^ is set, Not single state (more than one choice)

在 NFA 中,对于下一个状态,我们可以有多个选择。这就是你所说的过渡 NFA 中的歧义

你的例子
假设语言符号为Σ = {a, b},语言/正则表达式为(a + b)*ab。您认为这种语言的有限自动机可能如下所示:


您的问题是:Which state to move when we have more than one choices for next state?
我提出了更笼统的问题。

NFA 中如何处理字符串?

我正在考虑将 自动机模型作为接受器,如果它属于自动机语言,则接受字符串。(注意:我们可以将自动机作为传感器 em>),下面是我对上述示例的回答

在上面的 NFA 中,我们找到了 5 个 Tapular 对象:

1.  Σ :  {a, b}  
2.  Q :  {q1, ,q2, q3}  
3.  q1:  initial state
4.  F :  {q3}       <---F is set of final state
5.  δ : Transition rules in above diagram: 
         δ(q1, a) → { q1, q2 }
         δ(q1, b) → { q1 }
         δ(q2, b) → { q3 } 

示例的有限自动机实际上是一个 NFA,因为在生产规则 δ(q1, a) → { q1, q2 } 中,如果我们在当前状态为 q1 时得到 a 符号,那么下一个状态可以是 q1q2(超过一种选择)。因此,当我们在 NFA 中处理一个字符串时,我们会获得额外的路径,无论它们是符号 a 要处理,而当前状态是 q1

一个字符串被 NFA 接受,如果有一些可能的移动序列将使机器在字符串处理结束时进入最终状态。而所有从初始状态到集合F中的任何最终状态的字符串集合称为NFA语言:

我们也可以写,“NFA 定义的语言是什么?”如:

L(nfa) = { w ⊆ Σ* | δ*(q1, w) ∩ F ≠ ∅}

当我是新手时,这对我来说太复杂了,无法理解,但事实并非如此

L(nfa) :所有字符串由语言符号组成 = (w ⊆ Σ* ) 在语言中;如果(|) 处理w 后得到的状态集合形成初始状态 (=δ*(q1, w) ) 包含最终状态集合中的一些状态(因此与最终状态的交集不为空 = δ*( q1, w) ∩ F ≠ ∅)。因此,在处理 Σ* 中的字符串时,我们需要跟踪所有可能的路径。

Example-1:处理字符串abab虽然在NFS之上:

--►(q1)---a---►(q1)---b---►(q1)---a---►(q1)---b---►(q1)
     \                       \ 
      a                       a  
       \                       \
        ▼                       ▼
       (q2)                     (q2)---b---►((q3))
        |                      
        b                      
        |                      
        ▼                                 
       (q3)                   
        |
        a
        |
       halt  

上图显示:如何在NFA中处理字符串abab

A halt: 表示字符串无法完全处理,因此不能将其视为此路径中接受的字符串

字符串abab 可以在两个方向上完全处理,因此 δ*(q1, w) = { q1, q3}。

δ*(q1, w) 与一组最终状态的交集是{q3}:

                  {q1, q3} ∩ F 
             ==>  {q1, q3} ∩ {q3}     
             ==>  {q3}  ≠  ∅ 

这样,字符串ababa 是语言L(nfa)。

Example-2: Σ* 中的字符串为abba,处理方法如下:

--►(q1)---a---►(q1)---b---►(q1)---b---►(q1)---a---►(q1)
     \                                   \ 
      a                                   a  
       \                                   \
        ▼                                   ▼
       (q2)                                (q2)
        |                      
        b                      
        |                      
        ▼                                 
       (q3)                   
        |
        b
        |
       halt    

对于字符串abba,可达状态的集合是 δ*(q1, w) = { q1, q2},并且在这个集合中没有状态是最终状态,这意味着 => 它与 F 的交集是∅一个空集,因此string abba 不是可接受的字符串(并且不是语言)。

这是我们在非确定性有限自动机中处理字符串的方式。

一些额外的重要说明:

  • 在有限自动机的情况下,确定性和非确定性模型具有同等的能力。非确定性模型没有额外的能力来定义一种语言。 因此 NFA 和 DFA 的范围与正则语言相同。 (并非所有自动化类别都属于这种情况,例如 PDA 的范围!=NPDA

  • 非确定性模型对于理论目的更有用,比较适合绘制。而出于实现目的,我们总是需要确定性模型(为了效率而最小化)。幸运的是,在有限自动元类中,每个非确定性模型都可以转换为等效的确定性模型。我们有算法方法convert an NFA into DFA

  • 在 DFA 中由单个状态表示的信息可以由 NFA 状态的组合表示,因此 NFA 中的状态数少于其等效 DFA。 (有可用的证明 numberOfStates(DFA))

上述正则语言的DFA如下:

使用此 DFA,您将始终为 Σ* 中的任何字符串找到从初始状态到最终状态的唯一路径,而不是设置,您将获得一个可到达的最终状态,如果该状态属于输入字符串的最终集合据说是接受的字符串(用语言),否则不是/

您的表达式.*ab(a + b)*ab 通常在理论科学中是相同的,我们不使用. 点运算符而不是连接

【讨论】:

  • 谢谢。实际上这是正则表达式到 DFA 转换的中间步骤,但我避免了 .* 和其他导致问题的字符的交集。
  • @TejasJoshi 是,但请注意您所说的 Regex 定义的不仅仅是常规语言。是的!!!
【解决方案2】:

与此类正则表达式的匹配通过回溯发生。当对下一个状态有歧义时,评估会选择第一个选择并记住它做出了选择。如果采用第一个选择导致匹配失败,则评估将回溯到它所做的最后一个选择,并尝试从该状态下一个可用的选择。

我不确定这种机制是否映射到严格的 DFA。

【讨论】:

  • 对于这个简单的案例,有一个到 DFA 的映射。
  • 你所描述的是最左边最长的查找。这是 DFA 查找的正确策略。
猜你喜欢
  • 2021-03-17
  • 2013-03-31
  • 2012-05-15
  • 1970-01-01
  • 1970-01-01
  • 2017-04-05
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
相关资源
最近更新 更多