% sjednoceni a prunik dvou octree stromu
%
%
% Pravidla pro prunik:
%
prunik([],[],[]).
prunik(S,[],[]).
prunik([],S,[]).
prunik([H1|T1], [H2|T2], [e|TS]):-atom(H1),H1=e,prunik(T1,T2,TS).
prunik([H1|T1], [H2|T2], [e|TS]):-atom(H2),H2=e,prunik(T1,T2,TS).
prunik([H1|T1], [H2|T2], [f|TS]):-atom(H1),H1=f,prunik(T1,T2,TS),atom(H2),H2=f.
prunik([H1|T1], [H2|T2], [e|TS]):-atom(H1),H1=f,prunik(T1,T2,TS),atom(H2),H2=e.
prunik([H1|T1], [H2|T2], [H2|TS]):-atom(H1),H1=f,prunik(T1,T2,TS).
prunik([H1|T1], [H2|T2], [H1|TS]):-atom(H2),H2=f,prunik(T1,T2,TS).
prunik([H1|T1], [H2|T2], [HS|TS]):-prunik(H1,H2,HS),prunik(T1,T2,TS).

%
%
% Pravidla pro sjednoceni
%
sjednoceni([],S,S).
sjednoceni(S,[],S).
sjednoceni([],[],[]).
sjednoceni([H1|T1], [H2|T2], [H2|TS]):-atom(H1),H1=e,sjednoceni(T1,T2,TS).
sjednoceni([H1|T1], [H2|T2], [H1|TS]):-atom(H2),H2=e,sjednoceni(T1,T2,TS).
sjednoceni([H1|T1], [H2|T2], [f|TS]):-atom(H1),H1=f,sjednoceni(T1,T2,TS),atom(H2),H2=f.
sjednoceni([H1|T1], [H2|T2], [f|TS]):-atom(H1),H1=f,sjednoceni(T1,T2,TS),atom(H2),H2=e.
sjednoceni([H1|T1], [H2|T2], [f|TS]):-atom(H1),H1=f,sjednoceni(T1,T2,TS).
sjednoceni([H1|T1], [H2|T2], [f|TS]):-atom(H2),H2=f,sjednoceni(T1,T2,TS).
sjednoceni([H1|T1], [H2|T2], [HS|TS]):-sjednoceni(H1,H2,HS),sjednoceni(T1,T2,TS).

cisteni([],[]).
cisteni([H1|T1],[H1|T2]):-cisteni(T1,T2),atom(H1).
cisteni([H1|T1],[H2|T2]):-cisteni(T1,T2),spojeni(H1,H2).

spojeni([],[]).
spojeni(H1,H1):-member(e,H1),member(f,H1).
spojeni(H1,e):-member(e,H1),not(member(f,H1)).
spojeni(H1,f):-member(f,H1),not(member(e,H1)).

% Cele i s vycistenim:
%
join(S1,S2,S):-sjednoceni(S1,S2,X),cisteni(X,S).
intersection(S1,S2,S):-prunik(S1,S2,X),cisteni(X,S).
