
% plus(+S1, +S2, -S1plusS2)
plus(X, 0, X).
plus(0, X, X).
plus(s(X), Y, s(Z)) :- plus(X, Y, Z).

lt(0, s(_)).
lt(s(X), s(Y)) :- lt(X, Y).

minus(X, Y, Z) :- plus(Z, Y, X).

% deleno(A, B, Podil, Zbytek)
deleno(A, B, s(P), Z) :- B = s(_), minus(A, B, A1), deleno(A1, B, P, Z).
deleno(A, B, 0, A) :- B = s(_), lt(A, B).


% normalize(Src, Norm)
normalize1(0, 0).
normalize1(s(0), s(0)).
normalize1(p(0), p(0)).
normalize1(s(p(X)), Y) :- normalize1(X, Y).
normalize1(p(s(X)), Y) :- normalize1(X, Y).
normalize1(s(s(X)), s(Y)) :- normalize1(s(X), Y).
normalize1(p(p(X)), p(Y)) :- normalize1(p(X), Y).

normalize(X, Y) :- normalize1(X, Y), X = Y.
normalize(X, Y) :- normalize1(X, Y1), X \= Y1, normalize(Y1, Y).

