谁能告诉我我的prolog代码有什么问题?

时间:2015-07-04 09:59:42

标签: list prolog

基本上,我想将两个列表转换为数字,然后添加结果数字并输出表示数字的列表。像add([2,2,2,2],[3,3,3],X)一样,X = [2,5,5,5]。在内部,[2,2,2,2]和[3,3,3]转换为2222和333,添加到2555.这是我的代码,它不起作用。

addlistnum([],[],X).
addlistnum([B|C],[D|E],X) :-
   X is Y + F,
   digits([B|C],Y),
   digits([D|E],F).

digits(Num1,List) :-
   digits(0, List,Num1).

digits(Num1, [], Num1).
digits(N, [B|As],Num1) :-
   N1 is N * 10 + B,
   digits(N1, As,Num1).

我收到以下错误: 错误:是/ 2:参数没有充分实例化  当我调用addlistnum()传递两个列表和一个变量时。如何修复我的代码以达到预期的效果?

1 个答案:

答案 0 :(得分:1)

我不推荐这种方法,因为你失去了处理任何长度数字的可能性。您可以尝试改为:

add(A,B,R) :-
  reverse(A,AR),
  reverse(B,BR),
  addl( AR, BR, 0, RR ),
  reverse( R, RR ).

addl( [], [], 0, [] ).
addl( [], [], 1, [1] ).

addl( [H|Q], [], C, R ) :- addl( [H|Q], [0], C, R ).
addl( [], [H|Q], C, R ) :- addl( [H|Q], [0], C, R ).

addl( [AH|AQ], [BH|BQ], C, [RH|RQ] ) :-
  RH is (AH+BH+C) rem 10,
  C2 is (AH+BH+C) div 10,
  addl( AQ, BQ, C2, RQ ).