1

我正在尝试为我的课程制定这个简单的 DCG 作业(Prolog)。问题是关于创建 DCG。我已经在我的代码中定义了一个话语宇宙。但是这个问题对我来说有点误导。根据我所阅读和了解的内容,使用我自己的笔记和这个 Learn Prolog Now!- 链接:http ://www.learnprolognow.org/lpnpage.php?pagetype=html&pageid=lpn-htmlse29

可以用 (a^nb^nc^n) 构造一个 DCG。其中 ab 和 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) --> [].
4

2 回答 2

1

我认为“0n1n0n”的意思是“0 n 1 n 0 n ”,即一些零,然后是相同数量的一,然后是相同数量的零。

于 2013-05-22T18:16:59.377 回答
1

DCG 是 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.

当然,您应该会发现这可以轻松解决您的问题。

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

count(T, s(N)) --> [T], count(T, N).
count(_, 0) --> [].
于 2013-05-22T18:40:02.410 回答