我正在尝试使用额外参数为N,M> = 0的字符串0 ^ N 1 ^ M 2 ^ N + M定义Prolog DCG,长度为2N + 2M。正确字符串的一个例子是" 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]
这些不是有效的字符串。我认为这可能是因为在prolog运行a和b谓词之前N和M正在被c谓词递减。是这样的吗?怎么能解决这个问题?
编辑: 我已经尝试将生产修改为:
s --> a(N), b(M), c(NplusM), {NplusM is N + M}.
但是在运行查询时会出错。
答案 0 :(得分:1)
您滥用succ / 2,可能是因为您希望Prolog 在头部模式中评估函数。它没有。然后,尝试用
替换您的规则Object.keys
等等
编辑因为succ / 2需要至少一个实例化为整数的参数,我们可以向DCG条目提供N,M,或者使用CLP(FD):
a(0) --> [].
a(Y) --> {succ(X,Y)}, [0], a(X).
但仍然列出'必须提供长度。例如
:- use_module(library(clpfd)).
s --> a(N), b(M), c(N), c(M).
a(0) --> [].
a(Y) --> {Y #= X-1}, [0], a(X).
b(0) --> [].
b(Y) --> {Y #= X-1}, [1], b(X).
c(0) --> [].
c(Y) --> {Y #= X-1}, [2], c(X).