如何为此下推自动机设计过渡函数?

时间:2009-06-28 15:20:54

标签: language-theory pushdown-automaton

我正在学习PDA测试,我想知道如何设计一个能够识别以下语言的下推式自动机:

L = {a^max(0,n-m)b^n a^m| n,m >=0} 

如何设计转换函数以识别n-m是否大于0

并且,如果你有一些课程材料解决了这个级别的练习,请点击链接。

3 个答案:

答案 0 :(得分:2)

您可以根据堆栈顶部的值决定从当前状态到哪里,使用堆栈上的符号来记录解析的状态。

这是我认为这将如何工作: 是从输入中读取的符号, THIS 是堆栈中的符号。 堆栈的botoom上的符号 X 表示n <= m 不要将 X Z 混淆,后者是堆栈的初始符号,有助于确定堆栈何时为空。

此解决方案可能存在一些问题,但整体方法应该是正确的。

...祝你的考试好运: - )


首先,您从字符串的开头读取所有 a 符号,并为每个符号添加 A ,或推送 X 如果没有 a

然后您阅读了所有 b 符号:

  • 如果堆栈为空( Z 位于顶部), B 位于顶部或 X 位于顶部,则您推送另一个 B 到堆栈。
  • 如果堆栈顶部有 A ,则将其删除。

最后一步是阅读最终的 a 符号。

  • 如果堆叠上有 B ,请将其删除。
  • 如果堆栈上有 X ,那么请将其保留在那里
  • 如果堆栈为空( Z 在顶部),那么这必须是字符串的结尾

另一个编辑:

抱歉,如果上述内容不明确......我会尝试将其正式化。

接受状态是(4)和(5),起始状态是(1)。这是不确定的

和过渡规则:

州(1):阅读第一批 a 符号

  • (1) a ; Z / AZ - &gt; (1)
  • (1) a ; A / AA - &gt; (1)
  • (1)epsilon; A / A - &gt; (2)
  • (1)epsilon; Z / Z - &gt; (2)

状态(2):读取 b 符号

  • (2) b ; Z / BZ - &gt; (2)
  • (2) b ; X / BX - &gt; (2)
  • (2) b ; B / BB - &gt; (2)
  • (2) b ; A / epsilon - &gt; (2)
  • (2)epsilon; B / B - &gt; (3)
  • (2)epsilon; X / X - &gt; (3)
  • (2)epsilon; Z / Z - &gt; (3)

州(3):阅读最后的 a s

  • (3) a ; B / nothing - &gt; (3)
  • (3)epsilon; X / X - &gt; (4)
  • (3)epsilon; Z / Z - &gt; (5)

状态(4):如果m&gt;则尾随 a s Ñ

  • (4) a ; X / X - &gt; (4)

状态(5)用于在m <0时接受精确的字符串。 Ñ

(并且只是绝对清楚 - 当没有状态的方式且读取光标不在单词的末尾时,则不接受该单词)

通过使用adidional状态而不是堆栈符号 X ,这可能会变得更简单,但我想你可以自己做: - )

答案 1 :(得分:1)

最简单的方法可能是为该语言编写语法,然后为此构建一个PDA。 编写语法的最简单方法是首先根据“max”分割语言,以便更容易看到正在发生的事情

L = L1 \union L2
L1 = { b^n a^m | m >= n >= 0 }
L2 = { a^(n-m) b^n a^m | n >= m >= 0 }

现在重写L1和L2以使它们更简单(j = m-n,k = n-m)

L1 = { b^n a^n a^j | j,n >= 0 }
L2 = { a^k b^k b^m a^m | k,m >= 0 }

这些变成了非常简单的语法

L1 := BA A
L2 := AB BA
AB := a AB b | \epsilon
BA := b BA a | \epsilon
A  := a A | \epsilon
L  := L1 | L2

现在从他们建立一个PDA - 最容易使用自动化工具,但如果你需要显示所有的工作,可以手动完成

答案 2 :(得分:0)

我认为语言L是Chompsky层次结构中的上下文敏感或类型1语言。我错了。

语言L1 = { a^n b^n c^n : n >= 1 }是类型1语言的一个示例。这看起来非常相似。这听起来像是一个棘手的问题!我不认为有一种类型2或无上下文的语法或PDA可以识别或生成L.