我正试图为我的课程制定这个简单的DCG作业(Prolog)。问题在于创建一个DCG。我已经在我的代码中定义了一个话语的宇宙。但这个问题对我来说有点误导。根据我所读到的和知道的,使用我自己的笔记和这个现在学习Prolog!-链接:http://www.learnprolognow.org/lpnpage.php?pagetype=html&pageid=lpn-htmlse29
可以用(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) --> [].发布于 2013-05-22 18:40:02
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) --> [].https://stackoverflow.com/questions/16698523
复制相似问题