sed:- 
 maximum(_,_,St),
 op(St,NSt),
 steny(S),
 member([M,P,NSt],S),
 retract(maximum(_,_,St)),
 asserta(maximum(M,P,NSt)),
 retract(styl(OS)),
 ses_styl(Styl,Pom,yes),
 (Styl==r,MM is -M;MM is M),
 sestav_sed(Styl,[],SedSez,MM,Pom),
 pristav(SedSez).

sestav_sed(Styl,[],Sez,Max,Prost):- 
 free(se,J,_,S,_,_),
 %D<Max, tahle kontrola by mela byt v ass_ses
 S<Prost,
 ass_ses(J,Styl,[0,0,0],0,0,Sour,Max),
 NProst is Prost-S,
 sestav_sed(Styl,[[Sour,J]],Sez,Max,NProst).

sestav_sed(Styl,[[[SX,SY,_],J]],Sez,Max,Prost):-
 free(se,NJ,ND,NS,_,_),
 ses(se,J,D,S,_,_,_),
 not ND>Prost, %vleze se tam jeste neco do L (a Prost uz je zmenseny)
 app_par(NJ,vert,Styl),
 invert(Styl,NStyl),
 NMax is -Max,
 (ass_ses(NJ,NStyl,[SX,SY,0],D,S,NSour,NMax),retract(maximum(MMax,MPx,Ms)),
  ((Ms==n;Ms==w),NMPx is MPx+NS;NMPx is MPx-NS)
  ,asserta(maximum(MMax,NMPx,Ms));
  rem_par(NJ,vert)),%aby to tam nestrasilo
 sestav_sed(Styl,[[NSour,NJ],[[SX,SY,_],J]],Sez,Max,Prost).

sestav_sed(Styl,[[[X,Y,Z],J]|OSez],Sez,Max,Prost):-
 free(se,NJ,_,_,_,_),
 ses(se,J,D,_,_,Par,_),
 member(vert,Par),%tak to muzu zkusit prodlozit
 Pom is D-Y,Pom<Prost, %huraa vleze se to tam
 app_par(NJ,vert),
 ass_ses(NJ,Styl,[X,Y,0],0,D,NSour,Max),
 sestav_sed(Styl,[[NSour,NJ],[[X,Y,Z],J]|OSez],Sez,Max,Prost).

sestav_sed(Styl,Sez,VSez,Max,Prost):-
 free(se,_,_,_,_,_),
 delka(Sez,Delka),  %ted se pokusime pridat taam neco vedle
 maximum(M,_,_),
 Rozdil is M-Delka,
 najdi_d(Rozdil,se,NJ),
 kraj(Sez,Styl,0,K),
 ses(se,_,SD,SS,_,Par,[X,Y,_]),
 (member(vert,Par),Pom is X+SS;Pom is X+SD),Pom==K,
 ass_ses(NJ,Styl,[K,0,0],0,SS,NSour,Max),
 sestav_sed(Styl,[[NSour,NJ]|Sez],VSez,Max,Prost).

sestav_sed(Styl,Sez,VSez,Max,Prost):- % a ted pokus o stolecek
 free(st,J,D,S,V,Par), % pokud tam ovsem je
 dlouha(Sez,DJ,DD),
 ses(se,DJ,DD,DS,_,_,[DX,DY,_]),
 X is DX+(DD-D)/2,
 Y is DY-20-DS,
 ass_ses(J,Styl,[X,Y,0],0,S,NSour,Max),
 sestav_sed(Styl,[[NSour,J]|Sez],VSez,Max,Prost).

sestav_sed(_,Sez,Sez,_,_).

dlouha([[DSour,DJ]],DJ,DD):-
 ses(se,DJ,DD,_,_,_,_).


dlouha([[NSour,NJ]|Sez],DJ,DD):-
 dlouha(Sez,J,D),
 ses(se,NJ,ND,_,_,_,_),
 (ND>D,DD=ND,DJ=NJ;
  DD=D,DJ=J).


invert(r,l).
invert(l,r).

najdi_d(M,Typ,J):- %tohle je idealni pripad, ktery asi hned tak nenastane
 free(Typ,J,D,_,_,_),
 D<M. 
  
najdi_d(M,Typ,J):- %tady se to kdyz tak dava kolmo, ale musi se to jeste zkontrolovat
 free(Typ,J,_,S,_,_),
 S<M,
 app_par(J,vert).
 
rem_par(J,Co):-
 free(T,J,D,S,V,Par),
 retract(free(T,J,D,S,V,Par)),
 remove(Co,Par,NPar),
 asserta(free(T,J,D,S,V,NPar)).

remove(Co,[Co|S],S).
remove(Co,[X|S],[X|NS]):-
 remove(Co,S,NS).

app_par(J,Co,St):-
 free(T,J,D,S,V,Par),
 (St==r,PCo=styl_r;PCo=styl_l),
 retract(free(T,J,D,S,V,Par)),
 asserta(free(T,J,D,S,V,[Co,PCo|Par])).
 
app_par(J,Co):-
 free(T,J,D,S,V,Par),
 styl(St),(St==r,PCo=styl_r;PCo=styl_l),
 retract(free(T,J,D,S,V,Par)),
 asserta(free(T,J,D,S,V,[Co,PCo|Par])).
 
delka(Sez,D):-
 delka(Sez,X,XM),
 D is XM-X.

delka([[Sour,J]],X,M):-
 ses(_,J,D,_,_,_,Sour),
 sour_x(X,Sour),
 M is X+D.

delka([[_,J]|Sez],NX,NXM):-
 delka(Sez,X,XM),
 ses(_,J,D,S,_,Par,[JX,_,_]),
 (member(vert,Par),  % je to tam postaveny vertikalne
  PX is JX+S;not member(vert,Par),PX is JX+D),
 (X<JX,NX is X;not X<JX,NX is JX),
 (PX<XM,NXM is XM;not PX<XM,NXM is PX).

volne(X,Y,A,B):-
 not obsazeno(X,Y,A,B,_).

obsazeno(X1,Y1,X2,Y2,J):-
 ook(_,J,D,S,_,_,[X,Y,_],St),
 ctverec(X,Y,XM,YM,D,S,St),
 prunik(X1,Y1,X2,Y2,X,Y,XM,YM).
 
ctverec(X,Y,XM,YM,PX,PY,St):-
 hor(St),
 XM is X+PX,YM is Y+PY.
 
ctverec(X,Y,XM,YM,PX,PY,_):-
 XM is X+PY,YM is Y+PX.

prunik(X1,Y1,X2,Y2,A1,B1,A2,B2):-
 prunik_i(X1,X2,A1,A2),
 prunik_i(Y1,Y2,B1,B2).
 
prunik_i(X,Y,A,_):-
 X<A,A<Y.

prunik_i(X,Y,_,B):-
 X<B,B<Y.

prunik_i(X,Y,A,B):-
 A<X,Y<B.

op(n,s).
op(s,n).
op(w,e).
op(e,w).
