首页 > 解决方案 > 我正在尝试使用 DCG 创建一种语言 a^nb^n-1 c^n-2 但无法使 succ(0) 处理 n

问题描述

s(Count) --> a(Count), b(Count), c(Count).

a(0) --> [].
a(succ(Count)) --> [a], a(Count).

b(0) --> [].
b(succ(succ(Count))) --> [b], b(Count).

c(0) --> [].
c(succ(succ(succ(Count)))) --> [c], c(Count).

好吧,很容易为每个规则使用 succ(0) 创建像 a^nb^nc^n 这样的语言,但是当涉及到改变 ab 和 c 的每个块的 n 时,它不起作用。

标签: prologdcgsuccessor-arithmetics

解决方案


查看您的条款,例如:

c(0) --> [].
c(succ(succ(succ(Count)))) --> [c], c(Count).

请注意,您只匹配两种情况——零个或三个字符,但是一两个呢?修改c以考虑每个可接受的长度似乎是一个死胡同,但更容易指定相对于您的s 数量和s 在您控制它们的地方c想要多少 s ,即:abs

s(succ(succ(Count))) --> a(succ(succ(Count))), b(succ(Count)), c(Count).

这自然会转化为您的规范:对于N至少两个,接受N as、N-1 bs 和N-2 cs。

现在其余的很容易就位:

a(0) --> [].
a(succ(Count)) --> [a], a(Count).

b(0) --> [].
b(succ(Count)) --> [b], b(Count).

c(0) --> [].
c(succ(Count)) --> [c], c(Count).

当然,您可以用通用子句替换它们char(Char, Count)(作为练习留下)。

?- phrase(s(succ(succ(succ(0)))), X).
X = [a, a, a, b, b, c].

推荐阅读