2016-11-20 1 views
1

Die Aufgabe sagt: die Zahlen werden durch Listen dargestellt (z. B. 123 = [1, 2, 3]), schreiben Sie ein Prädikat, das zwei solche Zahlen hinzufügt. (z.B. sum([4, 5, 6], [9], [4, 6, 5])).Hinzufügen von zwei Listen, die Zahlen in Prolog darstellen

Ich habe darüber nachgedacht, wie ich das rekursiv ausdrücken kann, aber was mich stört ist, wenn die Größen der Arrays variieren. Es scheint, dass dies einfach wäre, wenn die Arrays umgekehrt würden, so dass HEAD eigentlich das letzte Element ist. Da das Problem für mich ist, dass meine Summe so, dass aussieht:

[4, 5, 6] 
+ 
    [9] 

statt

[4, 5, 6] 
+ 
     [9] 

Was könnte die richtige Art und Weise sein, wie Prädikat zu schreiben? Ich brauche einige Hinweise oder Referenz für die Hilfe ...

Antwort

1

Hier ist meine Implementierung:

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). 

Die Idee ist, Listen, um Reverse richtigen Positionen hinzufügen und vermeiden Sie das Problem bezeichnet. Auch halten Sie gerade einen Übertrag, die 1 ist, wenn eine Zugabe von mehr als 10, wo Sie 10.

Beispiel reduzieren:

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