我正在尝试为我的课程制定这个简单的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) --> [].
答案 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) --> [].