正确的线性上下文自由语法,偶数为0和1的差异

时间:2014-04-06 20:12:50

标签: prolog context-free-grammar dcg

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

010001 = 4 - 2 = 2 (even)

我有similar problem。也许它会有所帮助!我正试图在prolog上写它。我做了其他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.

它适用于许多情况,但我不确定它是否适用。

1 个答案:

答案 0 :(得分:3)

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

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].