【问题标题】:Non-Deterministic Finite Automata of {ab, abc}* in PythonPython 中 {ab, abc}* 的非确定性有限自动机
【发布时间】:2021-02-17 19:57:08
【问题描述】:

我一直在尝试绘制这个非确定性有限自动机:

对于语言 {ab,abc}*,状态数不超过 3 个的 NFA,我得出了下图中的解决方案:

NFA diagram

问题似乎出在代码逻辑上,因为我的代码总是打印“拒绝”。如果有人可以就如何编写此算法提供一些提示,我将不胜感激。

print("Insert below the string: ")
string = str(input())


def state_q0(string):
    if len(string) == 0:
        print("string not accepted")
    else:
        if string[0] == "a":
            state_q1(string[1:])
        elif string[0] == "b":
            print("rejected")


def state_q1(string):
    if len(string) == 0:
        print("string not accepted")
    else:
        if string[1] == "b":
            state_q2(string[2:])
        else:
            print("rejected")


def state_q2(string):
    if len(string) == 0:
        print("string not accepted")
    else:
        if string[2] == "c":
            print("accepted -> q0")
        elif string[2] == "b":
            print("rejected")


state_q0(string)

【问题讨论】:

  • 您能否添加一个示例,说明在给定特定输入的情况下您期望的输出是什么?

标签: python python-3.x dfa nfa


【解决方案1】:

您应该始终查看字符串的第一个字符,并使用除第一个字符之外的所有内容调用递归调用。

您的图表中也没有注明,但我假设q0 是接受状态,因为它对应于(ab + abc)*

所以按照你的风格(我个人不会使用,但没关系):

def q0(s):
    if not s: return "accept"  # Accepting state.
    if s[0] == "a": return q1(s[1:])
    return "reject"

def q1(s):
    if not s: return "reject"
    # NFA, must try both edges.
    if (s[0] == "b" and q0(s[1:]) == "accept" or
        s[0] == "b" and q2(s[1:]) == "accept"):
        return "accept"
    return "reject"

def q2(s):
    if not s: return "reject"
    if s[0] == "c": return q0(s[1:])
    return "reject"

然而,我将如何编码 NFA:

transitions = [
    {"a": {1}},
    {"b": {0, 2}},
    {"c": {0}}
]
starting_state = 0
accepting_states = {0}

def nfa(w):
    cur_states = {starting_state}
    for c in w:
        if not cur_states: return "reject"
        cur_states = set.union(*
            (transitions[s].get(c, set()) for s in cur_states))
    return "accept" if cur_states & accepting_states else "reject"

【讨论】:

  • 感谢您的解释。我会花一些时间研究代码和实现,然后再回来。
猜你喜欢
  • 2018-07-14
  • 2019-06-23
  • 2017-11-01
  • 1970-01-01
  • 2016-08-17
  • 1970-01-01
  • 2019-08-08
  • 2013-11-29
  • 2013-04-28
相关资源
最近更新 更多