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