我有一个函数,它接受列表列表,我想将内部列表中的每个int模式匹配到特定模式。列表列表中有9个列表(称为A),列表中的每个列表也包含9个整数。我想使用递归来一次遍历每个列表3,并进行适当打印,但我似乎没有超过我的main函数中递归的第一步。 清晰的代码:
print_tail([]).
print_tail([A,B,C|Ts]) :-
write('print_tail called'), nl,
print_tail_h(A,B,C),
write('Recursed'), % this never prints
print_tail(Ts). % this never happens
% working, or so it seems
print_tail_h([A1,A2,A3|As],[B1,B2,B3|Bs],[C1,C2,C3|Cs]) :-
printer([A1,A2,A3,B1,B2,B3,C1,C2,C3]),nl,
write('Helper recursed'), nl,
print_tail_h(As, Bs, Cs).
printer([]).
printer([X|Xs]) :-
write(X),
printer(Xs).
我正在调用此函数来测试它:
test_print_tail :-
X = [
[1,2,3,4,5,6,7,8,9],
[1,2,3,4,5,6,7,8,9],
[1,2,3,4,5,6,7,8,9], % stops recursing here
[1,2,3,4,5,6,7,8,9],
[1,2,3,4,5,6,7,8,9],
[1,2,3,4,5,6,7,8,9],
[1,2,3,4,5,6,7,8,9],
[1,2,3,4,5,6,7,8,9],
[1,2,3,4,5,6,7,8,9]],
print_tail(X).
我的输出如下:
print_tail called
123123123
Helper recursed
456456456
Helper recursed
789789789
Helper recursed
false.
我感觉它应该有用,但显然我做错了。任何帮助将不胜感激。
答案 0 :(得分:1)
print_tail_h
以递归方式调用自身,但没有定义基本情况。一旦As,Bs和Cs为空,谓词就会失败,从而导致print_tail
失败。
只需添加另一个子句即可解决此问题:
print_tail_h([],[],[]).
输出:
print_tail called
123123123
Helper recursed
456456456
Helper recursed
789789789
Helper recursed
Recursedprint_tail called
123123123
Helper recursed
456456456
Helper recursed
789789789
Helper recursed
Recursedprint_tail called
123123123
Helper recursed
456456456
Helper recursed
789789789
Helper recursed
Recursed