% rozdílový list
z_rozdiloveho(L-[], L).

na_rozdilovy([], X-X).
na_rozdilovy([P|L], [P|DL]-X) :- na_rozdilovy(L, DL-X).

spoj_rozdilove(A-B, B-C, A-C).

% predikat otoc, co otoci dva rozdilove seznamy
% otoc(R?, XR?)
otoc(L, LR) :- otoc1(L, LR-[]).
otoc1([], X-X).
otoc1([H|T], LR-X) :- otoc1(T, LR-[H|X]).

%% naimplementujte frontu
% empty_queue(?Q)
% push(?Q, ?P, ?QP) splnitelný, pokud QP obsahuje nový prvek P na konci fronty Q
% pop(?Q, ?P, ?QP) splnitelný, pokud jestliže fronta Q na začátku obsahovala prvek P a QP jej nyní neobsahuje
empty_queue([]-[]).
push(In - Out, E, [E|IN] - Out).
pop(In - [], E, [] - Out) :-
    reverse(In, [E | Out]).
pop(In - [E | Out], E, In - Out). 