Prolog 右线性上下文无关文法

Prolog 右线性上下文无关文法,prolog,grammar,context-free-grammar,dcg,Prolog,Grammar,Context Free Grammar,Dcg,我有个问题。我必须用alphapet={0,1}编写正确的线性上下文无关语法,其中0的数字是偶数,od1的数字是奇数。我试着写些东西,但没用 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

我有个问题。我必须用alphapet={0,1}编写正确的线性上下文无关语法,其中0的数字是偶数,od1的数字是奇数。我试着写些东西,但没用

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没有终端,可能是这样的

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.
我把这个问题解释为要求一个
0
s和
1
s序列的语法,其中连续
0
s的数量总是偶数,而连续
1
s的数量总是奇数。

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.

语法是规则的,因为您不必记住已经传递的部分,您只能记住每个部分的当前状态,即四个不同的状态,其中一个(奇数1,偶数0)是可接受的。作为常规语法,它也是正确的线性CFG。

语法应该接受什么,偶数还是奇数?还是1/0的偶数/奇数?这两种语法听起来都像规则语法,而不是上下文无关的…@Tomaspatircak你能解释一下为什么这些语法是规则的吗?那会很有帮助的!好的,但它的工作类似于我的代码。对于s([0,0,1,0,0],])。这是错误的:(我认为它应该适用于这种情况对不起,我在最后一行有一个错误,右边的非终结符应该是oddOnesEvenZeros@TomasPastircak+1用于解释语法为什么是规则的。我认为您缺少了包含偶数个
0
s的角格
[]
(因为
0
是一个偶数)。我有一个稍微不同的语法,它使用后推列表展望下一个数字。他说0的数量应该是偶数,1的数量应该是奇数-这意味着,例如,1100、010、111100等。如果我理解不正确,请纠正我。谢谢你的帮助:)你是我的主人。我还需要一个问题的帮助。与此类似,我必须编写正确的线性上下文无关语法。0和1的数量之间的差异是相等的。我将在其他问题中对此进行说明。@谢谢你的注意,我已相应地更新了代码。