我希望此代码输出字母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为正时,解释器会回溯到,从而防止这种情况发生。
任何人都可以解释出现了什么问题吗?感谢
答案 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).