【发布时间】:2015-04-30 11:15:47
【问题描述】:
我正在尝试使用额外的参数为长度为 2N + 2M 的字符串集 0^N 1^M 2^N+M 定义一个 Prolog DCG,M >= 0。正确字符串的示例是“011222”,但不是“012”。
我已使用以下代码创建此 DCG。
s --> a(N), b(M), c(N), c(M).
a(0) --> [].
a(succ(X)) --> [0], a(X).
b(0) --> [].
b(succ(X)) --> [1], b(X).
c(0) --> [].
c(succ(X)) --> [2], c(X).
当我运行查询时
s([0,1,1,2,2,2], []).
Prolog 按预期返回 true。
但是当我运行时
s(X, []).
Prolog 返回以下内容:
X = []
X = [1,2]
X = [1,1,2,2]
X = [1,1,1,2,2,2]
这些不是有效的字符串。我认为这可能是因为 N 和 M 在 prolog 运行 a 和 b 谓词之前被 c 谓词递减。是这样吗?如何解决?
编辑: 我已经尝试将 s 生产修改为:
s --> a(N), b(M), c(NplusM), {NplusM is N + M}.
但是在运行查询时会出错。
【问题讨论】:
-
产生式有效,您没有排除 N=0。