如何确定列表表示序言中写的2个数字的总和

How to determine the sum of 2 numbers written in list representation prolog

我正在尝试打印列表 representation.For 中 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].

这是怎么回事,如何解决?

您应该使用 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 中恢复它。