如何确定列表表示序言中写的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
中恢复它。
我正在尝试打印列表 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
中恢复它。