Files
2024-08-31 12:07:21 +03:00

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