如何编写下推自动机?

问题描述

以字母b开头,字母b的个数比字母a的个数多1 接受语言的PDA

这让我很困惑。谁能解释一下它是怎么做的?

解决方法

可以使用这些属性定义 PDA(使用 Wikipedia 上建议的语法):

  • 状态:{?、?、?}
  • 输入字母:{?,?}
  • 堆叠字母:{?、?、?}
  • 开始状态:?
  • 起始堆栈符号:?
  • 接受状态:{?}

过渡:

状态 输入 栈顶 新状态 栈顶变化
? ? ? ? ?
? ? ? ? ??
? ? ? ? ??
? ? ? ? ??
? ? ? ? ??
? ? ? ?
? ? ? ?
? ? ? ?

这个想法是PDA只在状态?时接受输入?。在这种情况下,状态将变成?。

在状态?下,当输入是?,栈顶不是?,那么?就会被压入栈中。同理,当输入?,而栈顶不是?时,那么?就会被压入栈中。所以堆栈永远不能混合?和?。

当输入符号为?,栈顶为?时,则将那个?从栈中弹出。类似的,当输入是?,栈顶是?,那么这个?就会从栈中弹出。

最后一次转换表明,当栈顶为?时,PDA 可能会从状态? 转换为?。

如果输入可以被这些规则完全处理,并且状态可以变成?,那么输入就被接受了。否则不行。

在代码中,算法大致是这样工作的(这是 Python):

def run(input):
    state = "r"
    stack = ["Z"]
    for ch in input:
        if state == "r" and ch == "b" and stack[-1] == "Z":
            state = "s"
        elif state == "s" and ch == "a" and stack[-1] == "Z":
            stack.append("a")
        elif state == "s" and ch == "b" and stack[-1] == "Z":
            stack.append("b")
        elif state == "s" and ch == "a" and stack[-1] == "a":
            stack.append("a")
        elif state == "s" and ch == "b" and stack[-1] == "b":
            stack.append("b")
        elif state == "s" and ch == "a" and stack[-1] == "b":
            stack.pop()
        elif state == "s" and ch == "b" and stack[-1] == "a":
            stack.pop()
        else:
            return False  # Input is rejected as there is no matching transition

    if state == "s" and stack[-1] == "Z":
        state = "t"
    return state == "t"  # Accepting when,and only if,the state is "t"
    
run("baaabbb")  # True
run("aaabbbb")  # False

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...