问题描述
以字母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