【发布时间】:2014-12-20 06:13:33
【问题描述】:
我正在开发以下 DCG:
zero(1) -->
[0],
!.
zero(N) -->
{
N < 1
},
[],
!.
zero(N) -->
zero(1),
{
M is N - 1
},
zero(M).
它适用于正面测试用例,例如
?- phrase(zero(5), A).
A = [0, 0, 0, 0, 0].
?- phrase(zero(2), [0,0]).
true.
但是当我运行负面案例时(通常类似于 phrase(zero(5), [0,0]).),它就会进入遗忘状态。奇怪的是,在跟踪过程中,似乎每当它在递归期间转到第三个子句中的零(1)行时,它都不会转到基本情况(第一个子句),而是跳转到第二个并且因为 N = 1 而失败。有什么猜测吗?
【问题讨论】:
-
您是否尝试过使用
trace?此外,尝试重新考虑您的 DCG 逻辑。削减表明可能有更好的方法。