2016-11-20 43 views
1

任务说:数字用列表表示(例如123 = [1,2,3]),写一个谓词,它添加两个这样的数字。 (例如sum([4, 5, 6], [9], [4, 6, 5]))。在序言中添加两个表示数字的列表

我一直在想如何递归地表达这个,但是让我感觉到的是数组大小的变化。看起来,如果数组被恢复,这将是简单的,所以HEAD实际上是最后一个元素。因为对我来说,问题是,我和看起来像这样认为:

[4, 5, 6] 
+ 
    [9] 

代替

[4, 5, 6] 
+ 
     [9] 

可能是什么正确的方法来写这样的断言?我需要一些指针或引用的帮助......

回答

1

这是我实现:

sum(L1,L2,OutL):- 
     reverse(L1,List1),reverse(L2,List2), 
     add_lists(List1,List2,0,List3), 
     reverse(List3,OutL). 

add_lists([],[],0,[]). 
add_lists([],[],1,[1]). 
add_lists([],[H|T],C,[H1|T]):-H1 is H+C. 
add_lists([H|T],[],C,[H1|T]):-H1 is H+C. 
add_lists([H|T],[H1|T1],C,[H2|T2]):-NH is H1+H, 
         (NH > 10 -> NC is 1,H2 is NH+C-10; H2 is NH+C,NC is 0), 
          add_lists(T,T1,NC,T2). 

的想法是扭转名单,以加入合适的岗位,并避免你提到的问题。你也只是保持进位为1,如果加成大于10,您减少10.

实施例:

?- sum([4, 5, 6], [9], L). 
L = [4, 6, 5] ; 
false.