Prolog 右线性上下文无关文法,偶数差为0';s和1';s

Prolog 右线性上下文无关文法,偶数差为0';s和1';s,prolog,context-free-grammar,dcg,Prolog,Context Free Grammar,Dcg,我试图写一个正确的线性上下文无关语法,其中0和1的数字之间的差异应该是偶数。例如: 010001 = 4 - 2 = 2 (even) 我吃了一顿饭。也许会有帮助!我想把它写在序言里。我做了另外10个练习,但这对我来说太难了。有什么办法吗 我的代码 s --> []. s --> [1],a. s --> [0],b. a --> [1],s. a --> [0],c. b --> [1],c. b --> [0],s. c --> [].

我试图写一个正确的线性上下文无关语法,其中0和1的数字之间的差异应该是偶数。例如:

010001 = 4 - 2 = 2 (even)
我吃了一顿饭。也许会有帮助!我想把它写在序言里。我做了另外10个练习,但这对我来说太难了。有什么办法吗

我的代码

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

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

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

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

这在很多情况下都是有效的,但我不确定它是否有效。

这个问题可以通过一点数学大大简化

a
为0的数字,
b
-为1的数字,
n
-为单词的长度。我们希望abs(a-b)是均衡的

计算一下:

a + b = n
b = n - a
a - b = a - n + a = 2*a - n
2*a
总是偶数,因此
abs(a-b)
是偶数,如果
n
是偶数

因此,任务实际上只是检查单词的长度是否相等

解决方案:

s --> [].
s --> digit, digit, s.
digit --> [0].
digit --> [1].

stackoverflow的人不做家庭作业。如果你对你的锻炼有疑问,你应该告诉我们你到目前为止尝试了什么,以及哪些没有达到预期效果。你是对的!最简单的解决方案最难发明。