2015-11-04 48 views
2

我想打印写在名单representation.For例如2号的总和如何判断写在列表表示序言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

您应该使用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

+0

非常感谢! – Nero