maxim(M):-
 maximum(M).
maxim(M):-
 mistnost(Delka,Sirka,_),
 zpracuj(n,0,Delka), 
 zpracuj(s,Sirka,Delka), 
 zpracuj(w,0,Sirka), 
 zpracuj(e,Delka,Sirka), 
 steny(Sez),
 retract(steny(Sez)),
 reverse(Sez,RSez),
 asserta(steny(RSez)),
 nte_max(RSez,1,[M,P,St]),
 asserta(maximum(M,P,St)).

nte_max([M|_],1,M).
 
nte_max([_|Sez],N,M):-
 NN is N-1,
 nte_max(Sez,NN,M).

zpracuj(St,Def_Y,D):-
 z(St,Def_Y,[v,0],Sez),
 add_to_tail([o,D],Sez,NSez),
 add_steny(St,NSez).

add_to_tail(S,[X|Sez],[X|NSez]):-
 add_to_tail(S,Sez,NSez).

add_to_tail(S,[],S).

add_steny(St,Sez):-
 zmen_seznam(St,-1,Sez,NSez),
 steny(S),
 append(S,NSez,VSez),
 sort(VSez,O),
 retract(steny(S)),
 asserta(steny(O)).

zmen_seznam(St,-1,[v,X|Sez],NSez):-
 zmen_seznam(St,X,Sez,NSez).

zmen_seznam(St,X,[o,OX|Sez],[[NX,X,St]|NSez]):-
 NX is OX-X,
 zmen_seznam(St,-1,Sez,NSez).

zmen_seznam(St,-1,[o,_|Sez],NSez):-
 zmen_seznam(St,-1,Sez,NSez). 
 
zmen_seznam(_,_,[],[]).

get_max([v,X,o,XX|Sez],D,Max):-
 NMax=XX-X,
 get_max(Sez,D,M),
 (NMax>M,Max is NMax;Max is M). 
get_max([o,_|Sez],D,M):-
 get_max(Sez,D,M).

get_max([v,X],D,M):-
 M is D-X.
 
get_max([],_,0).

z(St,Def,Sez,VSez):-
 dvere(J,X,Y,S),
 (hor(St),Y==Def, % je to na spravnem miste
 add_zpracuj(X,S,Sez,NSez);
  not hor(St),X==Def,add_zpracuj(Y,S,Sez,NSez)),
 retract(dvere(J,X,Y,S)),
 asserta(dver(J,X,Y,S,St)),
 z(St,Def,NSez,VSez).

z(St,Def,Sez,VSez):-
 okno(J,X,Y,Z,S),
 (hor(St),Y==Def, % je to na spravnem miste
 add_zpracuj(X,S,Sez,NSez);
  not hor(St),X==Def,add_zpracuj(Y,S,Sez,NSez)),
 retract(okno(J,X,Y,Z,S)),
 asserta(vokno(J,X,Y,Z,S,St)),
 z(St,Def,NSez,VSez).


%z(n,Def,Sez,VSez):-
 %dvere(J,X,Y,S),
 %X==Def, % je to na spravnem miste
 %add_zpracuj(Y,S,Sez,NSez),
 %retract(dvere(J,X,Y,S)),
 %z(n,Def,NSez,VSez).

z(_,_,S,S).

 
 
add_zpracuj(X,S,[v,XP],[v,XP,o,X,v,NX]):-
 NX is X+S. 
 
add_zpracuj(X,S,[v,VX,o,OX|Sez],[v,VX,o,X|Sez]):-
 X>VX,PX is X+S,PX==OX.

add_zpracuj(X,S,[v,VX,o,OX|Sez],[v,VX,o,X,v,NX,o,OX|Sez]):-
 X>VX,X+S<OX,NX is X+S.
   
add_zpracuj(X,S,[v,X,o,OX|Sez],[o,X,v,NX,o,OX|Sez]):-
 NX is X+S.

add_zpracuj(X,S,[V,OX|Sez],[V,OX|VSez]):-
 add_zpracuj(X,S,Sez,VSez). 

max(X,[A|Sez]):-
 max(Y,Sez),
 (Y<A,X is A;X is Y).

max(X,[X]).


% a jeste urcime styl
styluj(NS):-
 ses_styl(S,_,yes),
 maximum(_,_,St),
 set_styl(St,A,S,no),
 prostor(A,St,MM),
 free(_,_,_,Hl,_,_),
 (Hl<MM,NS=S;
 zmensi_maximum,
 retract(styl(S)),
 styluj(NS)).
  
zmensi_maximum:-
 maximum(M,PX,St),
 steny(Sez),
 nasl_vec([M,PX,St],[NM,NP,NS],Sez),
 retract(maximum(M,PX,St)),
 asserta(maximum(NM,NP,NS)).
 
nasl_vec([M,P,S],[NM,NP,NS],[[M,P,S],[NM,NP,NS]|_]).
nasl_vec([M,P,S],[NM,NP,NS],[_|Sez]):- 
 nasl_vec([M,P,S],[NM,NP,NS],Sez). 

ses_styl(S,500,_):-
 styl(S). 

ses_styl(S,Pr,Y):-
 maximum(M,0,St), % je to od kraje do kraje
 hor(St),
 mistnost(M,_,_),prostor(w,St,M1),prostor(e,St,M2),
 (M1>M2,set_styl(St,w,S,Y),Pr is M1;set_styl(St,e,S,Y),Pr is M2).

ses_styl(S,Pr,Y):-
 maximum(M,0,St), % je to od kraje do kraje
 mistnost(_,M,_),prostor(n,St,M1),prostor(s,St,M2),
 (M1>M2,set_styl(St,n,S,Y),Pr is M1;set_styl(St,s,S,Y),Pr is M2).

ses_styl(S,P,Y):-
 maximum(_,0,St), % je to od kraje ale ne do kraje
 (set_styl(St,n,S,Y),prostor(n,St,P);
  set_styl(St,w,S,Y),prostor(w,St,P)).

ses_styl(S,P,Y):-
 maximum(M,PX,St), % je to do kraje
 (hor(St),mistnost(X,_,_);mistnost(_,X,_)),
 A is M+PX,A==X,
 (set_styl(St,s,S,Y),prostor(s,St,P);
  set_styl(St,e,S,Y),prostor(e,St,P)).

ses_styl(l,0,Y):-
 set_styl(_,_,l,Y). % a jinak je to jedno

prostor(Stena,U,M):-
 (U==n;U==w), % zajima nas prvni vec tj:
 steny(Sez),
 member([M,0,Stena],Sez).

prostor(Stena,U,M):-
 (U==s,mistnost(_,A,_);U==e,mistnost(A,_,_)),
 steny(Sez),
 member([M,X,Stena],Sez),
 P is M+X,P==A.


set_styl(n,w,l,Y):- (Y==yes,asserta(styl(l));!). 
set_styl(n,e,r,Y):- (Y==yes,asserta(styl(r));!). 
set_styl(s,w,r,Y):- (Y==yes,asserta(styl(r));!). 
set_styl(s,e,l,Y):- (Y==yes,asserta(styl(l));!). 
set_styl(w,n,r,Y):- (Y==yes,asserta(styl(r));!). 
set_styl(w,s,l,Y):- (Y==yes,asserta(styl(l));!). 
set_styl(e,n,l,Y):- (Y==yes,asserta(styl(l));!). 
set_styl(e,s,r,Y):- (Y==yes,asserta(styl(r));!). 

hor(n).
hor(s).
vert(w).
vert(e). 
  
mistnost(420,350,250).

steny([]).
%dvere(Jmeno,X,Y,Sirka)
%dvere(kuchyn,110,350,90).
%dvere(ven,420,45,120).
%dvere(balkon,0,180,90).
%okno(Jmeno,X,Y,Z,Sirka)
%okno(o,0,70,100,110).
maximum(_):-fail.
%okne(_,_,_,_,_):-fail.
%dvere(_,_,_,_):-fail.
