首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DCG的问题(Prolog)

DCG的问题(Prolog)
EN

Stack Overflow用户
提问于 2013-05-22 17:53:15
回答 1查看 460关注 0票数 1

我正试图为我的课程制定这个简单的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”

有人能帮帮我吗?问题到底想要什么?

关于其中一个答案,我尝试了下面的代码,没有运气。

代码语言:javascript
复制
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) --> [].
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-22 18:40:02

DCGs是一个托管在Prolog中的子语言,因此很容易计算出一个终端T。

代码语言:javascript
复制
count(T, N) --> [T], count(T, M), {N is M+1}.
count(_, 0) --> [].

?- phrase(count(a, C), [a,a,a]).
C = 3 ;
false.

当然,你应该发现这可以很容易地解决你的问题。

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

代码语言:javascript
复制
count(T, s(N)) --> [T], count(T, N).
count(_, 0) --> [].
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16698523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档