Prolog没有按预期递归

时间:2014-11-20 00:51:01

标签: recursion prolog

我有一个函数,它接受列表列表,我想将内部列表中的每个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.

感觉它应该有用,但显然我做错了。任何帮助将不胜感激。

1 个答案:

答案 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