使用额外参数

时间:2015-04-30 11:15:48

标签: prolog dcg

我正在尝试使用额外参数为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}.

但是在运行查询时会出错。

1 个答案:

答案 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).