递归问题没有达到基本情况

时间:2014-12-19 21:55:56

标签: recursion prolog dcg

我正在研究以下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而失败。任何猜测?

1 个答案:

答案 0 :(得分:1)

我认为你的问题过于明确,而且你不想要削减。特别是,你不需要&#34;否定&#34;情况下:

zero(N) -->
    {
        N < 1
    },
    [],
    !.

这将成为你认为的失败案例。

相反,尝试一些更简单的事情:

zero(1) --> [0].
zero(N) --> { N > 1, M is N - 1 }, [0], zero(M).

这仅定义了积极的情况。所有其他案件都失败了所以:

| ?- phrase(zero(5), A).

A = [0,0,0,0,0]

yes
| ?- phrase(zero(2), [0,0]).

yes
| ?- phrase(zero(5), [0,0]).

no
| ?-