谁能告诉我序言代码有什么问题?
can anyone tell me what is wrong with my prolog code?
基本上,我想将两个列表分别转换成一个数字,然后将结果数字相加并输出一个表示数字的列表。像 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).
我收到以下错误:
错误:is/2:参数未充分实例化
当我调用 addlistnum() 传递两个列表和一个变量时。如何修复我的代码以达到预期的结果?
我不推荐这种方法,因为你失去了处理任何长度数字的可能性。您可以试试:
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 ).
基本上,我想将两个列表分别转换成一个数字,然后将结果数字相加并输出一个表示数字的列表。像 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).
我收到以下错误: 错误:is/2:参数未充分实例化 当我调用 addlistnum() 传递两个列表和一个变量时。如何修复我的代码以达到预期的结果?
我不推荐这种方法,因为你失去了处理任何长度数字的可能性。您可以试试:
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 ).