如何确定列表表示prolog

时间:2015-11-04 15:46:48

标签: prolog

我正在尝试打印以列表表示形式写入的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].

发生了什么以及如何解决?

1 个答案:

答案 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