81 lines
2.0 KiB
Prolog
81 lines
2.0 KiB
Prolog
% Write a predicate to colpute the sum of two numbers written as a list, without transforming the list in a number.
|
|
% Eg: [1 1 1][2 3 4] -> [3 4 5]
|
|
|
|
% my_append(L:list, E:element, R:list)
|
|
% flow model: (i i o)
|
|
% my_append(l1l2...ln, e) =
|
|
% e, n = 0
|
|
% l1 + my_append(l2l3...ln, e), otherwise
|
|
my_append([], L, L).
|
|
my_append([H|T], L, [H|Result]) :-
|
|
my_append(T, L, Result).
|
|
|
|
% reverse_order(L:list, R:list)
|
|
% flow model: (i o)
|
|
% reverse_order(l1l2...ln) =
|
|
% [], n = 0
|
|
% reverse_order(l2l3...ln) + l1, otherwise
|
|
reverse_order([], []).
|
|
reverse_order([H|T], R) :-
|
|
reverse_order(T, R1),
|
|
my_append(R1, [H], R).
|
|
|
|
% sum(L1:list, L2:list, C:integer, R:list)
|
|
% flow model: (i i i o)
|
|
% sum(l1l2...ln, l1l2...lm, c) =
|
|
% [], n = 0 and m = 0 and c = 0
|
|
% [1], n = 0 and m = 0 and c = 1
|
|
% l1l2...ln, n != 0 and m = 0 and c = 0
|
|
% l1l2...ln + 1, n != 0 and m = 0 and c = 1
|
|
% l1l2...lm, n = 0 and m != 0 and c = 0
|
|
% l1l2...lm + 1, n = 0 and m != 0 and c = 1
|
|
% l1 + l2 + c + sum(l2l3...ln, l2l3...lm, 0), otherwise
|
|
|
|
sum([], [], 0, []).
|
|
sum([], [], 1, [1]).
|
|
sum([H1|T1], [], 0, [H1|T1]).
|
|
sum([], [H2|T2], 0, [H2|T2]).
|
|
sum([H1|T1],[],1,R) :-
|
|
H3 is H1 + 1,
|
|
H3 < 10,
|
|
R = [H3|T1].
|
|
sum([H1|T1],[],1,R) :-
|
|
H3 is H1 + 1,
|
|
H3 >= 10,
|
|
H4 is H3 - 10,
|
|
sum(T1, [], 1, T3),
|
|
R = [H4|T3].
|
|
sum([],[H2|T2],1,R) :-
|
|
H3 is H2 + 1,
|
|
H3 < 10,
|
|
R = [H3|T2].
|
|
sum([],[H2|T2],1,R) :-
|
|
H3 is H2 + 1,
|
|
H3 >= 10,
|
|
H4 is H3 - 10,
|
|
sum([], T2, 1, T3),
|
|
R = [H4|T3].
|
|
sum([H1|T1], [H2|T2], C, [H3|R]) :-
|
|
S is H1 + H2 + C,
|
|
S < 10,
|
|
H3 is S,
|
|
sum(T1, T2, 0, R).
|
|
sum([H1|T1], [H2|T2], C, [H3|R]) :-
|
|
S is H1 + H2 + C,
|
|
S >= 10,
|
|
H3 is S - 10,
|
|
sum(T1, T2, 1, R).
|
|
|
|
|
|
% sum_lists(L1:list, L2:list, R:list)
|
|
% flow model: (i i o)
|
|
% sum_lists(l1l2...ln, l1l2...lm) =
|
|
% reverse_order(sum(reverse_order(l1l2...ln), reverse_order(l1l2...lm)))
|
|
|
|
sum_lists(L1, L2, R) :-
|
|
reverse_order(L1, R1),
|
|
reverse_order(L2, R2),
|
|
sum(R1, R2, 0, R3),
|
|
reverse_order(R3, R).
|
|
|