% s - setridi "pole" predikatu free/6.
setrid:-
 setr([],Sez),
% reverse(Sez,NSez),
 ass_all(free,Sez).

ass_all(free,[[T,J,D,S,V,Par]|Sez]):-
 ass_all(free,Sez),
 asserta(free(T,J,D,S,V,Par)).

ass_all(_,[]).


setr(Sez,VSez):-
 free(T,J,D,S,V,Par),
 retract(free(T,J,D,S,V,Par)),
 m_add([T,J,D,S,V,Par],Sez,NSez),
 setr(NSez,VSez).

setr(A,A).  


m_add([T,J,D,S,V,Par],[[OT,OJ,OD,OS,OV,OPar]|Sez],[[T,J,D,S,V,Par],[OT,OJ,OD,OS,OV,OPar]|Sez]):-
 typ(T,OT).	%nova ma lepsi typ
m_add([T,J,D,S,V,Par],[[OT,OJ,OD,OS,OV,OPar]|Sez],[[OT,OJ,OD,OS,OV,OPar]|VSez]):-
 typ(OT,T),	%nova ma horsi typ
 m_add([T,J,D,S,V,Par],Sez,VSez).

% stejnej typ ale nejdriv na zem
m_add([T,J,D,S,V,Par],[[OT,OJ,OD,OS,OV,OPar]|Sez],[[T,J,D,S,V,Par],[OT,OJ,OD,OS,OV,OPar]|Sez]):-
 member(zem,Par),
 not member(zem,OPar).
m_add([T,J,D,S,V,Par],[[OT,OJ,OD,OS,OV,OPar]|Sez],[[OT,OJ,OD,OS,OV,OPar]|VSez]):-
 member(zem,OPar), %ale ta stara jde na zem
 not member(zem,Par),
 m_add([T,J,D,S,V,Par],Sez,VSez).

%stejneej typ ale televize 
m_add([T,J,D,S,V,Par],[[OT,OJ,OD,OS,OV,OPar]|Sez],[[T,J,D,S,V,Par],[OT,OJ,OD,OS,OV,OPar]|Sez]):-
 member(tel,Par),
 not member(tel,OPar).
m_add([T,J,D,S,V,Par],[[OT,OJ,OD,OS,OV,OPar]|Sez],[[OT,OJ,OD,OS,OV,OPar]|VSez]):-
 member(tel,OPar),
 not member(tel,Par),
 m_add([T,J,D,S,V,Par],Sez,VSez).

%tak a ted ma nova stejny typ
m_add([T,J,D,S,V,Par],[[OT,OJ,OD,OS,OV,OPar]|Sez],[[T,J,D,S,V,Par],[OT,OJ,OD,OS,OV,OPar]|Sez]):-
 V>OV.	%nova je vetsi
m_add([T,J,D,S,V,Par],[[OT,OJ,OD,OS,OV,OPar]|Sez],[[OT,OJ,OD,OS,OV,OPar]|VSez]):-
 OV>V, 	%ale ta nova je nizzsi
 m_add([T,J,D,S,V,Par],Sez,VSez).

%tak a ted ma nova stejny typ a vysku
m_add([T,J,D,S,V,Par],[[OT,OJ,OD,OS,OV,OPar]|Sez],[[T,J,D,S,V,Par],[OT,OJ,OD,OS,OV,OPar]|Sez]):-
 S>OS.	%nova je hlubsi(sirsi)
m_add([T,J,D,S,V,Par],[[OT,OJ,OD,OS,OV,OPar]|Sez],[[OT,OJ,OD,OS,OV,OPar]|VSez]):-
 OS>S, 	%ale ta nova ma mensi sirku
 m_add([T,J,D,S,V,Par],Sez,VSez).

%tak a ted ma nova stejny typ a vysku a sirku
m_add([T,J,D,S,V,Par],[[OT,OJ,OD,OS,OV,OPar]|Sez],[[T,J,D,S,V,Par],[OT,OJ,OD,OS,OV,OPar]|Sez]):-
 D>OD.	%nova je delsi
m_add([T,J,D,S,V,Par],[[OT,OJ,OD,OS,OV,OPar]|Sez],[[OT,OJ,OD,OS,OV,OPar]|VSez]):-
 OD>D, 	%ale ta nova je kratsi
 m_add([T,J,D,S,V,Par],Sez,VSez).


%jinak je to jedno a muze to prijit pred
m_add(V,Sez,[V|Sez]).

m_add(V,[],[V]).
typ(s,T):- not T==s.
typ(se,T):- not T==s, not T==se.
typ(st,z).
typ(st,p).
typ(z,p).
% typy: s(skrin),se(sedacka),st(stul),z(zidle),p(postel)
