【问题标题】:right linear context free grammar右线性上下文无关文法
【发布时间】:2014-04-06 16:15:45
【问题描述】:

我有问题。我必须用 alphapet={0,1} 编写正确的线性上下文无关语法,其中 0 的数字是偶数,而 od 1 的数字是奇数。我试着写某事。但它不起作用。

s --> [1],a.
s --> [0],b.

a --> [].
a --> [1],c.
a --> [0],b.

c --> [1],k.
c --> [0],b.

b --> [0],k.
b --> [1],d.

d --> [1],b.
d --> [0],c.

k --> [].
k --> s.

语法应该接受偶数个 0 和奇数个 1。当 A->wB 或 A->w 时,语法上下文无关是右线性的,其中 w 是我们字母表下的任何单词,A,B 没有终结符

【问题讨论】:

  • 语法应该接受什么,偶数还是奇数?还是偶数/奇数的 1s/0s?两者实际上听起来都像常规语法,而不是上下文无关的......
  • @TomasPastircak 你能解释一下为什么这些语法是规则的吗?这会很有帮助!

标签: prolog grammar context-free-grammar dcg


【解决方案1】:

怎么样

s --> [1],oddOnesEvenZeros.
s --> [0],oddZerosEvenOnes.

oddOnesEvenZeros--> [].
oddOnesEvenZeros--> [1],s.
oddOnesEvenZeros--> [0],oddZerosOddOnes.

oddZerosEvenOnes--> [1],oddZerosOddOnes.
oddZerosEvenOnes--> [0],s.

oddZerosOddOnes --> [1],oddZerosEvenOnes.
oddZerosOddOnes --> [0],oddOnesEvenZeros.

语法是规则的,因为您不必记住已经通过的部分,您只能记住每个部分的当前状态,即四种不同的状态,其中一个(奇数,甚至零)正在接受。作为正则文法,它也是右线性CFG。

【讨论】:

  • 好的,但它的工作方式类似于我的代码。对于 s([0,0,1,0,0],[])。这是错误的:(我认为它应该适用于这种情况
  • 对不起,我在最后一行有错误,右侧的非终结符应该是oddOnesEvenZeros
  • @TomasPastircak +1 用于解释为什么语法是规则的。我认为你错过了 [] 的角落案例,它有偶数个 0s(因为 0 是偶数)。我有一个稍微不同的语法,它使用推回列表来预测下一个数字。
  • 他说 0 的数量应该是偶数,而 1 的数量应该是奇数 - 这意味着例如1, 100, 010, 111,11100 等。如果我理解不正确,请纠正我。
  • 谢谢你的帮助:) 你是我的主人。我需要帮助解决另一个问题。与此类似,我必须编写正确的线性上下文无关语法,0 和 1 的数量之间的差异是偶数。我将在其他问题中对此进行讨论。
【解决方案2】:

也许是这样的?

s --> [].
s --> even_zeros, s.
s --> odd_ones, s.

even_zeros([0,0], []).
even_zeros, [X] --> [0,0,X], {X \== 0}.
even_zeros --> [0,0], even_zeros.

odd_ones([1], []).
odd_ones, [X] --> [1,X], {X \== 1}.
odd_ones --> [1,1], odd_ones.

我将这个问题解释为要求0s 和1s 序列的语法,其中0s 的连续数始终为偶数,1s 的连续数始终为奇怪。

【讨论】:

  • @Vous 感谢您的关注,我已经相应地更新了代码。
猜你喜欢
  • 2021-09-04
  • 2014-04-26
  • 1970-01-01
  • 1970-01-01
  • 2012-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-23
相关资源
最近更新 更多