大小为M的Prolog排列 - 错误:超出全局堆栈

时间:2014-04-11 13:29:16

标签: prolog

我希望此代码输出字母a,b和c的排列(重复)。

letter('a').
letter('b').
letter('c').

f(0,L,L).

f(N,L0,L):-
  append(L0,[X],L1),
  letter(X),
  N1 is N-1,
  f(N1,L1,L).

f(N,L):-
  f(N,[],L).

当我像这样执行时

?- f(3,L).
L = [a, a, a] ;

第一个答案是正确的,但当我尝试回溯更多答案时,我收到错误:

ERROR: Out of global stack

我可以看到错误是因为我的计数器N在回溯时从0递减到-1,但我认为当N为正时,解释器会回溯到,从而防止这种情况发生。

任何人都可以解释出现了什么问题吗?感谢

1 个答案:

答案 0 :(得分:2)

f/3的递归调用会随着N值的不断下降而发生,而不会检查它是否为非负数。尝试:

f(N, L0, L):-
    N >= 0,              % add this
    append(L0, [X], L1),
    letter(X),
    N1 is N-1,
    f(N1, L1, L).