DCG(Prolog)的问题

DCG(Prolog)的问题,prolog,dcg,Prolog,Dcg,我正在努力为我的课程做这个简单的DCG作业(Prolog)。问题在于创建一个DCG。我已经在我的代码中定义了一个话语的宇宙。但这个问题对我来说有点误导。根据我所读到的和知道的,用我自己的笔记和这个现在就学习序言吧链接: 可以使用(a^nb^nc^n)构造DCG。其中a、b和c为普通字母,n为该字母要乘以的数字。不过,我的问题是这样的 “设计并实现DCG以识别(或生成)语言0n1n0n。” 谁能帮帮我吗?这个问题到底想要什么 关于其中一个答案,我尝试了以下代码,但没有成功 s --> [].

我正在努力为我的课程做这个简单的DCG作业(Prolog)。问题在于创建一个DCG。我已经在我的代码中定义了一个话语的宇宙。但这个问题对我来说有点误导。根据我所读到的和知道的,用我自己的笔记和这个现在就学习序言吧链接:

可以使用(a^nb^nc^n)构造DCG。其中a、b和c为普通字母,n为该字母要乘以的数字。不过,我的问题是这样的

“设计并实现DCG以识别(或生成)语言0n1n0n。”

谁能帮帮我吗?这个问题到底想要什么

关于其中一个答案,我尝试了以下代码,但没有成功

s --> [].
s(M) --> a(M),b(M),c(M).

a --> [].
a(New) --> [0], a(Cnt),{New is Cnt+1}.

b --> [].
b(New) --> [1], b(Cnt),{New is Cnt+1}.

c --> [].
c(New) --> [0], c(Cnt),{New is Cnt+1}.

count(T, N) --> [0,1,0], count(T, M), {N is M+1}.
count(_, 0) --> [].

我认为“0n1n0n”的意思是“0n1n0n”,也就是说一些零,后面跟相同数量的一,然后再跟相同数量的零。

DCGs是Prolog中的一个子语言,因此很容易计算终端T的出现次数

count(T, N) --> [T], count(T, M), {N is M+1}.
count(_, 0) --> [].

?- phrase(count(a, C), [a,a,a]).
C = 3 ;
false.
当然,你应该发现这可以很容易地解决你的问题

编辑:我错过了生成部分。由于内置的算术运算,计数//2不适用于生成。使用后继符号,代码也可以用作生成器:

count(T, s(N)) --> [T], count(T, N).
count(_, 0) --> [].

我会努力的!非常感谢,我已经尝试了你的第一段代码。然而,问题就在这里。我想计算(例如)0,0,0,1,1,1,0,0,0,而不是0,1,0,0,0,1,0。有关代码,请参阅我的更新帖子。
s-->[]。
没有用<代码>a-->[]。应该是
a(0)-->[]。
等。正如我在编辑部分发布的,这些更改也将需要用于生成部分。我会尝试让您知道!谢谢让你知道,我遵循了学习序言中的例子!链接我也尝试过:s-->a,s,b,s,c。它与[a,b,c]完美配合,但是当我输入[a,a,b,b,c,c]时,它会导致错误。