DCG的问题(Prolog)

时间:2013-05-22 17:53:16

标签: prolog dcg

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

可以用(a ^ nb ^ nc ^ n)构建DCG。其中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) --> [].

2 个答案:

答案 0 :(得分:1)

我认为“0n1n0n”表示“0 n 1 n 0 n ”,即一定数量的零,后跟相同数量的零之后再次使用相同数量的零。

答案 1 :(得分: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) --> [].