【问题标题】:Issue with recursion not hitting base case递归未达到基本情况的问题
【发布时间】: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 逻辑。削减表明可能有更好的方法。

标签: recursion prolog dcg


【解决方案1】:

我认为您的问题过于具体,并且您不希望削减。特别是,您不需要“否定”案例:

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
| ?-

【讨论】:

    猜你喜欢
    • 2014-12-14
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 2018-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多