Automation 为以下语言创建下推自动机

Automation 为以下语言创建下推自动机,automation,formal-languages,pushdown-automaton,Automation,Formal Languages,Pushdown Automaton,所以我在书中做练习题,我发现了这个问题。 构建一个npda,接受sigma(a,b,c)上的语言L L={w:a的数量=b的数量+1} 所以我解释它,因为它接受所有的字符串,其中有一个a,然后是字母b。我认为所有的州都应该有一个有过渡的循环(c,landa,landa),因为我们并不真正关心c。在这之后,我真的很困惑,因为有太多的案例要涵盖,因为a和b的位置是任意的。解决这个问题的方法是什么?谢谢 PDA可以使用堆栈来记住任意数量的信息。这使得PDA比有限自动机具有无限的能力。确定PDA的关键是

所以我在书中做练习题,我发现了这个问题。 构建一个npda,接受sigma(a,b,c)上的语言L

L={w:a的数量=b的数量+1}


所以我解释它,因为它接受所有的字符串,其中有一个a,然后是字母b。我认为所有的州都应该有一个有过渡的循环(c,landa,landa),因为我们并不真正关心c。在这之后,我真的很困惑,因为有太多的案例要涵盖,因为a和b的位置是任意的。解决这个问题的方法是什么?谢谢

PDA可以使用堆栈来记住任意数量的信息。这使得PDA比有限自动机具有无限的能力。确定PDA的关键是弄清楚如何使用堆栈,然后围绕堆栈构建PDA

我们如何使用堆栈来确保
a
s的数量等于
b
s的数量加上一?嗯,堆栈可以很容易地跟踪已看到的符号的运行平衡。例如,如果我们看到四个
a
s和两个
b
s,我们的堆栈可能通过包含
aaZ
来表示这一事实,其中
Z
是“堆栈底部”符号。当然,我们可能会使用其他方法和其他表示法,但对于这类问题,这是一个特别简洁的方法。要全面解释代表性,请执行以下操作:

  • 堆栈最初是
    Z
    ,只是堆栈底部的符号
  • 如果我们看到一个
    a
    ,堆栈的顶部是
    a
    Z
    ,我们将添加另一个
    a
  • 如果我们看到一个
    a
    ,堆栈的顶部是
    b
    ,我们将删除一个
    b
  • 如果我们看到一个
    b
    ,堆栈顶部是
    b
    Z
    ,我们将添加另一个
    b
  • 如果我们看到一个
    b
    ,堆栈的顶部是
    a
    ,我们将删除一个
    a
  • 如果我们看到一个
    c
    ,请不要使用堆栈
  • 如果我们对所有输入反复执行此操作,则堆栈的内容将等于
    x^m
    ,其中
    x
    a
    b
    中出现频率更高的一个,并且
    m
    是每个符号数差的绝对值

    要接受您的语言,您必须简单地识别输入耗尽且堆栈组成等于
    aZ
    的情况。可以通过添加一些状态和lambda/epsilon转换来清除堆栈和/或进入接受状态


    感谢Peter Leupold指出原始答案的其余部分语法错误。我试图修复它,但不喜欢得到的答案有多长,所以我忽略了这一点。我将简单地补充一点,另一种可能性是为一种语言生成一个CFG,并使用一种算法为它派生一个PDA。在这种情况下,对我来说,直接提供PDA就不那么冗长了。

    非常感谢您的帮助!一切都很清楚,PDA部分很好。语法部分可能不是。事实上,PDA可能会在堆栈的增长和减少之间发生多次变化,这表明该语言不是线性的。所以你的线性语法a=#b不应该起作用;事实上,我认为像a^7b^7a^16b^16这样的字符串是无法派生的。你所说的“六种方式”只是在非终端周围添加新字母。“但是谁说不能在其他地方添加它们呢?”彼得勒普德现在看着它,我认为你的语法是对的。不太清楚当时我为什么会想到这个。我认为S:=aSb | bSa | SS | e是正确的语法,对吗?也更简单。也许这种新语法行得通,@Patrick87。然而,你的第二个语法将需要一个不同的解决方案,因为任意多个S将产生同样多的a。