我正在尝试打印以列表表示形式写入的2个数字的总和。例如
suma ([5,7,3],[3,1,4],L)
结果应该是:
L=[8,8,7].
这是我到目前为止编写的程序:
add_final(E,[],[E]).
add_final(E,[H|T],[H|T1]):-
add_final(E,T,T1).
invers([],[]).
invers([H|T],L):-
invers(T,L1),add_final(H,L1,L).
sum([],[],T,[T]):-
T=\=0,!.
sum([],[],_,[]):-!.
sum([],[L],T,[L]):-T=0,!.
sum([L],[],T,[L]):-T=0,!.
sum([H1|T1],[H2|T2],T,[Hs|Ts]):-
S=H1+H2+T,
Tn=S div 10,
Hs=S mod 10,
sum(T1,T2,Tn,Ts).
suma(L1,L2,Ls):-
invers(L1,L1i),
invers(L2,L2i),
sum(L1i,L2i,0,Ls).
我的程序输出是:
L = [ (3+4+0)mod 10, (7+1+ (3+4+0)div 10)mod 10, (5+3+ (7+1+ (... + ... + 0)div 10)div 10)mod 10].
发生了什么以及如何解决?
答案 0 :(得分:0)
您应该使用is
而不是=
,因此Prolog会评估公式。否则,它将在不评估数学的情况下比较术语(有关详细信息,请参阅此Wikibook entry)。如果您使用=
,Prolog将使用变量统一公式,而不进行评估。
请参阅:
?- A = 2+5.
A = 2+5.
?- A is 2+5.
A = 7.
所以 - 你的sum
谓词做数学,所以你需要使用is
:
sum([H1|T1],[H2|T2],T,[Hs|Ts]):-
S is H1+H2+T,
Tn is S div 10,
Hs is S mod 10,
sum(T1,T2,Tn,Ts).
此外,结果列表将按相反的顺序排列:
?- suma( [5,7,3],[3,1,4],L ).
L = [7, 8, 8]
您可能希望将其还原为suma
。