sestav(Sez) :-
 styl(r),maximum(M,_,_),
 MM is -M,
 stena(MM,r,[],Sez),
 asserta(sestava(Sez)).

sestav(Sez) :-
 styl(l),maximum(M,_,_),
 stena(M,l,[],Sez),
 asserta(sestava(Sez)).

%predpokladame serazzeny nabytek: Skrine, ... ;nejvyssi, nejsirsi,....

stena(Max,Styl,[],Sez):-
 free(s,Jmeno,D,_,_,Par),
 member(zem,Par),
 (Styl==r,ass_ses(Jmeno,r,[0,0,0],D,0,Sour,Max);
  ass_ses(Jmeno,l,[0,0,0],0,0,Sour,Max)),
 stena(Max,Styl,[[Sour,Jmeno]],Sez).

stena(Max,Styl,[[Sour,Jmeno]],VSez):- %zatim druha vec
 free(s,Jmeno2,_,_,_,Par2),
 member(zem,Par2),
 ses(_,Jmeno,D,_,_,_,_),
 sour_x(X,Sour),
 ass_ses(Jmeno2,Styl,[X,0,0],D,0,NSour,Max),
 stena(Max,Styl,[[NSour,Jmeno2],[Sour,Jmeno]],VSez).

stena(Max,Styl,Sez,VSez):-
%   nejprve jestli tam neni moc velka mezera
 free(s,_,_,_,_,_),
 two_head([Sour2,Jmeno2],[Sour1,_],Sez),
 ses(s,Jmeno2,D2,S2,_,Par2,Sour2),
 member(nato,Par2),
 sour_z(Z,Sour2),sour_z(Z1,Sour1),
 Mezera is Z1-Z,Mezera>0,		% je tam mezera a tak tam zkusime neco strcit
 najdi(Mezera,NJmeno,D2),
 free(s,NJmeno,_,NS,_,_),
 S2>=NS,					% aby to na to slo vubec postavit
 (Styl==r,sour_x(X,Sour1);sour_x(X,Sour2)),
 sour_y(Y,Sour2),
 ass_ses(NJmeno,Styl,[X,Y,Z],0,0,NSour,Max),
 add_sez(Sez,NJmeno,NSour,NSez),
 stena(Max,Styl,NSez,VSez).


stena(Max,Styl,Sez,VSez):-
 free(s,_,_,_,_,_),
 % tak a ted se to pokusime rossirit
 kraj(Sez,Styl,0,K),	%najde krajni hodnotu.
 free(s,NJmeno,_,_,_,NPar),
 member(zem,NPar),
 ass_ses(NJmeno,Styl,[K,0,0],0,0,NSour,Max),
 stena(Max,Styl,[[NSour,NJmeno]|Sez],VSez).


%ale jeste se muze stat ze se to tam stejne neveze
%stena(Max,Styl,Sez,VSez):-
% free(Typ,Jmeno,D,S,V,Par), %  <-- tak tam budeme pridavat tohle
% kam(
 


stena(_,_,A,A). 


kraj([[S,_]|Y],r,P,K):-
 sour_x(X,S),X<P,
 kraj(Y,r,X,K).

kraj([_|Y],r,P,K):-
 kraj(Y,r,P,K).


kraj([[S,J]|Y],l,P,K):-
 ses(_,J,D,_,_,_,S),
 sour_x(X,S),PP is X+D,PP>P,
 kraj(Y,l,PP,K).

kraj([_|Y],l,P,K):-
 kraj(Y,l,P,K).

kraj([],_,K,K). 



add_sez([A,B|Z],NJ,NS,[[NS,NJ],B,A|Z]).

najdi(Mezera,Jmeno,JD):-
 free(_,Jmeno,D,_,V,Par),
 not member(zem,Par), %ono by bylo lepsi kdyby to sezralo nejdrive 
 		      %veci co se nedaaji dat na zem 
 V<Mezera,
 D==JD.

najdi(Mezera,Jmeno,JD):-
 free(s,Jmeno,D,_,V,_),
 V<Mezera,
 D==JD.


najdi(Mezera,Jmeno,JD):-
 free(s,Jmeno,D,_,V,_),
 V<Mezera,
 D<JD.

add(X,Y,[X|Y]).

head(X,[X|_]).
two_head(X1,X2,[X1,X2|_]).
sour_x(X,[X,_,_]).
sour_y(Y,[_,Y,_]).
sour_z(Z,[_,_,Z]).
%ass_ses(Jmeno,Styl,[X,Y,Z],Ox,Oy,[NX,NY,NZ],Max) 
% Jmeno veci, ktera se pridava, styl pridani, [X,Y,Z], vec ke ketre se to stavi
% a rozmery ktere pripdaji v uvahu
%a jeste kontrolka na Max

ass_ses(Jmeno,r,[X,Y,Z],Ox,Oy,[NX,NY,NZ],Max):-
 free(Typ,Jmeno,D,S,V,Par),
% Ox>0, % jako ze zmena X
 (member(vert,Par),(Ox>0,NX is X-S;NX is X),NY is Y-Oy;NX is X-D,NY is Y),
 not NX<Max,
 NZ is Z+V,
 retract(free(Typ,Jmeno,D,S,V,Par)),
 asserta(ses(Typ,Jmeno,D,S,V,Par,[NX,NY,NZ])).
 
ass_ses(Jmeno,l,[X,Y,Z],Ox,Oy,[NX,NY,NZ],Max):-
 free(Typ,Jmeno,D,S,V,Par),
 (member(vert,Par),NX is X,NY is Y-Oy;
  NX is X+Ox,NY is Y),
 not NX>Max, NZ is Z+V,
 retract(free(Typ,Jmeno,D,S,V,Par)),
 asserta(ses(Typ,Jmeno,D,S,V,Par,[NX,NY,NZ])).



%mistnost(420,350,250).
%maximum(420,e,0).
%sestava([]).
%sestava(_).
%styl(l).
%zaklad(yo).
%
%free(s,satnik,100,60,200,[zem,otevrit_c,nato]).
%free(s,skrin1,100,45,50,[zem,otevrit_c,nato]).
%free(s,skrin2,100,45,50,[zem,otevrit_c,nato]).
%free(s,skrinka,100,30,45,[zem,otevrit_c,nato]).
%free(s,skrinka2,100,30,45,[zem,otevrit_c,nato]).
%free(s,polic,100,30,45,[otevrit_c,nato,sklo]).
%free(s,polic1,100,30,45,[otevrit_c,nato]).

